Vue数据响应式

原文链接:https://www.jianshu.com/p/4394009f53b9

Vue是怎么做到在我们更新了data之后就更新视图的呢?
在我们new Vue 之后,生成的实例就是data的代理,data一发生改变,就会被setter知道这个时候就帮我们去更新视图。

什么是getter&setter?
let= {: "孙",: "笑川",
  get 姓名(){
      return `我叫${this.}${this.}`
  },
  set 姓名(arr){
    this.= arr[0]
    this.= arr[1]
  }
}

只要在函数上加了get,可以这样去调用:

我.姓名   //输出 孙笑川

只要在函数上加了set,可以这样去设置:

我.姓名 = ["吴","彦祖"]
我.姓 //   吴
我.名 //   彦祖
Object.defineProperty

如果要给"我"这个对象,添加一新的可以get/set的属性"长的帅"

let _长的帅 = null
Object.defineProperties(,'长的帅',{
  get(){
    return _长的帅
  },
  set(value){
    _长的帅 = value
  }
})

这样就可以设置"我"的"长的帅"属性了

我.长的帅 = true

看上去这样做并没有什么好处,实际上是有的,比如我可以禁止设置"我"的"长的帅"属性为false

let _长的帅 = null
Object.defineProperties(,'长的帅',{
  get(){
    return _长的帅
  },
  set(value){
    if(value==false) return
    _长的帅 = value
  }
})

但其他人也是可以通过这种方法去改"长的帅"属性的,这个时候就需要上代理

function proxy({ data }) {
  Object.defineProperty(, "长的帅", {
    get() {
      return data.长的帅;
    },
    set(value) {
      if (value == false) return;
      data.长的帅 = value;
    }
  });
  return;
}= proxy({ data: { 长的帅: undefined } });

但是这样还不算安全,如果我要设置一个复杂的对象,想用外部变量,这样还是会被修改,比如这样

function proxy2({ data }) {
  let value = data.长的帅
  Object.defineProperty(data, "长的帅", {
    get() {
      return value;
    },
    set(newValue) {
      if (newValue == false) return;
      value = newValue;
    }
  });
  Object.defineProperty(, "长的帅", {
    get() {
      return data.长的帅;
    },
    set(value) {
      if (value == false) return;
      data.长的帅 = value;
    }
  });
  return;
}

这样就安全了,被代理的对象发生变化时会被setter知道,修改的数据就都要经过它的手,它收到数据后就会去更新视图。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值