Vue 数据响应式的理解

164 阅读1分钟

谈起Vue的数据响应式, 响应式其实就是我打你一下你给我一个反应说有点疼,在Vue中数据的响应式是一个在开发的时候写起来很爽的一个事情, 但是在学习的时候还是需要理解一下 数据响应式到底是个什么, 怎么来处理的

Object.defineProperties 配合 getset

let data = {}
data._n = 1
Object.defineProperty(data, 'n', {value: 1}) {
    get () {
        return this._n
    }
    set(value){
        this._n = value
    }
}

在这里使用 Object.definePropertydata 属性进行劫持, 当需要获取的时候, 就会通过Object.definePropertyget 方法 获取到 data_n 的值, 需要修改的时候就会使用set 方法去修改数据的值, 当然这样也是有缺点的,比如可以随便修改data的数据, 或者我们需要响应式的数据是一个对象, 这些属性在之前没有定义,那还会是响应式的嘛?

代理模式

let data3 = proxy({ data:{n:0} })

 function Proxy({data}) {
     const obj = {}
     data._n = 1
     Object.defineProperty(obj, 'n', {value: 1}) {
        get () {
            return data.n
        }
        set(value){
            this.n = value
        }
    }
 }

在这里使用了一个闭包对变量形成了一个保护, 其实在我们 new Vue({options})的时候, Vue内部就是做了类似一件事情, 在options 中提供的data 进行了劫持, 当然这样是有缺点的, Vue, 其实也给出了解决办法 就是 Vue.setthis.$set()

数组的变异方法

对于数组, Vue 内部进行了修改, 有部分数组的API 是可以是响应式的,一起来看看

class VueArray extends Array {
    push(...args){
        consgt oldLength = this.length
        super.Array.push(...args)
        for(let i=oldLength; i< this.length;i++) {}
        Vue.set(this, i, this[i])
    }
}