@Wangww0925
2020-07-08T07:04:25.000000Z
字数 14956
阅读 644
模板引擎
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日