javascript - 设置后React状态为空

标签 javascript reactjs fetch next.js react-state-management

我有一个简单的 nextjs 应用程序,我想在其中保存状态并将其打印到 fetchData

这是我的代码

const Room = () => {
  const router = useRouter();
  const [fetchData, setFetchData] = useState("");

  useEffect(() => {
    if (router.asPath !== router.route) {
      getDataNames();
      console.log(fetchData); // Empty
    }
  }, [router]);

  const getDataNames = async () => {
    try {
      await fetch("http://localhost:1337/rooms?_id=" + router.query.id)
        .then((response) => response.json())
        .then((jsonData) => setFetchData(jsonData) & console.log(jsonData)); // Data are logged in console
    } catch (e) {
      console.error(e);
    }
  };

问题是 fetchData 在控制台日志上为空,但 jsonData 为我提供了实际数据。我不知道会出现什么问题。

最佳答案

好的,这里有 3 件事。首先,当您的 fetchData 值更改时,您的 useEffect 不会重新运行。您需要将其添加到依赖项列表中:

  useEffect(() => {
    if (router.asPath !== router.route) {
      getDataNames();
      console.log(fetchData); // Empty
    }
  }, [router, fetchData]);

这样,当 fetchData 更改时,效果就会运行。当然,只有在满足效果的 if 条件内的条件时,它才会 console.log

其次,您正在混合 async/await.then/.catch 语法,不要这样做。使用其中之一。在这种情况下,您只需删除 await 关键字和 try/catch block ,并使用现有的 .then 代码,并添加 .catch来捕获任何错误。

最后,Javascript 中的 & 是按位 AND 运算符,所以不确定为什么在那里使用它。如果您认为这意味着“并且也这样做”,那么这是错误的。只需将 .then 函数放在大括号内,然后依次调用 setFetchDataconsole.log 语句即可:

.then((jsonData) => {
    setFetchData(jsonData);
    console.log(jsonData)
});

关于javascript - 设置后React状态为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66381695/

相关文章:

javascript表到数组发送到php

javascript - 通过在 js/react 中的函数中传递参数来获取目标数组

reactjs - 升级到 Material UI 4 - withStyles 后出现错误

javascript - Webpack 找不到 jsx 文件

javascript - 捕获获取错误

php - 尝试从 2 个表 codeigniter 获取数据时出错

javascript - 同构获取不适用于外部请求?

javascript - Google Apps 脚本有 promise 吗?

javascript - session 存储: how to store multiple objects

c# - JavaScriptSerializer 反序列化为嵌套对象