推荐阅读
一个比较简单的逻辑,hook,在不同的组件中调用,A 更新为了最新值,B 却维持旧值:
const globalObject = {
value: 0,
getValue() {
return globalObject.value
}
}
function useHook() {
const [symbol, setSymbol] = useState(Symbol('symbol'))
// 发生 'change' 事件的时候重置 symbol, 以重新触发 getValue
useEffect(() => {
function onChange() {
setSymbol(Symbol('symbol'))
}
eventBus.on('change', onChange)
return () => {
eventBus.off('change', onChange)
}
}, [])
const value = useMemo(() => {
return globalObject.getValue()
}, [symbol])
return value
}
function App() {
useEffect(() => {
globalObject.value += 1
eventBus.emit('change')
}, [])
}
function ComponentA() {
const value = useHook()
}
function ComponentB() {
const value = useHook()
}
直接说结果吧,没什么特别的,useHook 每次调用都是一个独立的新实例,eventBus.emit('change')发生的时候,A 组件的事件订阅已完成,所以 A 接收到了事件,变更为了最新值,但 B 的事件订阅尚未完成,导致 B 错过了事件,所以 B 是旧值。
好久不见,预祝大家周末愉快。
如非特别声明,本站作品均为原创,遵循【自由转载-保持署名-非商用-非衍生 创意共享 3.0 许可证】。
对于转载作品,如需二次转载,请遵循原作许可。