Proxy模拟Vue双向数据绑定

Vue原理


众所周知

  • Vue的模式是m-v-vm模式,即(model-view-modelView),通过modelView作为中间层(即vm的实例),进行双向数据的绑定与变化。
  • 而实现这种双向绑定的关键就在于:Object.defineProperty和订阅——发布者模式这两点。

下面我们通过Proxy对象的方式来模拟双向数据绑定

这个例子中的原理: 通过代理对象的set访问器.当表单的发生变化时,会往对象中添加值,从而触发set访问器函数
通过set属性访问器将获取来的数据再添加到需要修改的dom元素中.


html代码

 <!-- 下面的 两个表单任意一的一项值发生改变 其他的都会变化 -->
  <input type="text" v-model="title">
  <input type="text" v-model="title">

  <!-- p标签绑定名为title,这里面的数据随着model值为title的数值变化而变化 -->
  <p v-bind="title">这里发生更新</p>

Javascript代码

  function View() {

      // 设置代理的对象,可以将改对象理解为数据的容器
      let proxy = new Proxy({}, {

        // 当通过下面的 init方法后,会触发set访问器,使用代理的目的就是模拟vue的Watcher,2个表单中任意一个数据发生修改时,就会触发set函数.
        set(target, property, value) {
          console.log(value);
          document.querySelectorAll(`[v-model="${property}"]`).forEach(ele => {
            ele.value = value
          })
          document.querySelectorAll(`[v-bind="${property}"]`).forEach(ele => {
            ele.innerText = value 
          })

        }
      })
      // init方法
      this.init = function () {
        let els = document.querySelectorAll("[v-model]")
        els.forEach(ele => {
          ele.addEventListener("keyup", function () {
            proxy[this.getAttribute("v-model")] = this.value
          })
        })
      }
    }
    new View().init()

效果如下:

博客园
掘金


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值