reactjs React不呈现长字符串列表

c9qzyr3d  于 2023-06-29  发布在  React
关注(0)|答案(1)|浏览(147)

我在React中有一个长数组,超过600个字符串项。我有一个map函数,它在日志中列出这些字符串。当我更新空列表以添加所有字符串时,更新是相当即时的,但HTML本身需要永远更新/根本不更新。只有当我更改代码并触发某种快速重载时,HTML才会更新,除此之外,它没有响应。
我最初的怀疑是因为列表太长,所以列表没有呈现,但是在用只有2到3个项目的测试列表尝试之后,它仍然不起作用。现在我认为这是由于我通过WebSocket获取列表中的项目。

  1. const [logs, pushLogs] = useReducer(
  2. (prev, next) => {
  3. prev.push(...next);
  4. return prev;
  5. },
  6. ["Initializing..."]
  7. );
  8. useSWRSubscription(
  9. `ws://${host}/api/users/logs?id=${props.id}`,
  10. (key, { next }) => {
  11. const socket = new WebSocket(key);
  12. socket.addEventListener("message", ({ data }) => {
  13. pushLogs(data.split("\n"));
  14. if (data.includes("Finished")) {
  15. return () => socket.close();
  16. }
  17. return next(null, data);
  18. });
  19. socket.addEventListener("error", (event) => next(event.error));
  20. return () => socket.close();
  21. }
  22. );

我使用SWR来获取日志,reducer钩子只是一个状态数组,我可以更容易地将其推到。SWR是NextJS(我的堆栈)推荐的获取东西的方式,但在大多数情况下,它只是一个普通的WebSocket。我像这样Maplogs数组。

  1. {logs.map((log, index) => {
  2. return (
  3. <span
  4. key={index}
  5. >
  6. {log}
  7. </span>
  8. );
  9. })}

如何使用WebSocket立即更新我的阵列?

nzrxty8p

nzrxty8p1#

你的问题是你正在使用push来改变Array。由于Array仍然是相同的对象,React不知道它已经改变了。React通过引用而不是值进行比较。
从React文档中,以下是如何以React可以看到的方式添加到Array中:
push()将改变一个数组,这是你不希望看到的。
相反,创建一个新数组,其中包含现有项和末尾的新项。有多种方法可以做到这一点,但最简单的方法是使用...数组扩展语法

相关问题