javascript - 即使状态更新也显示之前的内容 5 秒?

标签 javascript reactjs websocket react-hooks

我有一个使用 Django 后端的 React 应用程序,我使用 webSocket 连接后端,当有一些变化时更新状态。但是变化非常快,所以只能看到最后的变化。我想在显示下一条消息之前将上一条消息显示一段时间。这是我的代码

import React, { useEffect, useState, useRef } from "react";

const Text = () => {
  const [message, setMessage] = useState("");
  const webSocket = useRef(null);

  useEffect(() => {
    webSocket.current = new WebSocket("ws://localhost:8000/ws/some_url/");
    webSocket.current.onmessage = (res) => {
      const data = JSON.parse(res.data);
      setMessage(data.message);
    };
    return () => webSocket.current.close();
  }, []);

  return <p>{message}</p>;
};

export default Text;

所以消息应该在特定时间可见(以秒为单位,例如 - 5 秒),然后应该显示下一条消息。知道如何做到这一点吗?

最佳答案

const Text = () => {
  const [messages, setMessages] = useState([]);
  const currentMessage = messages[0] || "";

  const [timer, setTimer] = useState(null);

  // webSocket ref missing? ;-)

  useEffect(() => {
    webSocket.current = new WebSocket("ws://localhost:8000/ws/some_url/");
    webSocket.current.onmessage = (res) => {
      const data = JSON.parse(res.data);
      setMessages((prevState) => [ ...prevState, data.message]);
    };
    return () => webSocket.current.close();
  }, []);

  // Remove the current message in 5 seconds.
  useEffect(() => {
    if (timer || !messages.length) return;

    setTimer(setTimeout(() => {
      setMessages((prevState) => prevState.slice(1));
      setTimer(null);
    }, 5000));
  }, [messages, timer]);

  return <p>{currentMessage}</p>;
};

关于javascript - 即使状态更新也显示之前的内容 5 秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67708827/

相关文章:

javascript - 页面加载时将用户定向到随机页面之一

javascript - 第一次点击 html.disable link.in html.java 后隐藏链接

javascript - props.onChange(e.target.value) 返回一个对象,而不是 Material ui 中 textField 中的值

javascript - react 去抖得到 e.target.value undefined

javascript - 无法使用 setState 动态更改复选框的状态

javascript - 使用 react-router-dom 的授权和认证

json - 如何使用 Golang 从 websocket 读取值

erlang - 使用 Yaws 和 websockets 订阅数据

utf-8 - WebSocket - Safari 9 - header 值中的 UTF-8 序列无效

javascript - 如何在 xpi 中提供 firefox 插件 UUID?