【问题标题】:React Hooks & UseEffect not updating display with socketIO dataReact Hooks & UseEffect 不使用 socketIO 数据更新显示
【发布时间】:2020-04-09 21:58:38
【问题描述】:
import React, {useState, useEffect} from 'react';
import socketIO from 'socket.io-client';
import Container from 'react-bootstrap/Container';

function Sock() {
   const [textData, setTextData] = useState([]);

   useEffect(() => {
      const socket = socketIO('http://127.0.0.1:5009');
      socket.on('chat message', (text)  =>  {
         setTextData([
             textData.push(text)
          ]);
      console.log(textData);
      });
   },[]);

  return (
     <Container>
        <h1>Socket</h1>
        <li>{textData}</li>
     </Container>
  ); 
}

export default Sock;

初始返回进行初始渲染并显示所有内容。但是当从套接字传入数据时不会重新渲染。它控制台记录一切正常。

我对钩子相当陌生,我已经通过课堂方式实现了这一点,但目前正在重构应用程序以改用钩子。任何建议将不胜感激。

【问题讨论】:

    标签: javascript reactjs socket.io react-hooks use-effect


    【解决方案1】:

    React 不理解 textData 发生了更改,因为您没有更改数组上的引用。你可以试试这个:

    import React, {useState, useEffect} from 'react';
    import socketIO from 'socket.io-client';
    import Container from 'react-bootstrap/Container';
    
    function Sock() {
       const [textData, setTextData] = useState([]);
    
       useEffect(() => {
          const socket = socketIO('http://127.0.0.1:5009');
          socket.on('chat message', (text)  =>  {
             setTextData([
                 ...textData,
                 ...text,
             ]);
             console.log(textData);
          });
       },[textData]);
    
      return (
         <Container>
            <h1>Socket</h1>
            {textData.map((text) => <li>{text}</li>)}
         </Container>
      ); 
    }
    
    export default Sock;
    

    但是为什么每次textData 发生变化时都想在套接字上设置处理程序?所以,我认为你不应该将[textData] 传递给useEffect。

    【讨论】:

    • 感谢您的建议。是否有错字: setTextData([ ...textData, text,
    • @davidmichael 哦,我在 5 分钟内找不到错字:(
    • @davidmichael 你是对的,这是因为你尝试将数组textData 打印到li 中。如果 textData 的 elem 是一个对象,那就错了。 React 不能只打印 ReactNote,对象不是反应节点。
    • @davidmichael 你能在return语句之前显示console.log(textData)吗?
    • 干杯我已经让它工作了一些。只需要摆弄它@SaveliTomac
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2020-06-11
    • 2021-02-09
    • 1970-01-01
    • 2020-07-16
    • 2021-07-08
    • 2020-11-28
    相关资源
    最近更新 更多