Vue的双向绑定, model如何改变view的, view是如何影响model的

139 阅读2分钟

这是我参与更文挑战的第5天,活动详情查看: 更文挑战
在这里呢, 我们分成两个内容说 一个是vue2的deflrPrperty和vue3的proxy

vue2 defineProperty

获的值 get

class Vue{
  constructor(options){
    const {data} = options  //解构data
    const _data = data;  // 保存 data里面的值

    //由于 我们并不知道里面的值是多少, 所以必须通过循环的方式 取出里面的值

    for (const key in _data) {
    
    //这里的this就相当 我给vm.绑定了a, b, c 这几个属性(之前是没有这几个属性的)
      Object.defineProperty(this, key, {
        get(){
          return _data[key]
        },
        set(){},
      })
    }

  }
}

let vm = new Vue({
  data(){
    return {a: 12, b: 89, c: 5}
  }
})

console.log(vm.a); // 12
console.log(vm.b); // 89
console.log(vm.c); // 5

而这时 我们就获得了值 但是 我们还不能对数值 进行更改 毕竟你set里面都没有内容啊

更改值 set

set里面需要接收一个参数 newValue 我们继续之前的操作

class Vue{
  constructor(options){
    const {data} = options  //解构data
    const _data = data;  // 保存 data里面的值

    //由于 我们并不知道里面的值是多少, 所以必须通过循环的方式 取出里面的值

    for (const key in _data) {
    
    //这里的this就相当 我给vm.绑定了a, b, c 这几个属性(之前是没有这几个属性的)
      Object.defineProperty(this, key, {
        get(){
          return _data[key]
        },
        //接收新的参数
        set(newValue){
           _data[key] = newValue
           // 通过set里面的值得 改变 而对view组件进行渲染
        },
      })
    }

  }
}

let vm = new Vue({
  data(){
    return {a: 12, b: 89, c: 5}
  }
})

console.log(vm.a); // 12
console.log(vm.b); // 89
console.log(vm.c); // 5

vue3 proxy

获取值 get


class Vue{
  construct(options){
    const {data} = options
    const _data = data(); 
    return new Proxy (_data, {

      //这里的obj 是和 _data 是一样的
      get(obj, name){
        return obj[name];
      },
    })
  }
}

let vm = new Vue({
  data() {
    return {
      a: 12, 
      b: 12,
      c: 8
    }
  },
})
window.vm = vm
console.log(mv.a); //12
console.log(mv.b); //12
console.log(mv.c); //8
console.log(mv.v); // undefined

修改值 set

class Vue{
  construct(options){
    const {data} = options
    const _data = data(); 
    return new Proxy (_data, {

      //这里的obj 是和 _data 是一样的
      get(obj, name){
        return obj[name];
      },
      set(obj, name, value){
        obj[name] = value
      }
    })
  }
}

let vm = new Vue({
  data() {
    return {
      a: 12, 
      b: 12,
      c: 8
    }
  },
})
window.vm = vm
console.log(mv.a); //12
console.log(mv.b); //12
console.log(mv.c); //8
console.log(mv.v); // undefined

总结
个人感觉 也比较好理解,也比较简单嘛!