【vue高级】MVVM实现原理 第三篇 编译模板Compile

【vue高级】MVVM实现原理 第一篇 Object.defineProperty
【vue高级】MVVM实现原理 第二篇 数据劫持Observe
【vue高级】MVVM实现原理 第三篇 编译模板Compile
我们已经有了数据,接下来就是要用数据替换掉html中的插值,以 {{}} 为例
先把数据写复杂一点点

data: {
	a: { a: 1 },
	b: 2,
},

页面结构也复杂一点点

<div id="app">
	<p>{{a.a}}</p>
	<p>{{b}}</p>
</div>

现在页面显示是这样
在这里插入图片描述
我们需要编译一下,编译文档内容,自然需要文档dom和vue实例
我们要把它拿到文档碎片中去操作

function Compile(el, vm) {
  // el 表示替换的范围
  vm.$el = document.querySelector(el)
  let fragment = document.createDocumentFragment()
  while (child = vm.$el.firstChild) { // 将app 中的内容移入到内存中
    fragment.appendChild(child)
  }
}

现在,我们再刷新浏览器,会发现,页面空了,是因为都拿到内存中去了,接下来我们把它塞回去

vm.$el.appendChild(fragment)

但不能原封不动的塞回去,得先匹配到插值进行替换后再塞回去,替换方法如下:

function replace(fragment) {
    Array.from(fragment.childNodes).forEach(function (node) {
      // 循环每一层
      let text = node.textContent
      let reg = /\{\{(.*)\}\}/
      if (node.nodeType === 3 && reg.test(text)) {
        let arr = RegExp.$1.split('.')
        let val = vm
        arr.forEach(function (k) {
          val = val[k]
        })
        console.log(val);
        node.textContent = text.replace(/\{\{(.*)\}\}/, val)
      }
      if (node.childNodes) {
        replace(node)
      }
    })
  }

刷新浏览器,我们就能看到编译成功,插值替换成了真正想要显示的数据
在这里插入图片描述

但这时候,我们修改属性值,会发现页面并没有随着更新,这就要实现编译和数据劫持搭配起来运用,作为下一篇的内容进行讲解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的犟驴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值