如何重置状态
在某些情况下,您可能想要将代理实例中的状态重置为其初始值。例如,您正在存储表单值或其他您想要重置的临时 UI 状态。事实证明这很简单!
import { proxy } from 'valtio'
import { deepClone } from 'valtio/utils'
const initialObj = {
text: 'hello',
arr: [1, 2, 3],
obj: { a: 'b' },
}
const state = proxy(deepClone(initialObj))
const reset = () => {
const resetObj = deepClone(initialObj)
Object.keys(resetObj).forEach((key) => {
state[key] = resetObj[key]
})
}
注意,我们在 reset 函数和 state 代理中都使用 valtio/utils 中的 deepClone() 工具函数来复制初始对象。在代理函数中使用 deepClone 是 v2 中的新要求。Valtio 不再默认克隆初始状态。如果您重用传递给代理函数的对象,您可能会得到意外的结果。
或者,您可以将对象存储在另一个对象中,这使得重置逻辑更容易:
const state = proxy({ obj: initialObj })
const reset = () => {
state.obj = deepClone(initialObj)
}
ℹ️ 注意
使用
structuredClone()在 2022 年,添加了一个名为
structuredClone的新全局函数,在大多数现代浏览器中广泛可用。您可以像上面的deepClone一样使用structuredClone,但是deepClone是首选,因为它会意识到您状态中的任何ref。