lea*_*lar 5 reactjs react-native expo google-cloud-firestore react-native-firebase
Firestore 的一个主要卖点是能够将其用作在线/离线事实来源。我现在正在以这种方式使用它:直接在操作上更新 Firestore 文档,然后侦听 Firestore DB 更改并将其映射回本地状态。然而,依靠这种延迟补偿和映射回本地状态不足以实现快速更新(即使文档大小很小,也可以点击、切换)。例如,切换将“抖动”,因为 RN 切换可能会在点击时移动,并且本地状态在返回之前不会更新,请参阅视频示例。在 Android 上情况似乎更糟,而且问题并不严格限于基本切换。
以下哪些其他因素可能会影响延迟补偿?
人们是否经常使用 React Native / Firestore 应用程序构建本地数据填充层 / 本地应用程序状态来帮助提高本地性能速度?有没有推荐的库?
在应用程序加载时,安装侦听器,并将结果导出到上下文以通过应用程序使用
const [user, setUser] = useState();
firebase.firestore().collection(`users/${user.uid}`).onSnapshot(qs => setUser(oldState => {
const newState = {};
qs.docChanges().forEach(change => {
if (change.type === "added" || change.type === "modified") {
newState[change.doc.id] = {
docid: change.doc.id,
...change.doc.data(),
};
} else if (change.type === "removed") {
delete oldState[change.doc.id];
}
});
return {
...oldState,
...newState,
};
}))
Run Code Online (Sandbox Code Playgroud)
用于切换通知的示例组件和函数:(开关不稳定)
const toggleNotifications = (user, value) => {
firebase.firestore().doc(`users/${user.uid}`).update({
wantNotifications: value,
});
};
const TestComponent = () => {
//gets from context, set in listener mounted on app load
const { user } = useUserContext();
return (
<Switch
value={user.wantNotifications}
onValueChange={value => toggleNotifications(user, value)}
/>
);
};
Run Code Online (Sandbox Code Playgroud)
这不是一个答案,只是一个长评论:)
@learningAngular 例如,toggleNotifications只需要调用异步操作创建者,而不必担心将任何逻辑放入反应组件中。
相反,Redux 模式提供了执行某些逻辑的空间,在这种情况下,因为用户最后一刻的决定是事实的来源,所以调度函数总是会在开始更新 firestore 之前设置一个本地的tempState,updatingStatus然后在 firestore 承诺解决或拒绝后,将一个操作调度到减速器重置updatingStatus。然后选择器将检查是否updatingStatus仅依赖本地tempState,否则依赖侦听的 Firestore 状态。最后,反应组件使用选择器结果作为当前有效状态。
我不回答这个问题,因为我没有那么多经验。我也很好奇是否有一个好的解决方案,但这就是我认为目前的解决方案。
| 归档时间: |
|
| 查看次数: |
482 次 |
| 最近记录: |