Vue的数据响应式

Posted justcho

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue的数据响应式相关的知识,希望对你有一定的参考价值。

getter和setter怎么用

示例代码
getter ,关键词为 get ,用于获取一个值。定义时为函数,但是使用时不用加括号。
?setter 用于对数据的改写

Object.defineProperty

示例代码
可以给对象添加属性value
可以给对象添加getter / setter
getter / setter用于对属性的读写进行监控


代理:
对myData对象的属性读写,全权由另一个对象vm负责
那么vm就是myData的代理
用vm.n来操作myData.n

vue 对 data 做了什么


当你创建一个实例时

const vm = new Vue({data: myData})

vue 会让 vm 成为 myData 的代理。
vue 会对 myData 的所有属性进行监控。
目的
你可以使用 this 来访问到 vm。 this.n === myData.n
之所以要监控,就是防止 vue 无法得知 myData 的属性变化。
vue 得知属性变化才可以使用 render(data) 来更新 UI 和渲染页面。

数据响应式

响应式即对外界的变化做出的反应的一种形式。

const vm = new Vue({data:{n: 0}})

当修改 vm.n 或 data.n 时,render(data...) 中的 n 就会做出响应的响应。
这个联动的过程就是 vue 的 数据响应式。
vue 目前通过 Object.defineProperty 来实现数据响应式。

在 data 中添加属性

Vue 虽然对 data 中的属性(或对象中的属性)进行监听和代理,但是它却没有办法进行事先的监听和代理。
如果你在初始化 data 之后再添加属性,该如何实现?

一般对象

对于一般的对象来说,可以在 data 中预先把所有可能用到的属性全部写出来,这样并不需要新增属性,只需要改它。
也可以通过其他方法来添加属性。
在了解以上原理后,我们来了解 Vue 提供的一个 API:

Vue.set(object, key, value)

this.$set(object, key, value)

作用

  • 在 data 中添加新的属性。
  • 自动创建为它创建代理和监听(如果没有创建过)。

示例:

const Vue = window.Vue

new Vue({
    data: {
        obj: {
            a: 0
        }
    },
    template: `
    <div>
      {{obj.b}}
      <button @click=‘one‘>One</button>
    </div>
    `,
    methods: {
        one() {
            Vue.set(this.obj, ‘b‘, 1)
            // 或 this.$set(this.obj, ‘b‘, 1)
        }
    }
}).$mount(‘#app‘)

数组

因为数组本身的特殊性:数组的长度无法预测(比如所有用户的用户名,存在数组中),你无法使用 undefined 去为每一项占位,或一直使用 Vue.set( )方法。

  • 你可以使用 push 方法 this.array.push(‘value‘),但其实数组已经被 Vue 包装了新的 push 方法。
  • 原理就是声明一个新的类来继承数组。
  • 各种在 Vue 实例 中使用的特例方法, 详见数组变异方法,一共有7个API。
  • 这些方法 (API) 会自动处理对数组该项的监听和代理,并触发视图更新。




以上是关于Vue的数据响应式的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段10—— 数组的响应式方法

Vue 数据响应式原理

简单对比vue2.x与vue3.x响应式及新功能

Vue的数据响应式

手摸手带你理解Vue响应式原理

Vue源码分析基础之响应式原理