doT.js 模板引擎

502 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

doT.js 模板引擎

1、找到提供好的doT.json 文件,作为数据放进项目中

2、创建展示数据的html文件

通过ajax获取json数据,

在页面中动态的通过点击把数据展示在页面中

show_data.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
​
    <style>
        li{
            list-style: none;
        }
        div{
            border-bottom: 3px solid #999;
            padding-bottom: 10px;
            width: 400px;
        }
        img{
            width: 390px;
        }
    </style>
</head>
<body>
    <button onclick="show()">展示数据</button>
​
    <ul id="list">
​
    </ul>
​
    <script>
        function show(){
            var ajax_ = new XMLHttpRequest || new ActiveXObject('Microsoft.XMLHTTP');
            ajax_.open('get','./doT.json',true);
            ajax_.send();
​
            ajax_.onreadystatechange = function(){
                if(ajax_.readyState == 4){
                    if(ajax_.status== 200){
                        var res = JSON.parse(ajax_.responseText);
                        console.log(res);
​
                        //把数据渲染到页面上
                        render_html(res);
                    }
                }
            }
​
            function render_html(v){
                var str = '';
                for(var i=0;i<v.list.length;i++){
                    str+= '<li>';
                    str+='<p>'+v.list[i].imgtitle+'</p>'
                    str+='<img src="'+v.list[i].imgurl+'" alt="">'
                    str+='<div>'+v.list[i].note+'</div>'
                    str+= '</li>';
​
                    var list_ = document.getElementById('list');
                    list_.innerHTML = str;
                }
            }
​
​
        }
    </script>
</body>
</html>

通过上面的方式完成了页面的更新,我们发现字符串的拼接非常的繁琐。。。。。

复制showData.html,使用doT模板引擎来实现

1、在html页面中复制引入doT.js

 <script src="../doT.min.js"></script>

2、找到数据源

即使用ajax接收到的数据

<script>
        function show() {
            var ajax_ = new XMLHttpRequest || new ActiveXObject('Microsoft.XMLHTTP');
            ajax_.open('get', './doT.json', true);
            ajax_.send();
​
            ajax_.onreadystatechange = function () {
                if (ajax_.readyState == 4) {
                    if (ajax_.status == 200) {
                        /* 2、得到数据源 */
                        var res = JSON.parse(ajax_.responseText);
                        console.log(res);
​
                        /* 5.调用方式 */
                        // var tmpText = doT.template(模板);
                          // tmpText(数据源);
                        var tmpText = doT.template(document.getElementById('li_tmpl').innerText);
                        document.getElementById('list').innerHTML =  tmpText(res.list);
                    }
                }
            }
​
​
​
        }
    </script>

3、找到展示区域

 <button onclick="show()">展示数据</button>
​
    <!-- 3、展示区域 -->
    <ul id="list">
​
    </ul>

ul就是我们的展示区域

4、准备模板

    <!-- 4、准备模板  模板id是自定义的 -->
<script id="li_tmpl" type="text/x-dot-template">
​
​
</script>

5、调用方式:

  ajax_.onreadystatechange = function () {
                if (ajax_.readyState == 4) {
                    if (ajax_.status == 200) {
                        /* 2、得到数据源 */
                        var res = JSON.parse(ajax_.responseText);
                        console.log(res);
​
                        /* 5.调用方式 */
                        // var tmpText = doT.template(模板);
                          // tmpText(数据源);
                        var tmpText = doT.template(document.getElementById('li_tmpl').innerText);
                        document.getElementById('list').innerHTML =  tmpText(res.list);
                    }
                }
            }

6、展示数据

  <!-- 4、准备模板  模板id是自定义的 -->
    <script id="li_tmpl" type="text/x-dot-template">
        <!-- 6、展示数据 -->
        {{~it:value:index}}
        <li>
            <p>{{= value.imgtitle}}</p>
            <img src="{{= value.imgurl}}" alt="">
            <div>{{= value.note}}</div>
        </li>
        {{~}}
​
    </script>

官网:

github.com/olado/doT

下载、项目(页面)中引入doT.js

doT.js详细使用介绍

使用方法:

{{= }} for interpolation 赋值

{{ }} for evaluation

{{~ }} for array iteration 循环

{{? }} for conditionals 判断

{{! }} for interpolation with encoding

