我正在开发这个使用 websockets 的 React 应用程序,首先,一些背景信息:
我得到了一个用户可以用钩子更改的fooArray
,我得到了一个在挂载时更改的socket
。现在,我得到了以下代码,// foo array change listener
就是我正在谈论的代码。我包括了其他的以便于理解
// socket ref
const socket = useRef(null);
// foo array change listener
useEffect(() => {
// this === null is there to prevent emitting on something that's null,
// if another way is possible too, please let me know.
if (socket.current === null) return;
socket.current.emit('foos', JSON.stringify(fooArray));
}, [fooArray, socket.current]);
// socket connection on mount
useEffect(() => {
socket.current = ioClient(WS_URI);
}, []);
现在的问题是,如果我从fooArray change listener
的依赖数组中删除socket.current,useEffect钩子将不会执行,并且在连接websocket时不会发生emit事件。
我将如何使用它使socket.current成为依赖数组的一部分,而不是未使用..?
useEffect
钩子按照它们的编写顺序执行,前提是它们的依赖数组导致它们运行(ll useEffects 钩子在初始渲染时运行(
由于您已经初始化了 useEffect 中的套接字,该套接字是使用 socke 编写的,因此在初始渲染时,您将没有套接字实例。
更改使用顺序效果将为您工作
// socket ref
const socket = useRef(null);
// socket connection on mount
useEffect(() => {
socket.current = ioClient(WS_URI);
}, []);
// foo array change listener
useEffect(() => {
socket.current.emit('foos', JSON.stringify(fooArray));
}, [fooArray]);