vue2——实现MVVM

<body>
  <div id="app">
    <h2 v-html='salary'></h2>
    <input type="text" v-model='salary'>
  </div>

  <script>
    // 定义事件中心的构造函数
    function EventCenter () {
      this.guanjia = {}
    }
    EventCenter.prototype.$on = function(eventname,fn){
      if(this.guanjia[eventname]) {
        this.guanjia[eventname].push(fn)
      }else{
        this.guanjia[eventname] = []
        this.guanjia[eventname].push(fn)
      }
    }
    EventCenter.prototype.$emit = function (eventname){
      if(this.guanjia[eventname]){
        this.guanjia[eventname].forEach(fn=>{
          fn()
        })
      }
    }
    // 创建事件中心实例
    var ec = new EventCenter()

    // 定义构造函数
    function MVVM (options) {
      let {el,data} = options
      for (let key in data) {
        Object.defineProperty(this, key,{
        // 因为this指向实例对象,所以属性都挂载到了实例对象下,直接用this.salary就能访问data下的salary
          get(){
            return data[key]
          },
          set (val) {
            if(val !== data[key]){
              data[key] = val
              // 实现数据到视图;值改变,触发事件中心guanjia[key]下的所有函数
              ec.$emit(key)
            }
          }
        })
      }
      // 获取当前节点及遍历子节点
      let rootDom = document.querySelector(el)
      Array.from(rootDom.children).forEach(node=>{
        if(node.hasAttribute('v-html')){
          let attrVal = node.getAttribute('v-html')
          // 给事件中心guanjia[v-html] push 函数() => { node.innerHTML = this[attrVal]}
          ec.$on(attrVal, () => {
            node.innerHTML = this[attrVal]
          })
        }
        if(node.hasAttribute('v-model')){
          let attrVal = node.getAttribute('v-model')
          ec.$on(attrVal, () => {
            node.value = this[attrVal]
          })
          // 实现视图到数据
          node.addEventListener('input', e => {
            // 1) 获取当前的输入值
            let val = e.target.value
            // 2) 把值保存到数据项中
            this[attrVal] = val
          })
        }
      })
    }

   const vm = new MVVM({
     el:'#app',
     data:{
       salary:1500
     }
   })
  </script>
</body>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值