{{# }} for compile-time evaluation/includes and partials

{{## #}} for compile-time defines

渲染,模版中传入的变量引用,都需要通过 it.变量名 进行引用

it:你传入的数据本身

调用方式:

var tmpText = doT.template(模板);

tmpText(数据源);

例子一:

1、for interpolation 赋值

格式:

{{= }}

数据源(ajax请求过来的数据):{"name":"Jake","age":31}

区域(数据展示的区域):

<div id="interpolation"></div>

模板(数据展示的模板):

<script id="interpolationtmpl" type="text/x-dot-template">
<div>Hi {{=it.name}}!</div>
<div>{{=it.age || ''}}</div>
</script>

调用方式:

var dataInter = {"name":"Jake","age":31};
​
var interText = doT.template($("#interpolationtmpl").text());
$("#interpolation").html(interText(dataInter));

例子二:

2、for evaluation for in 循环

格式:

{{ for var key in data { }}

{{= key }}

{{ } }}

数据源:{"name":"Jake","age":31,"interests":["basketball","hockey","photography"],"contact":{"email":"jake@xyz.com","phone":"999999999"}}

区域:

<div id="evaluation"></div>

模板:

<script id="evaluationtmpl" type="text/x-dot-template">
{{ for(var prop in it) { }}
<div>KEY:{{= prop }}---VALUE:{{= it[prop] }}</div>
{{ } }}
</script>

调用方式:

var dataEval = {"name":"Jake","age":31,"interests":["basketball","hockey","photography"],"contact":{"email":"jake@xyz.com","phone":"999999999"}};
​
var evalText = doT.template($("#evaluationtmpl").text());
​
$("#evaluation").html(evalText(dataEval));

例子三:

3、for array iteration 数组

格式:

{{~data.array :value:index }}

...

{{~}}

数据源:{"array":["banana","apple","orange"]}

区域:

<div id="arrays"></div>

模板:

<script id="arraystmpl" type="text/x-dot-template">
{{~it.array:value:index}}
<div>{{= index+1 }}{{= value }}!</div>
{{~}}
</script>

调用方式:

var dataArr = {"array":["banana","apple","orange"]};
​
var arrText = doT.template($("#arraystmpl").text());
​
$("#arrays").html(arrText(dataArr));

例子四:

4、{{? }} for conditionals 条件

格式:

{{? }} if

{{?? }} else if

{{??}} else

{{? }} 结尾

数据源:{"name":"Jake","age":31}

区域:

<div id="condition"></div>

模板:

<script id="conditionstmpl" type="text/x-dot-template">
{{? !it.name }}
<div>Oh, I love your name, {{=it.name}}!</div>
{{?? !it.age === 0}}
<div>Guess nobody named you yet!</div>
{{??}}
You are {{=it.age}} and still dont have a name?
{{?}}
</script>

调用方式:

var dataEncode = {"uri":"http://bebedo.com/?keywords=Yoga","html":"<div style='background: #f00; height: 30px; line-height: 30px;'>html元素</div>"};
var EncodeText = doT.template($("#encodetmpl").text());
$("#encode").html(EncodeText(dataEncode));

例子五:

5、for interpolation with encoding 用于带编码的插值

数据源:{"uri":"bebedo.com/?keywords=Y…"}

格式:

{{!it.uri}}

区域:

<div id="encode"></div>

模板:

<script id="encodetmpl" type="text/x-dot-template">
Visit {{!it.uri}} {{!it.html}}
</script>

调用方式:

var dataEncode = {"uri":"http://bebedo.com/?keywords=Yoga","html":"<div style='background: #f00; height: 30px; line-height: 30px;'>html元素</div>"};
var EncodeText = doT.template($("#encodetmpl").text());
$("#encode").html(EncodeText(dataEncode));

例子六:

6、{{# }} for compile-time evaluation/includes and partials

{{## #}} for compile-time defines

数据源:{"name":"Jake","age":31}

区域:

<div id="part"></div>

模板:

<script id="parttmpl" type="text/x-dot-template">
{{##def.snippet:
<div>{{=it.name}}</div>{{#def.joke}}
#}}
{{#def.snippet}}
{{=it.html}}
</script>

调用方式:

var dataPart = {"name":"Jake","age":31,"html":"<div style='background: #f00; height: 30px; line-height: 30px;'>html元素</div>"};
var defPart = {"joke":"<div>{{=it.name}} who?</div>"};
var partText = doT.template($("#parttmpl").text(), undefined, defPart);
$("#part").html(partText(dataPart));