美文网首页不得不爱的前端知识
前端模板渲染原理小试牛刀

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

作者: 403undefined | 来源:发表于2018-01-20 16:22 被阅读0次

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

    • demo1
    <!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)
    }
    

    相关文章

      网友评论

        本文标题:前端模板渲染原理小试牛刀

        本文链接:https://www.haomeiwen.com/subject/tgytaxtx.html