20_Vue如何监测数组类型数据发生改变的?( 二 )

  • 但是这个添加的属性 , 最后会挂载在vue实例身上
  • 所以 , 这里使用.set是不允许的 , 不能直接添加
  • .set()不能在data当中直接添加属性
  • 只能给data当中的某个对象(student)添加属性
  • vm是不能作为target的 , vm当中的data , 也不能作为target
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    监测数组准备工作
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    • 新建一个demo , 重新配置了数据项data
    • 在data当中有两个属性 , 一个numbers的数组 , 一个student的对象
    • 我们查看vue实例对象 , 在查看之前可以很明确的说 , numbers 和 student 都挂载在了vue实例身上 , 并且 , 有专门为他俩服务的get和set

    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    数据代理
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    现在我们点击去看看二者有什么不同 , 或者说 , vue当中对数组和对象类型的数据是如何代理的
    数组和对象的不同数组
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    对象
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    区别 , 目前而言
    1. 数组当中的数据 , 是没有进行数据代理的 , 没有专门为 元素 服务 的 get和set
    2. 而对象当中 , 每个属性都是有get和set的 , 哪怕这个属性是对象也有
    3. 也就是说 , 如果我们直接在vue当中直接修改numbers对应索引的值 , vue是观测不到的
    直接修改numbers我们写一串DOM元素进行测试
    <div class="app"><ul><li v-for="item in numbers">{{item}}</li></ul></div>
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    现在 , 我直接在控制台中对数组当中的元素进行修改
    我们将最后一项 从5改为6
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    数据的确修改成功了 , 但是vue检测不到 , 页面无法响应
    之前的错误解释现在 , 我们来回顾一下之前遇到的bug , 我们添加一个persons对象数组
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    从控制台我们来观察一下这个persons
    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    1. 这是一个对象数组 , 这个数组当中的每一项数据 , 都没有被进行数据代理
    2. 但是因为每一项 数据 都是对象类型 , 所以 在对象类型当中 数据是进行了代理(get和set)的

      • 20_Vue如何监测数组类型数据发生改变的?

        文章插图
    3. 这里很重要 , 请仔细看

    20_Vue如何监测数组类型数据发生改变的?

    文章插图
    所以为什么下面的修改不起作用 , 因为根本没代理 , 没有代理无法完成响应式数据
    这个问题解决了顺势抛出下一个问题 , vue怎么就知道数组内部的属性发生改变了呢 , 它是如何监测到的?
    vue如何监测?
    20_Vue如何监测数组类型数据发生改变的?

    经验总结扩展阅读