【发布时间】:2020-05-13 15:02:44
【问题描述】:
我在我的 react native 应用程序中使用了很多 firestore 快照。我也在使用 React 钩子。代码如下所示:
useEffect(() => {
someFirestoreAPICall().onSnapshot(snapshot => {
// When the component initially loads, add all the loaded data to state.
// When data changes on firestore, we receive that update here in this
// callback and then update the UI based on current state
});;
}, []);
起初我认为useState 是存储和更新 UI 的最佳钩子。但是,根据我的useEffect 钩子设置为空依赖数组的方式,当快照回调被更新的数据触发并且我尝试使用新的更改来修改当前状态时,当前状态是未定义的。我相信这是因为关闭。我可以使用useRef 和forceUpdate() 来解决它,如下所示:
const dataRef = useRef(initialData);
const [, updateState] = React.useState();
const forceUpdate = useCallback(() => updateState({}), []);
useEffect(() => {
someFirestoreAPICall().onSnapshot(snapshot => {
// if snapshot data is added
dataRef.current.push(newData)
forceUpdate()
// if snapshot data is updated
dataRef.current.find(e => some condition) = updatedData
forceUpdate()
});;
}, []);
return(
// JSX that uses dataRef.current directly
)
我的问题是我是否以不同的方式使用useRef 和forceUpdate 而不是useState 来正确执行此操作?我必须更新 useRef 钩子并在我的应用程序中调用 forceUpdate() 似乎不正确。在尝试useState 时,我尝试将状态变量添加到依赖数组中,但最终出现了无限循环。我只希望快照函数初始化一次,并且组件中的有状态数据随着后端的变化(在 onSnapshot 回调中触发)随着时间的推移而更新。
【问题讨论】:
标签: reactjs firebase google-cloud-firestore react-hooks react-native-firebase