vue 双向绑定示例

// 订阅者
function Watcher(el, props, data, key){
  this.el = el;
  this.props = props;
  this.data = data;
  this.key = key;
  this.update();
}
Watcher.prototype.update = function(){
  // 元素.属性 = 值
  this.el[this.props] = this.data[this.key];
}
// 双向绑定
Zhang.prototype.compile = function(el){
  const nodes = el.children;
  for(let i=0; i<nodes.length; i++){
    const node = nodes[i];
    this.compile(node);
    if(node.hasAttribute("z-on:click")){
      const attrValue = node.getAttribute("z-on:click");
      // call返回的是对象 bind返回的是函数
      node.addEventListener("click", this.$options.methods[attrValue].bind(this.$data));
      console.log(this.$data);
      // node.addEventListener("click", ()=>{
      //   this.$options.methods[attrValue].call(this.$data);
      // })
    }
    if(node.hasAttribute("z-html")){
      const attrValue = node.getAttribute("z-html");
      // 增加订阅者
      this.binds[attrValue].push(new Watcher(node, "innerHTML", this.$data, attrValue));
    }
    if(node.hasAttribute("z-text")){
      const attrValue = node.hasAttribute("z-text");
      // 增加订阅者
      this.binds[attrValue].push(new Watcher(node, "innerHTML", this.$data, attrValue));
    }
    if(node.hasAttribute(":value")){
      const attrValue = node.hasAttribute(":value");
      // 增加订阅者
      this.binds[attrValue].push(new Watcher(node, "value", this.$data, attrValue));
    }
    if(node.hasAttribute("z-model")){
      const attrValue = node.hasAttribute("v-model");
      node.addEventListener("input", (e)=>{
        this.$data[attrValue] = e.target.value;
      })
      // 增加订阅者
      this.binds[attrValue].push(new Watcher(node, "value", this.$data, attrValue));
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值