【发布时间】:2021-05-28 01:44:24
【问题描述】:
我已经在父组件中建立了一个 websocket 连接,并使用 useRef 将其存储在变量 socket 中。现在,我将这个socket 传递给道具中的子组件。我想在子组件中使用这个套接字来发出组件特定的事件,并根据一些 websocket 事件更新特定于组件的某些状态变量。
父组件:
function Parent(props) {
const userId = props.userId;
const socket = useRef(null);
useEffect(() => {
if (userId) {
socket.current = services.establishSocketConnect(userId);
}
return () => {
socket.current.close();
};
}, []);
return (
<React.Fragment>
<Child socket={socket} />
</React.Fragment>
);
}
const mapStateToProps = (state) => ({
userId:
(state.userInfo && state.userInfo.user && state.userInfo.user._id) || null,
});
export default connect(mapStateToProps, null)(Parent);
子组件:
function Child(props) {
const { socket } = props;
useEffect(() => {
console.log('Child => socket', socket);
if (socket.current) {
console.log('attaching socket events');
}
}, []);
return <h1>Child</h1>;
}
const mapStateToProps = (state, otherProps) => {
return {
// ...
...otherProps,
};
};
export default connect(mapStateToProps, null)(Child);
在子组件中,socket.current 没有 websocket 连接。我知道在初始渲染时,该值将为空。所以,这就是 Child 组件最初收到的内容。因此,我尝试将socket、socket.current 添加到useEffect,以便子组件在更改时重新渲染。但是,这不会发生,因为可变对象不能用作 useEffect 的依赖项,我猜..
请提出解决此问题的方法。
使用 Robin Zigmond's solution 和一些额外的日志记录。
家长
function Parent(props) {
const userId = props.userId;
const socket = useRef(null);
useEffect(() => {
console.log('Parent => (initial) socket', socket);
socket.current = services.establishSocketConnection(userId);
if (socket.current) {
socket.current.onopen = onWSOpenEvent();
}
let i = setInterval(() => console.log('Parent => (interval) socket', socket), 5000);
return () => {
clearInterval(i);
};
}, [userId]);
return (
<React.Fragment>
<Child socket={socket.current} />
</React.Fragment>
);
}
儿童
function Child(props) {
const { socket } = props;
useEffect(() => {
console.log('Child => (initial) socket', socket);
if (socket) {
console.log('attaching socket events');
}
let i = setInterval(() => console.log('Child => (interval) socket', socket), 5000);
return () => {
clearInterval(i);
};
}, [socket]);
return <h1>Child</h1>;
}
这不起作用。以下是日志:
【问题讨论】:
标签: javascript reactjs sockets websocket