vue2缺陷--为对象直接新增属性或为数组通过下标操作数组项,页面无法触发更新解决方法

Vue 2 使用 Object.defineProperty 实现响应式,这导致它无法检测到对象属性的直接添加或删除,以及通过索引直接设置数组项的变化。

对象新增属性问题

<template>
  <div>
    <p>用户信息:{{ user }}</p>
    <button @click="addProperty">添加新属性</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        name: '张三',
        age: 25
      }
    }
  },
  methods: {
    addProperty() {
      // 直接添加新属性不会触发视图更新
      this.user.gender = '男';
      console.log(this.user); // 控制台能看到gender属性,但视图不会更新
      
      // 正确做法:使用Vue.set或this.$set
      // this.$set(this.user, 'gender', '男');
    }
  }
}
</script>

数组通过下标操作问题

<template>
  <div>
    <p>列表:{{ items }}</p>
    <button @click="updateItem">更新第一项</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['苹果', '香蕉', '橙子']
    }
  },
  methods: {
    updateItem() {
      // 通过索引直接修改数组项不会触发视图更新
      this.items[0] = '西瓜';
      console.log(this.items); // 控制台能看到变化,但视图不会更新
      
      // 正确做法:
      // 1. 使用Vue.set或this.$set
      // this.$set(this.items, 0, '西瓜');
      
      // 2. 使用数组的变异方法
      // this.items.splice(0, 1, '西瓜');
    }
  }
}
</script>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容