restate / v1.0.0
常见问题
关于 restate 的渲染、保存、scope 和错误的常见问题解答。
没有匹配的问题
换个词试试,或显示全部问题。
基础需要 Provider 吗?
不需要。store 是模块级的值,任何导入它的组件都能使用。当状态应当属于单个组件实例时,请使用 useRestateScope。
基础为什么组件每次变化都会渲染?
不带 selector 调用 Hook 会订阅整个值。请传入只返回组件所显示内容的 selector。
基础selector 返回对象,每次都会渲染。
新对象永远不会与旧对象 Object.is 相等。把 shallow 作为第二个参数传入,或者分别选取各个字段。
基础改了对象,却什么都没更新。
set 收到的是同一个对象,所以 restate 没有发现变化。请从 set 返回新的对象或数组。
保存在哪里等待已保存的数据?
保存数据什么时候写入存储?
只有在你调用 save(),或开启 autoSave 后发生变化时才会写入。编辑只改变内存;status().dirty 会告诉你有未保存的修改。
保存该用 autoSave 还是 save()?
对始终需要保存的设置和草稿使用 autoSave。由用户决定何时保存时(例如“保存”按钮或表单提交)使用 save()。即使开启了 autoSave,也可以调用 save(),例如在 pagehide 时。
错误restateManager.ready 被拒绝了,怎么办?
错误出现 QUEUE_FULL 或 STORAGE_TIMEOUT。
存储跟不上你排队的工作。不要在紧密循环中调用 save()——排队中的保存本来就会写入最新值——或者使用带延迟的 autoSave。必要时调整 maxPendingOperations 和 operationTimeoutMs。
错误迟到的请求在卸载后写入了 store。
对已销毁 store 调用 set() 和 reset() 会被忽略,就像卸载后的 React 状态更新一样。订阅会抛出 STORE_DESTROYED,存储命令会被拒绝。
scopescope 中的 store 忽略了新的 props。
工厂函数只运行一次,就像 useState 的初始化函数。为每个文档给组件加上 key,这样新文档就会得到新的 scope。
scope如何避免水合不匹配?
在服务端和客户端以 props 传入相同的服务端数据,并在 useRestateScope 中用它创建 store。初始值就是服务端快照。
scope为什么 scope 中的 store 不在 restateManager.ready 里?
scope 中的持久化 store 在所属组件于客户端提交后才开始加载。请在该组件内部的加载边界中等待 scope.manager.ready。
保存React Native 上出现 MMKV_UNAVAILABLE。
安装 react-native-mmkv 及其原生依赖,然后重新构建应用。在 Expo 中请使用 development build。内存 store 不需要 MMKV 也能工作。