简体   繁体   English

React Hooks & UseEffect 不使用 socketIO 数据更新显示

[英]React Hooks & UseEffect not updating display with socketIO data

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;

The initial return does an initial render and displays everything.初始返回执行初始渲染并显示所有内容。 but then does not re render when incoming data from the socket.但是当从套接字传入数据时不会重新渲染。 It console logs everything fine.它控制台记录一切正常。

I am fairly new to hooks, I have already achieved this doing it the class way but am currently refactoring the app to use hooks instead.我对钩子相当陌生,我已经通过课堂方式实现了这一点,但目前正在重构应用程序以使用钩子。 Any suggestions would be greatly appreciated.任何建议将不胜感激。

React doesn't understand that textData changed because you don't change reference on array. React 不理解 textData 改变了,因为你没有改变对数组的引用。 You can try this:你可以试试这个:

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;

But why do you want to set handler on socket every time your textData will change?但是,为什么每次textData更改时textData在套接字上设置处理程序? So, i think you should not pass [textData] to useEffect.所以,我认为你不应该将[textData]传递给 useEffect。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM