常见问题
❓ 如何在 Reactive 中存储未代理状态,以保持使用体验一致性
您可以使用 ref 来实现这一点。当您希望在代理中嵌套一个不被内部代理包裹的对象时(比如存储 DOM 元素、File 对象等非结构化数据),这非常有用,但请注意,它的变化不会被追踪。更多详情和注意事项请参阅 ref。
❓ 当状态值传递给 <input />
元素时,输入过程可能会被打断
默认情况下,状态变更时,会异步地通知变更,来实现合并更新(即批处理)的效果,以优化渲染。
如果您想禁用它(例如被 <input />
元素使用时,可能与输入法的 Composition 事件 冲突),您可以在使用 store.useSnapshot
时设置 sync
选项为 true
来同步地通知变更,以避免这个问题。
1const store = create({ inputValue: '' })
2
3const updateInputValue = (value: string) => {
4 store.mutate.inputValue = value
5}
6
7function App() {
8 const inputValue = store.useSnapshot((s) => s.inputValue, { sync: true })
9
10 return (
11 <input
12 value={inputValue}
13 onChange={(e) => {
14 updateInputValue(e.target.value)
15 }}
16 />
17 )
18}