我有一个功能性的 React 组件(更多的是非 React 对象的代理),如下所示:
function ProxyComponent({onEvent1, onEvent2, onEvent3 ...}){
useEffect(()=>{
someObject?.on('event1', onEvent2);
return someObject?.off('event1', onEvent2);
},[onEvent2, someObject])
useEffect(()=>{
someObject?.on('event1', onEvent1);
return someObject?.off('event1', onEvent1);
},[onEvent1, someObject])
.
.
.
}
除了有很多事件,而且这里有一个明显的模式。所以我想这样做:
function ProxyComponent(props){
const events = {
'event1': props.onEvent1 ?? null,
...
'event20': props.onEvent20 ?? null
}
for (const [name, handler] of Object.entries(events)) {
useEffect(()=>{
handler && someObject?.on(name, handler);
return handler && someObject?.off(name, handler);
},[handler, someObject])
}
}
The 钩子规则 https://reactjs.org/docs/hooks-rules.html明确表示不支持这种用法,但我想知道我如何能够自动化这个模式,同时仍然在钩子规则之内【这是主要问题】
Notes:
-
The .on
and .off
方法会创建网络请求,因此最好尽可能少地调用它们。
-
将循环移至 useEffect 内部会产生两个复杂情况:
A。一个非常长的依赖数组 [onEvent1, ..., onEvent20]。我非常怀疑[...Object.values(events)]
works.
b.单个处理程序中的每次更改都会导致多个.off
s 并用 new 撤消它.on
又来了。除了效率低下之外,在我的具体情况下,我想避免这种情况,因为注释#1。