vue2 与 vue3双向数据绑定的理解

vue2 双向数据绑定原理是通过Object.definedProperty()实行数据劫持,结合observer() 观察者,来实现

<div>
    姓名:<span id="spanName"></span>
  </div>
  <input id="inputName" type="text">
<script>
  let obj={name: ''}
  // 深拷贝obj  防止在get()里return obj.name 时死循环
  let newObj = JSON.parse(JSON.stringify(obj))
  Object.defineProperty(obj, 'name', {
    get(){
      // console.log('获取')
      return newObj.name
    },
    set(val){
      // console.log('设置')
      // 这次的值如果和之前的一样,就不往下操作了
      if(val === newObj.name) return
      newObj.name = val
      observer()
    }
  })
  function observer(){
    spanName.innerHTML = obj.name
    inputName.value = obj.name
  }
  setTimeout(()=> {
    obj.name = 'hhhh'
  },3000)
  inputName.oninput = function (){
    obj.name = this.value
  }

  // tip: 1.需要对原始数据进行克隆
  //      2.需要监听对象中的每一个属性
</script>

在这里插入图片描述
修改输入框内容,视图是跟着变化的

vue3 是通过3.0新增的Proxy 来实现

 // vue3.0
  let obj={ }
  // Proxy 可以监听对象中的所有属性
  obj = new Proxy(obj, {
    get(target,prop){
      return target[prop]
    },
    set(target,prop,value){
      target[prop] = value
      observer()
    }
  })

  function observer(){
    spanName.innerHTML = obj.name
    inputName.value = obj.name
  }
  setTimeout(()=> {
    obj.name = 'hhhh'
  },3000)
  inputName.oninput = function (){
    obj.name = this.value
  }

B站看别人视频学到的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值