不得不爱的前端知识

前端模板渲染原理小试牛刀

2018-01-20  本文已影响0人  403undefined

今天简单对常见的前端模板数据渲染进行一个小小的解析

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
       <div>你好 名字是{{name}}</div>
    </div>
</body>
<script>
  let data = {
    name:'hello name'
  }
</script>
</html>

问题

如何把{{name}}和想对应的数据进行渲染?

实现方法compile

function compileDemo(el, data) {
    let init = document.querySelector(el)//获取指定元素
    let Fragment = document.createDocumentFragment() //创造Fragment对象用来对#app下的内容进行操作
    for (; init.firstChild;) {
    //将el下内容存入Feagment中
        let child = init.firstChild
        Fragment.appendChild(child)
    }
    replace(Fragment)
    function replace(frg) {
        Array.from(frg.childNodes).forEach(node => {
        //遍历传入内容的子节点  
            let Text = node.textContent;
      //取出节点文本内容
            let Reg = /\{\{(.*)\}\}/;
    //编写匹配{{}}正则
            if (node.nodeType === 3 && Reg.test(Text)) {
        //如果该节点为文本节点&&内容可以跟正则进行匹配进行一下操作
                let value = data[RegExp.$1] //取出匹配到的值 name
                node.textContent = Text.replace(/\{\{(.*)\}\}/, value) //将节点的文本内容进行替换
            }
            if (node.childNodes) {
    //如果该节点还存在子节点 重复操作
                replace(node)
            }
        })
    }
//在Feagment替换完毕后重新插入指定元素
    init.appendChild(Fragment)

    console.log(Fragment)
}
上一篇下一篇

猜你喜欢

热点阅读