reactjs - 侦听器不使用依赖数组触发 useEffect
问题描述
这里的目标是在 Firebase 中修改数据时更改表数据
问题是由于某种原因,在firebase
侦听器的范围内,setState(...)
不会触发useEffect(()=> {}, [...])
具有适当依赖项的 。
知道为什么,有没有办法强制改变?
const [actions, setActions] = useState([]);
....
firebase.
.firestore()
.collection("collection_name")
.onSnapshot(s => {
if (!s.empty) {
s.docChanges().forEach(change => {
if (change.type === "modified") {
const newActions = [...actions, change.doc.data()]
setActions(newActions) //The change
console.log("arrived here")
}...
...
useEffect(() => {
console.log("change in actions"); // Does not triggered on when modified
}, [actions]);
这在没有依赖数组的情况下工作:
useEffect(() => {
console.log("This does work")
});
解决方案
我认为您应该查看其他参考资料。
react hook的事情是,如果setter前后对象的引用相同,那么监听这个对象的useEffect就不会触发。
这意味着如果newActions = ...
您使用导致操作的引用来更新操作的值,然后 setActions() 对象的引用保持不变,那么您应该尝试制作操作的副本,然后修改这个独立的副本。然后您可以 setActions(modifiedCopy) 这通常会触发 useEffect。
注意:这只是一个猜测,因为我不知道你把什么放在后面newActions = ...
推荐阅读
- css - 页面右边缘的转换在浏览器之间的结果差异
- javascript - Javascript将给定时区中的日期转换为本地日期
- java - 如何在android中实现BottomAppBar?
- node.js - TypeError:无法读取节点 js 中未定义的属性“_handle”
- time-series - 如何使用时间序列模型进行未来可能发生的预警或异常检测?
- three.js - ThreeJS:BufferGeometry 的厚度
- java - 手机收到通知后如何在没有任何用户交互的情况下自动打开 Android 应用程序
- python - 是否有在 Django 中添加应用程序的特定方法
- swiftui - 如何在 SwiftUI 中将删除线()应用于点击的 foreach 文本项?
- html - Bootstrap下拉菜单不下拉的问题