Vue中动态添加对象属性?这个生命周期时机选对了没?

大家好,我是小杨,一个干了6年的前端老油条。今天遇到个有意思的问题,分享给大家,说不定你也踩过这个坑!

一、问题现场还原

前几天我在写组件时遇到这么个情况:

javascript 复制代码
data() {
  return {
    myData: {}  // 先声明个空对象
  }
}

然后我在某个方法里往这个对象动态添加属性:

javascript 复制代码
methods: {
  handleClick() {
    this.myData.name = '我'  // 添加属性
    console.log(this.myData) // 控制台能打印出数据
  }
}

但是!页面上的绑定 {{ myData.name }} 死活不更新!这科学吗?

二、为什么会出现这个情况?

这里涉及到Vue的响应式原理。Vue在初始化时会对data中的属性用Object.defineProperty进行劫持(Vue3改用Proxy),但是后期动态添加的属性不会自动变成响应式的

就像你新交了个朋友,但没告诉Vue这位朋友的存在,Vue自然监测不到它的变化。

三、解决方案大比拼

方案1:提前声明所有属性(笨但有效)

javascript 复制代码
data() {
  return {
    myData: {
      name: '' // 先占个坑
    }
  }
}

适合场景:属性比较固定的情况

方案2:Vue.set / this.$set(推荐)

javascript 复制代码
this.$set(this.myData, 'name', '我')

这是Vue提供的官方解决方案,就像拿着大喇叭告诉Vue:"注意啦!这个对象有新属性啦!"

方案3:Object.assign(整体替换)

javascript 复制代码
this.myData = Object.assign({}, this.myData, { name: '我' })

相当于给对象换个"新马甲",Vue就能识别到变化了。

四、生命周期里的玄机

重点来了!如果你想在组件初始化时就添加动态属性,必须在created或mounted之后

javascript 复制代码
created() {
  // 这里可以!
  this.$set(this.myData, 'initTime', new Date())
}

beforeCreate() {
  // 这里不行!data还没初始化
  // this.myData → undefined
}

五、Vue3的福利

如果你在用Vue3,直接上reactive:

javascript 复制代码
import { reactive } from 'vue'

setup() {
  const myData = reactive({})
  myData.name = '我' // 随便加,都响应!
  return { myData }
}

Proxy就是香啊!(不过这是后话了)

六、实际开发中的建议

  1. 尽量提前声明重要属性
  2. 动态添加用$set
  3. 复杂场景可以考虑用Vuex/Pinia管理状态

最近在项目中我就遇到个坑:表格的扩展行数据需要动态加载,没用$set导致更新异常,排查了半天才发现是这个问题...

大家有没有类似的经历?欢迎在评论区分享你的踩坑故事~ 觉得有用的话点个赞呗,下次接着分享更多Vue小技巧!

⭐ 写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

✅ 一起探讨技术加qq交流群:906392632

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

相关推荐
阿蒙Amon6 小时前
TypeScript学习-第7章:泛型(Generic)
javascript·学习·typescript
睡美人的小仙女1276 小时前
Threejs加载环境贴图报错Bad File Format: bad initial token
开发语言·javascript·redis
fanruitian6 小时前
uniapp android开发 测试板本与发行版本
前端·javascript·uni-app
rayufo7 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
RANCE_atttackkk7 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
摘星编程7 小时前
React Native + OpenHarmony:Timeline垂直时间轴
javascript·react native·react.js
2501_944525548 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
jin1233229 小时前
React Native鸿蒙跨平台完成剧本杀组队详情页面,可以复用桌游、团建、赛事等各类组队详情页开发
javascript·react native·react.js·ecmascript·harmonyos
李白你好9 小时前
Burp Suite插件用于自动检测Web应用程序中的未授权访问漏洞
前端
经年未远10 小时前
vue3中实现耳机和扬声器切换方案
javascript·学习·vue