在Next.jsv13.4.12中,我有一个值为app\page.tsx的组件,其中包含一个按钮.当我点击它时,我想让它调用handleClick函数.

但是函数getInitialProps没有被调用,也没有向Page组件发送props ,我该怎么办?

事实上,我希望当页面第一次呈现时,即使我们没有点击按钮,数据也会呈现在页面上.

'use client'
import { useState } from 'React';

export default function Page({ initialData }) {
    const [data, setData] = useState(initialData);

    const fetchData = async () => {
        const req = await fetch('https://randomuser.me/api/?gender=male&results=100');
        const newData = await req.json();

        return setData(newData.results);
    };

    const handleClick = (event) => {
        event.preventDefault();
        fetchData();
    };

    return (
        <Layout>
            <button onClick={handleClick}>FETCH DATA</button>
            {data.map((user) => {
                return (
                    <div>
                        {user.email}
                        <img src={user.picture.medium} alt="" />
                    </div>
                );
            })}
        </Layout>
    );
}

Page.getInitialProps = async () => {
    const req = await fetch('https://randomuser.me/api/?gender=female&results=10');
    const data = await req.json();
    return { initialData: data.results };
};

推荐答案

getServerSidePropsgetStaticProps这样的方法用于获取服务器上的数据,但它们只适用于pages文件夹内的页面组件(在Next.js中设置路由的初始方式).

由于Next.js 13,在app目录中,我们有Server Components个,您可以在其中直接在组件体中获取数据,您想要实现的操作如下所示(请注意创建的附加文件):

// app/page.js ??

import Users from "./users";

export default async function Page() {
  const req = await fetch("https://randomuser.me/api/?gender=female&results=10");
  const data = await req.json();

  return <Users initialUsers={data.results} />;
}

您需要下面的附加组件,因为您需要客户端交互(这里是onClick处理程序),这是上面的服务器Page组件中不具备的.

// app/users.js ??

"use client";

import { useEffect, useState } from "react";

export default function Users({ initialUsers }) {
  const [data, setData] = useState(initialUsers);

  const handleClick = async (event) => {
    event.preventDefault();
    const req = await fetch("https://randomuser.me/api/?gender=male&results=100");
    const newData = await req.json();
    setData(newData.results);
  };

  return (
    <div>
      <button onClick={handleClick}>FETCH DATA</button>
      {data.map((user, index) => {
        return (
          <div key={index}>
            {user.email}
            <img src={user.picture.medium} alt="" />
          </div>
        );
      })}
    </div>
  );
}

否则,因为您的页面已经是顶部有"use client"的客户端组件,所以您可以简单地使用useEffect来加载初始数据,如下所示:

// app/page.js ??

"use client";

import { useEffect, useState } from "react";

export default function Page() {
  const [data, setData] = useState([]);

  const handleClick = async (event) => {
    event.preventDefault();
    const req = await fetch("https://randomuser.me/api/?gender=male&results=100");
    const newData = await req.json();
    setData(newData.results);
  };

  useEffect(() => {
    fetch("https://randomuser.me/api/?gender=female&results=10")
      .then((res) => res.json())
      .then((data) => {
        setData(data.results);
      });
  }, []);

  return (
    <div>
      <button onClick={handleClick}>FETCH DATA</button>
      {data.map((user, index) => {
        return (
          <div key={index}>
            {user.email}
            <img src={user.picture.medium} alt="" />
          </div>
        );
      })}
    </div>
  );
}

Javascript相关问答推荐

以逗号分隔的列表来数组并填充收件箱列表

如何指定1条记录1个表?

在JavaScript中检索一些文本

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

vscode扩展-webView Panel按钮不起任何作用

Plotly热图:在矩形上zoom 后将zoom 区域居中

无法访问Vue 3深度监视器中对象数组的特定对象值'

在使用HighChats时如何避免Datatables重新初始化错误?

Angular 订阅部分相互依赖并返回数组多个异步Http调用

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

扩展类型的联合被解析为基类型

JavaScript是否有多个`unfined`?

如何在Node.js中排除导出的JS文件

如何将zoom 变换应用到我的d3力有向图?

为什么可选参数的顺序会导致问题?

如何在HTMX提示符中设置默认值?

如何组合Multer上传?

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?

如何在Jest中模拟函数

rxjs在每次迭代后更新数组的可观察值