简体   繁体   English

插座 io 在反应中重新渲染

[英]socket io to much rerendering in react

I'm using socketio and react.我正在使用 socketio 并做出反应。 Im trying to set state for all users when one use changes it but it causes too much rerendering on site.我试图为所有用户设置 state,当一次使用更改它时,它会导致现场重新渲染过多。

server.js服务器.js

const app = require('express')

const http = require('http').createServer(app)
const io = require("socket.io")(http, {
    cors: {
       origin: "http://localhost:3000",
    },
  });

let subject = ''

io.on('connection', (socket) => {
    socket.on('setSubject', (sbj) => {
        subject = sbj
        io.sockets.emit('getSubject',subject)
    })
    socket.on('changeHiddenPassword',hiddenPassword => {
        socket.broadcast.emit('newHiddenPassword',hiddenPassword)
    })
    
})

http.listen(4001,function(){
    console.log('listening on port 4001')
})

front end前端

const [hiddenPassword,changeHiddenPassword] = useState([''])

useEffect(() => {
        socket.emit('changeHiddenPassword',hiddenPassword)
    }, [hiddenPassword]);
    
      socket.on('newHiddenPassword',newHiddenPassword => {
          changeHiddenPassword(newHiddenPassword)
        })

I dont think rest of the code will help you somehow but if it would i can provide it to you.我认为代码的 rest 不会以某种方式帮助您,但如果可以的话,我可以提供给您。 What i'm trying to do is when someone clicks on specific element on my site i want my hiddenPasword state to change for all connected users.我想要做的是当有人点击我网站上的特定元素时,我希望我的 hiddenPasword state 为所有连接的用户更改。 I know that what i'm doing is wrong,beacouse when the state changes for one user useEffect is passing and setting state to everyone else and their useEffect are passing and setting state to everyone else and so on... I want to know how to do it properly and i cant figure out how.我知道我所做的是错误的,因为当 state 为一个用户更改时,useEffect 正在传递并将 state 传递给其他所有人,而他们的 useEffect 正在传递并设置 Z9ED39E2EA9312586B6A985A6,所以想知道如何...正确地做到这一点,我不知道怎么做。

so when you change hiddenPassword you are emitting changeHiddenPassword event, this sends back newHiddenPassword event which changes the hiddenPassword and this continues infinitely.因此,当您更改hiddenPassword时,您将发出changeHiddenPassword事件,这会发送回newHiddenPassword事件,该事件会更改hiddenPassword并且这会无限继续。

Try modifying newHiddenPassword handler like this, so it's not changing the state (and triggering useEffect) when the received password is already up to date尝试像这样修改newHiddenPassword处理程序,因此当收到的密码已经是最新的时,它不会更改 state(并触发 useEffect)

 socket.on('newHiddenPassword',newHiddenPassword => {
     if (newHiddenPassword !== hiddenPassword) {
         changeHiddenPassword(newHiddenPassword);
     }
 });

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

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