[英]How to access state inside a listener inside a useEffect?
我知道如果没有依赖项,您将无法在 useEffect 中访问useEffect
。 一个这样的例子:
const [state, setState] = React.useState('')
const ws = new WebSocket(`ws://localhost:5000`)
React.useEffect(() => {
ws.onopen = () => {
console.log(state)
},[])
在这种情况下, state
返回为空,即使它在代码的其他部分已更改。 为了原则上解决这个问题,我应该添加state
作为 useEffect 挂钩的依赖项。 但是,这将再次触发监听器,我不想在我的websocket
上有 2 个活动监听器,或者被迫关闭并再次重新打开它:
React.useEffect(() => {
ws.onopen = () => {
console.log(state)
},[state])
在位于useEffect
挂钩内的侦听器中访问state
时,有什么好的做法?
试试这个方法:
const [state, setState] = React.useState('');
const stateRef = React.useRef(state);
React.useEffect(() => {
stateRef.current = state;
}, [state])
const ws = React.useMemo(() => {
const newWS = new WebSocket(`ws://localhost:5000`);
newWS.onopen = () => {
console.log(stateRef.current);
}
return newWS;
}, []);
这样,您只需创建一次ws
,它将使用 state 参考,由于useEffect
,该参考将是最新的。
如果您在 state 更新时不需要重新渲染组件,您可以删除const [state, setState] = React.useState('');
和useEffect
并在需要时像这样更新stateRef
- stateRef.current = newValue;
最佳实践在侦听器中获取数据。[更新]!
const [socketData , setSocketData] = useState(null);
useEffect(() => {
websocet.open( (data) => {
setSocketData(data);
})
},[])
//second useEffect to check socketData
useEffect(() => {
if(socketData){
// access to data which come from websock et
}
},[socketData])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.