Vue2 数据响应式

64 阅读1分钟

一、Vue中的数据响应式是什么?


响应式顾名思义,会做出相应的反应或者动作。 Vue中的数据响应式也一样,不过其主要是针对 data

Vue的 data 是响应式:

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

  • 如果修改 vm.n 那么 ui 中的 n 就会响应

  • Vue2 通过 Object.defineProperty()来实现数据响应式

在此之前可能要了解一点 getter、setter、defineProperty()的用法 MDN


对数据进行添加新数据和监听变动

let data2 = {}

 


data2._a= 0 // _n 用来存储 a 的值

 


Object.defineProperty(data2, 'n', {

 get(){

  return this._a

 },

set(value){

 if(value < 0) return

 this._a = value

 }

})

使用代理

let myData5 = {b:0}

let data5 = proxy({ data:myData5 }) // 括号里是匿名对象,无法访问

  


function proxy2({data}){

  let value = data.b

  Object.defineProperty(data, 'b', {

  get(){

  return value

  },

  set(newValue){

  if(newValue<0)return

  value = newValue

  }

})

// 就加了上面几句,这几句话会监听 data

  


const obj = {}

Object.defineProperty(obj, 'n', {

get(){

return data.n

},

set(value){

if(value<0)return//这句话多余了

data.n = value

}

})

return obj // obj 就是代理

}

总结

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

  • vm会成为 mydata 的代理
  • 会对mydata的所有属性进行监控
  • 监控是为了实时更新渲染render(data)

Vue.set 和 vm.$set

作用:

  1. 新增key
  2. 自动创建代理和监听
  3. 触发ui更新

举例 Vue.set(this.obj, 'a', 2)