You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue组件如何不重新渲染即可将数据重置为挂载时的初始值

Vue重置组件数据到初始状态的实现方案

不需要手动逐个重置属性,也不需要强制组件重新渲染,可通过预存初始状态快照的方式实现,具体实现方案如下:

方案1:选项式API(Vue2/Vue3兼容)

实现思路

提前定义初始数据的生成函数,每次调用都会返回全新的初始状态对象,重置时直接用新的初始对象覆盖当前响应式数据即可。

代码示例

// 单独定义初始状态生成函数,避免引用类型共享问题
const getDefaultAccount = () => ({
  name: "",
  customer: {
    orders: []
  }
})

export default {
  data() {
    return {
      account: getDefaultAccount()
    }
  },
  methods: {
    // 表单关闭时调用该方法即可完成重置
    resetForm() {
      this.account = getDefaultAccount()
    }
  }
}

如果不想抽离初始函数,也可以在组件挂载时存储初始状态快照:

export default {
  data() {
    return {
      account: {
        name: "",
        customer: {
          orders: []
        }
      },
      initialAccount: null
    }
  },
  mounted() {
    // 深拷贝存储初始状态,嵌套对象也不会丢失
    this.initialAccount = JSON.parse(JSON.stringify(this.account))
  },
  methods: {
    resetForm() {
      this.account = JSON.parse(JSON.stringify(this.initialAccount))
    }
  }
}

方案2:组合式API(Vue3)

代码示例

import { reactive } from 'vue'

// 初始状态生成函数
const getDefaultAccount = () => ({
  name: "",
  customer: {
    orders: []
  }
})

const account = reactive(getDefaultAccount())

// 重置方法
const resetForm = () => {
  Object.assign(account, getDefaultAccount())
}

注意事项

  • 如果数据对象包含函数、正则、Symbol等JSON无法序列化的特殊类型,可使用lodash.cloneDeep代替JSON序列化实现深拷贝,避免属性丢失。
  • 上述方案均为直接修改响应式数据,Vue会自动触发视图更新,无需强制重渲染组件,性能远高于v-if销毁重建组件的实现方式。

内容的提问来源于stack exchange,提问作者Greg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:06:03