useEffect 最好不要监听对象。因为对象里面的值改变不一定会执行,因为他监听的是地址,有时候地址不会变。导致数据改变的时候未监听到。
当依赖项是引用类型时,React 会对比当前渲染下的依赖项和上次渲染下的依赖项的内存地址是否一致,如果一致,effect 不会执行,只有当对比结果不一致时,effect 才会执行
来自:https://blog.csdn.net/liuyan19891230/article/details/119012568
hooks 中抽屉导航栏关于Android 物理返回键监听:
BackHandler.addEventListener('hardwareBackPress',onBackAndroid);
const onBackAndroid=()=>{
goBack()
}
BackHandler.removeEventListener('hardwareBackPress',onBackAndroid);
上面代码放了2个很严重的错误,
第一:监听关闭 removeEventListener 已经放弃了应该使用 remove()
useEffect(()=>{
const backHandler= BackHandler.addEventListener('hardwareBackPress',onBackAndroid);
return ()=>backHandler.remove()
},[])
第二如果是抽屉菜单中使用了监听要注意释放并且不能执行BackHandler.removeEventListener('hardwareBackPress',onBackAndroid);
否则会全局失效,又或者一直在抽屉菜单中。
我的做法是用userRef 在打开抽屉的时候创建监听物理返回键,关闭的时候remove()
const backHandler=userRef()
const openDrower=()=>{
backHandler.current= BackHandler.addEventListener('hardwareBackPress',onBackAndroid);
}
const closerDrower=()=>{
backHandler.current&& backHandler.current.remove()
}
这里忌讳使用 removeEventListener
网友评论