实现简约版本的 vue

<body>

  <h3 v-html="msg"></h3>
  <input type="text" v-model="msg">


  <script>
    // 初始化数据 -- vue优化,扁平化数据
    let data = {
      msg: 'hello',
      user: { id: 100 }
    }

    // 劫持或代理
    observer(data)
    // 编译模板
    compileTmeplate(data)

    function compileTmeplate(target) {
      /* document.querySelectorAll('[v-model]').forEach(node => {
        console.log(node)
      }) */
      document.querySelectorAll('*').forEach(node => {
        [...node.attributes].forEach(attr => {
          if (/^v-/.test(attr.name)) { // 双向绑定所要用到的属性
            if (attr.name === 'v-model') {
              node.value = target[attr.nodeValue]
              // 表单项,事件和数据绑定
              node.addEventListener('input', function () {
                // 更新数据
                target[attr.nodeValue] = this.value.trim()
              })
            } else {
              node.innerHTML = target[attr.nodeValue]
            }
          }
        })
      })
    }


    function observer(target) {
      if (Object.prototype.toString.call(target) != '[object Object]') return;
      for (let key in target) {
        defineReactive(target, key, target[key])
      }
    }

    // 代理
    function defineReactive(target, key, value) {
      observer(value)
      Object.defineProperty(target, key, {
        get() {
          console.log('get')
          return value
        },
        set(val) {
          console.log('set')
          if (val != value) {
            document.querySelectorAll('[v-html]').forEach(node => {
              node.innerHTML = val
            })
            document.querySelectorAll('[v-model]').forEach(node => {
              node.value = val
            })
            value = val
          }
        }
      })
    }





  </script>
</body>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值