json 带有React useEffect和JavaScript对象的高级脑筋急转弯

fkaflof6  于 2022-12-15  发布在  React
关注(0)|答案(1)|浏览(100)

我遇到了一个不寻常的javascript功能。下面,你会看到React代码(更准确地说:useEffect钩子)编译成javascript。

(0, _react.useEffect)(() => {
    console.log("Outside", socket);
    if (socket !== null && socket !== void 0 && socket.connected) {
      console.log("Inside", socket);
      setNewSocket(socket);
    }
  }, [props]);

您可以看到两个console.log,一个在'if'语句外部,一个在内部。
然而,在浏览器中,我只看到'Outside' console.log,无论套接字是否出现:

当我删除最后一个“if”检查(&& socket.connected)时,语句通过了,但是socket对象和它的键值不匹配。
代码:

(0, _react.useEffect)(() => {
    console.log("Outside", socket);
    if (socket !== null && socket !== void 0 ) {
      console.log("Inside", socket);
      console.log("connected", socket.connected);
      setNewSocket(socket);
    }
  }, [props]);


console.log:

问题是setNewSocket设置套接字的值不正确(socket.connected:false)导致套接字不工作。
怎么可能?有什么想法吗?
一个更有趣的功能是,只有当我直接进入使用套接字的页面时,才会发生这种行为,例如:https://myweb.com/tableWithSocket。但是,如果我转到**/home页面,然后通过导航菜单转到/tableWithSoket**,它似乎可以正常工作。此外,当我通过***切换设备工具栏***调整页面大小或关闭导航栏时,它也开始工作。总之,它猜测它在重新呈现时开始工作

xqkwcwgp

xqkwcwgp1#

@konrad提到:在useEffect中检查socket.connected将不起作用,因为该属性的更改不会触发效果
换句话说,我不能只将props作为依赖项放在这里(props是一个包含套接字和传递给组件的其他一些值的对象),我甚至不能将socket作为依赖项,因为它们都是对象,这意味着它们是引用类型,并且依赖项数组包含一个即使对象键/值更改也不会更改的引用号。
因此,我需要具体检查socket.connected值:

(0, _react.useEffect)(() => {
  if (socket !== null && socket !== void 0 && socket.connected) {
    setNewSocket(socket);
  }
}, [socket, socket !== null && socket !== void 0 && socket.connected]);

React代码如下所示:

useEffect(() => {
  if (socket?.connected) {
    setNewSocket(socket);
  }
}, [socket?.connected]);

相关问题