Vue 数据响应式理解

128 阅读1分钟

数据响应式

响应式

响应式即对外界变化做出反应的一种形式,数据改变,UI页面做出响应。声明一个Vue实例,如:const vm = new Vue({data:{n: 0}});

当修改 Vue 实例中的 data 时,UI页面中的 data 会做出响应。这个联动的过程就是vue的数据响应式。vue目前通过Object.defineProperty来实现数据响应。vm相当于data的代理。

new Vue({
    data: { n: 0 }, 
    template: ` 
    <div> {{n}} 
    <hr/>
    <button @Click ="add">+1</button/> </div> 
    `, 
      methons: { add(){ this.n += 1; 
      }
     } 
  }).$mount("#app")

上面代码就是数据的响应式,当我点击按钮,n的值就会加1

响应式的原理

Vue.js的响应式原理依赖于Object.defineProperty,Vue通过设定对象属性的 setter/getter 方法来监听数据的变化,通过getter进行收集,通过setter在数据变更的时候通知订阅者更新视图。

let myData = {n:0}
let data1= proxy({ data:myData }) // 括号里是匿名对象,无法访问

function proxy({data}){//解构赋值
  let value = data.n
  Object.defineProperty(data, 'n', {
    get(){
       return value
      },
    set(newValue){
       if(newValue<0)return
       value = newValue 
       } 
    }) 
      //这几句话会监听 data
    const obj = {}
    Object.definePropert(obj,'n',{
      get(){
         return data.n  
      },
      set(value){
        if(value<0)return
        data.n = value
      }
    }),
    return obj//obj是代理