@Wangww0925
2020-07-08T07:04:25.000000Z
字数 14956
阅读 749
模板引擎 jsRender/jsViews
使用模板,可以预先自定义一些固定格式的HTML标签,在需要显示数据时,再传入真实数据组装并展示在Web页中;避免了在JS中通过“+”等手动分割、连接字符串的复杂过程;针对高性能和纯字符串渲染进行了优化;无需依赖DOM和jQuery
官网: https://www.jsviews.com/#assigntag
jsrender.min.js 下载: https://www.jsviews.com/#download
1、元素重复出现
2、动态加载数据
JsRender对语法要求非常严格,比如for,if前面不能有空格
1、定义模板: <script type="text/x-jsrender" id="Tem"></script>
2、引入js
3、数据:要json对象
4、编译成元素:document.getElementById("XXX").render(data); 或 $("#XXX").render(data); 或$.templates("#XXX").render(data)
5、添加到容器中:使用html、append、before、after等添加
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>{{:msg}}</p></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg:"今天天气真好"}// 4、编译成元素var html = $("#Tem").render(data)// 或// var html = $.templates("#Tem").render(data)// 5、添加到容器中$("#content").html(html)</script>
使用 效果:

{{!--}} ... {{--}} 或 {{!-- ... --}}例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>{{:msg}}</p>{{!--}}<p>我是被注释掉的内容</p>{{--}}<p>啦啦啦 {{!-- 我是被注释掉的内容 --}} 啦啦</p></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg:"今天天气真好"}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
注释 效果:

使用:
文本赋值: {{:属性名}},类似 text()
原样输出: {{>属性名}},类似 html()
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>{{:msg}}</p><p>{{:love}}</p><p>{{>love}}</p> <!-- 原样输出 --><p>{{:info.name}}</p></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg:"你好",love:'<span style="color:red">花草</span>',info:{name:"www",age:"18"}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
赋值 效果:

{{if 表达式}} … {{else}} … {{/if}}例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem">{{if info.name == "www"}}<p>年龄: {{:info.age}}</p><hr>{{/if}}{{if type == "1"}}<p>消息: {{:msg}}</p>{{else type == "2"}}<p>名称: {{:info.name}}</p>{{else}}<p>年龄: {{:info.age}}</p>{{/if}}</script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg:"你好",type:'1',info:{name:"www",age:"18"}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
判断 效果:

