reactjs 使用服务器端属性初始化状态并使用next/link导航时,状态未更新

7hiiyaii  于 2023-04-05  发布在  React
关注(0)|答案(1)|浏览(135)

下面是我的问题的最小可再现示例。我调用getServerSideProps从数据库中获取一些值,该值被设置为组件中的状态。这是因为需要更改值,以便我可以通过API将其发送回数据库。
getServerSideProps中读取URL路径变量,以便从DB中获取适当的数据。
如果我从地址栏加载页面或更改地址栏中的URL或刷新页面,表单工作正常。
但是当我使用next/link导航到下一个页面时,旧的状态不会用新的属性刷新。
是我做错了什么,还是这是一个反模式?
先生:

import Link from "next/link";
import { useState } from "react";

export default function Home(prop: any) {
  const [name, setName] = useState(prop.data.name);
  const handleButtonClick = () => {
    //Send the name state to API.
    //await fakeAPI(name)
  };
  return (
    <>
      <h1>MRE</h1>
      <input
        type="text"
        value={name}
        onChange={(e) => setName(e.target.value)}
      />{" "}
      <button onClick={handleButtonClick}>Send to API</button>
      <div>
        <Link href={`/${prop.index - 1}`}>Back</Link>&nbsp;
        <Link href={`/${prop.index + 1}`}>Next</Link>
      </div>
    </>
  );
}

export function getServerSideProps(context: any) {
  const TEST_DB_DATA = [
    {
      name: "Test 0",
    },
    {
      name: "Test 1",
    },
    {
      name: "Test 2",
    },
  ];
  const index = parseInt(context.params?.data ?? "");
  return {
    props: {
      index,
      data: TEST_DB_DATA[index],
    },
  };
}

问题的GIF:

vlju58qv

vlju58qv1#

我自己解决了这个问题,不确定这是否是一个正确的方法。但我添加了一个事件来检测页面加载,然后使用该事件来设置状态,现在当使用“下一个/链接”时,状态正在改变。

import { useRouter } from "next/router";
...

export default function Home(prop: any) {

  useEffect(() => {
    router.events.on("routeChangeComplete", () => {
      setName(prop.data.name);
    });
  }, [router]);

return ...
...
}

相关问题