Vue.set()学习笔记

  • 第一种场景:
    原因:
    受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。
template:
<ul>
      <li v-for="item in arrData">{{ item.num ? item.num : item }}</li>
</ul>
    <button class="btn" @click="btnChange" type="button" name="button">更改</button>
    <button class="btn" @click="btnReplace" type="button" name="button">替换</button>
    <button class="btn" @click="btnSet" type="button" name="button">set</button>
    <button class="btn" @click="btnPush" type="button" name="button">增加</button>
methods:
btnChange() {
      this.arrData[0] = 6
      console.log('更改后', this.arrData);
    },//不会重新渲染
    btnReplace() {
      this.arrData = [7, 2, 3, 4, 5]
      console.log('替换后', this.arrData);
    },//会
    btnSet() {
      Vue.set(this.arrData, 0, 8)
      console.log('set后', this.arrData);
    },//会
    btnPush() {
      this.arrData.push({ num : 9 })
      console.log('拼接对象后',this.arrData);
    },//会
    add() {
      this.arrDataObject.forEach((item, index) => {
        this.$set(item, 'a', 'hah')
        item.a = 'hah'
      })//会
      console.log(this.arrDataObject);
    }
  • 第二种场景:
    原因:由于Vue实例创建时会遍历data里的属性,并且通过Object.defineProperty()拦截数据操作,将属性转为getter/setter,在内部使 Vue 追踪依赖,在属性被访问和修改时通知变化,由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的,所以当实例创建完成后在追加属性,则view层不能响应
const vm = new Vue({
  data: {
    a: 1
  }
})
// `vm.a` 是响应的
vm.b = 2
// `vm.b` 是非响应的

Vue.set(vm.someObject, 'b', 2)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这方面的文章很多,但是我感觉很多写的比较抽象,本文会通过举例更详细的解释。(此文面向的Vue新手们,如果你是个大牛...
    Ivy_2016阅读 15,437评论 8 64
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,079评论 0 29
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 11,097评论 4 129
  • 「声动派」,专注互联网价值传播,为你分享大连接时代的一切! 本文大约11000字阅读需要12分钟 第一部分 写在前...
    声动派阅读 635评论 0 1
  • 人的一生会遇见2920万个人。 眼镜男,老叫我小伙子,是我这家新公司的同桌,呵呵,刚打好关系,他就在被老板还是自己...
    wuli图阅读 176评论 0 0