vue 3 中 reactive 对象重置需保留初始副本并用 object.assign(state, initialstate) 就地覆盖;不可重新赋值 reactive 新对象,否则破坏响应性;torefs 解构后自动同步更新。

在 Vue 3 的 Composition API 中,reactive 创建的是响应式对象,它本身没有内置的“重置”方法。要将 reactive 对象恢复为初始默认状态,核心思路是:**保留一份初始值副本,再用它覆盖当前状态**。
保存初始状态快照
定义 reactive 对象时,先用一个常量或 ref 存储原始默认值,避免硬编码或重复构造:
- 用
const initialState = { count: 0, name: '', isActive: false }显式声明初始结构 - 再通过
const state = reactive({ ...initialState })创建响应式对象 - 后续重置只需执行
Object.assign(state, initialState)
封装可复用的重置函数
把重置逻辑抽离成函数,便于多处调用或配合表单、弹窗等场景:
- 定义
function resetState() { Object.assign(state, initialState) } - 可在按钮点击、取消操作、或
onBeforeUnmount中调用 - 若需触发依赖更新(如 computed 或 watch),
Object.assign已足够——它直接修改原对象属性,不破坏响应性
注意不可直接赋值新对象
不能写 state = reactive({...initialState}),因为这会切断原有响应式连接:
- 原
state是一个被追踪的响应式代理对象,重新赋值会让模板和逻辑失去对它的引用 - 所有基于该
state的watch、computed和模板绑定都会失效 - 正确做法始终是“就地修改”,而非替换整个引用
结合 toRefs 避免解构丢失响应性
如果在 setup 中解构了 reactive 对象(如 const { count, name } = toRefs(state)),重置后需确保这些 ref 仍指向最新值:
-
toRefs返回的是对原对象属性的响应式 ref 引用,Object.assign更新原对象后,它们自动同步 - 无需额外操作,但切记不要对解构出的变量重新赋值(如
count.value = 0),否则会绕过统一重置逻辑