{{:#data}} 展示数组元素内容例子
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem">{{for info}}<p>{{:#data}}</p>{{/for}}</script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {info: ['www', 'abc', '123']}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
[{},{}]例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center"><tr><th>姓名</th><th>年龄</th></tr>{{for data.info}}<tr align="center"><td>{{:name}}</td><td>{{:age}}</td></tr>{{/for}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg:"你好",type:'1',data:{id: "01",info: [{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30},{name: "ccc",age: 40},{name: "ddd",age: 50},{name: "eee",age: 60},{name: "fff",age: 70},]}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
循环 效果:

{{>key}} 获取元素名{{>prop}} 获取元素值例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center"><tr><th>姓名</th><th>年龄</th></tr>{{props info}}<tr align="center"><td>{{:prop.name}}</td><td>{{:prop.age}}</td></tr>{{/props}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {info: {"a" : {name: "www",age: 18},"b" : {name: "aaa",age: 20},"c" : {name: "bbb",age: 30}}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center"><tr><th>姓名</th><th>年龄</th></tr>{{props info}}<tr align="center"><td>{{>prop}}</td><td>{{>prop}}</td></tr>{{/props}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {info: {name: "www",name: "aaa",name: "bbb"}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
{{for 数据 ~命名=属性名}}使用:
1、添加参数,参数必须以~开头,多个参数用空格分隔2、通过参数(~命名),我们缓存了父级下的属性,在子循环中通过 {{:~命名}} 访问参数,就可以间接访问父级数据
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center" style="margin-top: 50px;"><tr><th>~infoId</th><th>~type</th><th>#data.属性名</th><th>姓名</th><th>年龄</th></tr>{{for arr.info ~type=type ~infoId=arr.id}}<tr align="center"><td>{{:~infoId}}</td><td>{{:~type}}</td><td>{{:#data.name}}</td> {{!-- #data相当于this(arr) --}}<td>{{:name}}</td><td>{{:age}}</td></tr>{{/for}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg:"你好",type:'1',arr:{id: "01",info: [{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30}]}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
循环时添加参数 效果:

#parent.parent.data.属性名注意
1、data不能省略
2、说是获取父级元素,但是好像也是从顶层找起,与~root效果一样
3、测不出获取父级元素的效果,也没有找到相关文档
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center" style="margin-top: 50px;"><tr><th>type</th><th>id</th><th>arr1.id</th><th>姓名</th><th>年龄</th></tr>{{for arr.info}}<tr align="center"><td>{{:#parent.parent.data.type}}</td><td>{{:#parent.parent.data.id}}</td><td>{{:#parent.parent.data.arr.id}}</td><td>{{:name}}</td><td>{{:age}}</td></tr>{{/for}}<tfoot><tr><td colspan="5" align="center">注意: 多级下,使用#parent.parent.data.id获取不到info父级(arr)下的id,父级好像是data,而不是arr,所以需要使用arr.id</td></tr></tfoot></table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg:"你好",type:'1',arr:{id: "01",info: [{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30}]}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
父级 #parent.parent.data.属性名 效果:

~root.属性名例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center" style="margin-top: 50px;"><tr><th>type</th><th>~root.type</th><th>姓名</th><th>年龄</th></tr>{{for arr.info}}<tr align="center"><td>{{:type}}</td><td>{{:~root.type}}</td><td>{{:name}}</td><td>{{:age}}</td></tr>{{/for}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {type:'1',arr:{info: [{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30}]}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
顶级 ~root.属性名 效果:

#getIndex() 或 #index注意: 索引从0开始
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center" style="margin-top: 50px;"><tr><th>#getIndex()</th><th>#index</th><th>姓名</th><th>年龄</th></tr>{{for arr.info}}<tr align="center"><td>{{:#getIndex()}}</td><td>{{:#index}}</td><td>{{:name}}</td><td>{{:age}}</td></tr>{{/for}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {type:'1',arr:{info: [{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30}]}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
循环获取索引 效果:

Array.length例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><table width="500px" border="1" cellpadding="0" cellspacing="0" align="center" style="margin-top: 50px;"><tr><th>姓名</th><th>年龄</th></tr>{{for arr.info}}<tr align="center"><td>{{:name}}</td><td>{{:age}}</td></tr>{{/for}}<tfoot><tr align="center"><td colspan="2">长度: {{:arr.info.length}}</td></tr></tfoot></table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {type:'1',arr:{info: [{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30}]}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
数组长度 效果:

Array[下标] 或 Array[下标].元素名例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>数组下标为2的名称 {{:arr[2].name}}</p></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {arr:[{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30}]}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
数组中指定的某个元素 Array.[下标] 效果:

例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>{{:msg}}</p>{{include info tmpl="#Tem1" /}}</script><script type="text/x-jsrender" id="Tem1"><table width="500px" border="1" cellpadding="0" cellspacing="0" style="margin-top: 20px;"><tr><th>姓名</th><th>年龄</th></tr>{{for child}}<tr align="center"><td>{{:name}}</td><td>{{:age}}</td></tr>{{/for}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg: "名单列表:",info: {child: [{name: "www",age: 18},{name: "aaa",age: 20},{name: "bbb",age: 30}]}}// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
模板嵌套模板 {{include evt tmpl="#另一个模板" /}} 效果:

使用:
// 转换器$.views.converters({func:function (type){},func1:function (val){}})// 引用{{func:属性名}}
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>{{:msg}}</p><table width="500px" border="1" cellpadding="0" cellspacing="0" style="margin-top: 20px;"><tr><th>姓名</th><th>年龄</th><th>爱好</th><th>属于</th></tr>{{for info.child}}<tr align="center"><td>{{:name}}</td><td>{{:age}}</td><td>{{:like}}</td><td>{{typeFun:type}}</td></tr>{{/for}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg: "名单列表:",info: {child: [{name: "www",age: 18,like:"玫瑰",type:"01"},{name: "aaa",age: 20,like:"松树",type:"03"},{name: "bbb",age: 30,like:"四叶草",type:"02"}]}}// 定义 转换器var str = {"01": "花","02": "草","03": "树","04": "木",}$.views.converters({typeFun: function (type){return str[type]}})// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
转换器 效果:

使用:
// 方法$.views.helpers({Fun:function (type,val){},Fun1:function (val){}})// 引用{{:~Fun(属性名1, 属性名2, ...)}}
例子: isTrue 如果为true 显示类型
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>{{:msg}}</p><table width="500px" border="1" cellpadding="0" cellspacing="0" style="margin-top: 20px;"><tr><th>姓名</th><th>年龄</th><th>爱好</th><th>真爱</th></tr>{{for info.child}}<tr align="center"><td>{{:name}}</td><td>{{:age}}</td><td>{{:like}}</td><td>{{:~typeFun(type,isTrue)}}</td></tr>{{/for}}</table></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {msg: "名单列表:",info: {child: [{name: "www",age: 18,like:"玫瑰",type:"01",isTrue:true},{name: "aaa",age: 20,like:"松树",type:"03",isTrue:false},{name: "bbb",age: 30,like:"四叶草",type:"02",isTrue:true}]}}// 定义 转换器var str = {"01": "花","02": "草","03": "树","04": "木",}$.views.helpers({typeFun: function (type,isTrue){return isTrue ? str[type] : ""}})// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
方法 效果:

使用:
// 方法$.views.tags({Fun:function (type,val){},Fun1:function (val){}})// 引用{{Fun 属性名1 属性名2 /}}
例子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><div id="content"></div><!-- 1、定义模板 --><script type="text/x-jsrender" id="Tem"><p>{{Fun val /}}</p><p>{{Fun1 name val /}}</p></script><!-- 2、引入js --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="jsrender.min.js"></script></body></html><script>// 3、数据var data = {name: "www",val:"花"}// 自定义标签$.views.tags({Fun: function (val){return '可以出去看<span style="color:red;">' + val + '</span>'},Fun1:function (name,like){return name + '喜欢' + like}})// 4、编译成元素并添加到容器中$("#content").html($("#Tem").render(data))</script>
自定义标签 $.views.tags() 效果:

作者 wendy
2018 年 12月 21日