我遇到了一个不寻常的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**,它似乎可以正常工作。此外,当我通过***切换设备工具栏***调整页面大小或关闭导航栏时,它也开始工作。总之,它猜测它在重新呈现时开始工作
1条答案
按热度按时间xqkwcwgp1#
@konrad提到:在
useEffect
中检查socket.connected
将不起作用,因为该属性的更改不会触发效果换句话说,我不能只将
props
作为依赖项放在这里(props是一个包含套接字和传递给组件的其他一些值的对象),我甚至不能将socket
作为依赖项,因为它们都是对象,这意味着它们是引用类型,并且依赖项数组包含一个即使对象键/值更改也不会更改的引用号。因此,我需要具体检查
socket.connected
值:React代码如下所示: