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

重启Vue组件时如何将Object类型的prop重置为默认值?

现象根因
  • 基础类型(字符串、数字等)是值传递,每次组件重新初始化时都会生成新的默认值,因此关闭再打开namey会自动重置。
  • 对象/数组是引用类型,你当前直接给subject的default配置写死了对象字面量,这个对象只会在组件全局注册时创建1次,所有nameinput实例共享同一个引用,修改后的值会一直保存在这个对象里,就算组件销毁重建也不会恢复初始值。这是Vue官方明确提示的注意点,对象/数组类型的prop默认值必须用工厂函数返回。
修复方案

方案1:修改prop默认值为工厂函数(最小改动修复)

仅需修改subject的默认值写法,改为函数返回新对象,每次组件实例化都会生成独立的默认对象:

Vue.component('nameinput', {
  props: {
    subject:{
      type: Object,
      // 改为工厂函数返回新对象
      default: function () {
        return {
          name: 'homor'
        }
      }
    },
    namey: {
      type: String,
      default: 'homor'
    }
  },
  // 其余代码保持不变
  data: function (){
    return {
    }
  },
  template: '<div>subject.name<input v-model="subject.name" type="input" /><br/>namey<input v-model="namey" type="input" /></div>'
});

方案2:组件内部做状态中转(符合单向数据流规范,推荐生产环境使用)

直接用v-model修改prop本身不符合Vue单向数据流设计原则,会有隐性的状态变更问题,建议组件内部维护本地状态,修改仅作用于本地变量:

Vue.component('nameinput', {
  props: {
    subject:{
      type: Object,
      default: function () {
        return {
          name: 'homor'
        }
      }
    },
    namey: {
      type: String,
      default: 'homor'
    }
  },
  data: function (){
    return {
      // 初始化时深拷贝prop的值到本地状态
      localSubject: JSON.parse(JSON.stringify(this.subject)),
      localNamey: this.namey
    }
  },
  template: '<div>subject.name<input v-model="localSubject.name" type="input" /><br/>namey<input v-model="localNamey" type="input" /></div>'
});

修复后每次关闭再打开组件,subject.name都会自动重置为默认值。
效果演示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:48:02