使用 create
API 创建一个带有初始状态的 store
,推荐在组件代码之外创建,以获得更好的代码拆分。例如,在 store.ts
中创建并导出,并和你的 index.tsx
组件代码放在同一目录下便于引入。
store
可以是全局的,也可以是局部的,这取决于你的需求。
store
放在全局下,然后在应用程序的任何地方导入它。store
,然后在组件内引入使用以保持组件逻辑的独立性。请确保 store
内的状态始终是 Pure Object
,不含函数、类实例等非结构化数据。如果需要,请考虑使用 ref。
如何你需要调试,可以使用 devtools
来启用 Redux DevTools Extension 支持,详情参考 与 Redux DevTools 集成。
使用 store
暴露的 useSnapshot
Hook 在组件中获取快照(snapshot
),并使用它参与渲染。
你也以传入一个 selector
函数,手动指定你需要消费的状态,以优化渲染,详情参考 可选的渲染优化。
在复杂状态场景下,为了提高代码可读性,你也可以在相邻 store 文件内定义一些语意化的 Hooks 来使用,比如:
如果只是为了读取状态,可以在遵循 immutable
原则的情况下,直接读取 store.mutate
对象即可。
上述方式覆盖大多数情况,如果你实在需要在组件外获取快照,可以使用 store.snapshot()
。
你可以使用 store.mutate
在任何地方变更状态,Reactive 会自动触发重新渲染。
Reactive 采用了一种读写分离的策略,快照(Snapshot
)被认为时某个阶段的「快照状态」,是不可扩展的,你只能通过修改 store.mutate
对象来变更状态,以生成一份全新的快照,遵循 immutable
的设计原则。
你也可以将变更状态的逻辑提取到 store
文件中,以便复用。
然后在组件中使用这些方法。
如果需要,你也可以通过 store.restore()
轻松地恢复到初始状态,比如在组件卸载时,重置状态。
store.restore()
中使用了较新的 structuredClone API,如果有需要,请考虑添加一个 polyfill。