jsRender 三个最重要的概念:模板、容器和数据。 最重要的是:view(视图) 是我们定义的模板,上下文是视图所用的对象。
一、基础。
{{:}} 和 {{>}}(或{{html:}})两者都可以输出内容,不过后者是经过html编码的。
{{: pathOrExpr}} (value) 值类型 {{> pathOrExpr}} (HTML-encoded value) html编码后的值 {{* mycode}} (using code) 代码
二、逻辑判断和循环。
if-else
语法:{{if condition}} ... {else condition} ... {{else}}... {{/if}}
例子:
1 2 3 4 5 6 7 8 9 10 11 12 | <script type= "text/tmp" id= "tmp4" > <p>my name is: {{:name}}</p> <p>我是: {{ if info.age >= 18}} 成年人 {{ else }} 未成年 {{/ if }} </p> </script> var html = $( "#tmp4" ).render(data); $( "#list" ).html(html); |
for
语法: {{for}} ... {{/for}}
例子:
1 2 3 4 5 6 7 8 9 10 11 12 | <script type= "text/tmp" id= "tmp5" > {{ for }} <li>id:{{:ID}} name:{{:Name}}</li> {{/ for }} </script> var arr = [ { ID: 1, Name: "tom" }, { ID: 2, Name: "jack" }, { ID: 3, Name: "lucy" } ]; var html = $( "#tmp5" ).render(arr); $( "#list" ).html(html); |
嵌套for
语法:语法:{{for}}...{{for 当前上下文}} ... {{/for}} ... {{/for}}
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <script type= "text/tmp" id= "tmp7" > {{ for }} <li> name:{{:name}} <ul> {{ for hobbies}} <li>{{: #getIndex() + 1}}:{{:#data}}</li> {{/ for }} </ul> </li> {{/ for }} </script> arr = [ { name: "tom" , hobbies: [ "篮球" , "足球" ] }, { name: "jack" , hobbies: [ "篮球" , "橄榄球" ] }, { name: "lucy" , hobbies: [ "游泳" , "羽毛球" ] } ]; var html = $( "#tmp7" ).render(arr); $( "#list" ).html(html); |
分离for
语法:{{for 上下文 tmpl="模板id" /}}
如果for的逻辑比较复杂,嵌套的for就会让我们的模板变得复杂,维护难度加大;我们可以将for分离,以上面的例子,可以将for放到一个新的模板,然后通过 tmpl属性指定。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <script type= "text/tmp" id= "tmp8" > {{ for }} <li> name:{{:name}} <ul> {{ for hobbies tmpl= "#tmp9" /}} </ul> </li> {{/ for }} </script> <script type= "text/tmp" id= "tmp9" > <li>{{: #getIndex() + 1}}:{{:#data}}</li> </script> var html = $( "#tmp8" ).render(arr); $( "#list" ).html(html); |
嵌套循环使用参数访问父级数据,直接看例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <!doctype html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>嵌套循环使用参数访问父级数据</title> </head> <body> <table border= "1px" > <thead> <tr> <th >序号</th> <th >姓名</th> <th>年龄</th> <th >家庭成员</th> </tr> </thead> <tbody id= "list" > </tbody> </table> <script src= "../js/jquery-3.1.1.min.js" ></script> <script src= "../js/Jsrender.js" ></script> <script id= "testTmpl" type= "text/x-jsrender" > <tr> <td>{{: #index + 1}}</td> <td>{{:name}}</td> <td>{{:age}}</td> <td> {{!-- 使用 for 循环时,可以在后边添加参数,参数必须以~开头,多个参数用空格分隔 --}} {{!-- 通过参数,我们缓存了父级的数据,在子循环中通过访问参数,就可以间接访问父级数据 --}} {{ for family ~parentIndex= #index ~parentName=name ~parnetAge=age}} <b>{{:~parentIndex + 1}}.{{: #index + 1}}</b> {{!-- #data相当于this --}} {{:~parentName}}的{{: #data}}{{:~parnetAge}} {{/ for }} </td> </tr> </script> <script> var dataSrouce = [ { name: "张三" , age:3, family: [ "爸爸" , "妈妈" , "哥哥" ] }, { name: "李四" , age:4, family: [ "爷爷" , "奶奶" , "叔叔" ] } ]; $( "#list" ).append($( "#testTmpl" ).render(dataSrouce)); </script> </body> </html> |
三、扩展应用
上面的基本用法已经可以满足大部分需求了。以下几个扩展都是为了分离视图和逻辑的,试想一下,如果我们的视图里还需要大量的逻辑判断或计算,全都写在一起,那会非常麻烦和难以维护。视图最好就是简单的标签,而逻辑都写在js里。jsRender是在视图上进行扩展的。
组合模板: include 组合模板
语法:include tmpl="模板id"
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>include 组合模板</title> <script src= "../js/jquery-3.1.1.min.js" ></script> <script src= "../js/Jsrender.js" ></script> </head> <body> <p>{{include tmpl=... /}} 标签用于组合模板(template composition) -----用于在一个模板中引入另一个模板,并用上下文的数据来渲染template。</p> <script id= "peopleTemplate" type= "text/x-jsrender" > <div> {{:name}} lives in {{include tmpl= "#addressTemplate" /}} </div> </script> <script id= "addressTemplate" type= "text/x-jsrender" > <b>{{>address.city}}</b> </script> <div id= "peopleList" ></div> <script> var people = [ { "name" : "Pete" , "address" : { "city" : "Seattle" } }, { "name" : "Heidi" , "address" : { "city" : "Sidney" } } ]; var html = $( "#peopleTemplate" ).render(people); $( "#peopleList" ).html(html); </script> </body> </html> |
自定义标签:views.tags和 views.helpers
语法:
views.tags
1.视图 {{"标签名称" 标签参数 附加参数}}
2.逻辑 $.views.tags({"标签名称":function(参数){this.tagCtx.props.prefix附加参数}}) //prefix附加参数是你传的参数名称
views.helpers
1、视图{{~“标签名称”(附加参数)}}
2、逻辑$.views.helpers({“标签名称”:function(参数){//具体逻辑}})
因为两者基本都一样,但是views.helpers比较灵活
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>两种自定义标签 views.tags和 views.helpers </title> </head> <body> <p>不推荐使用 $.views.tags 这种自定义标签 建议使用$.views.helpers </p> <div> <p>views.tags</p> <table> <thead> <tr> <th width= "50%" >名称</th> <th width= "50%" >单价</th> </tr> </thead> <tbody id= "list" > <!-- 定义JsRender模版 --> <script id= "testTmpl" type= "text/x-jsrender" > <tr> <td>{{:name}}</td> <td> {{!-- isShow为自定义标签,price是传入的参数,status是附加属性 --}} {{isShow price age=0}} {{:price}} {{ else price age=1}} -- {{/isShow}} </td> </tr> </script> </tbody> </table> </div> <br/><br/> <br/><br/> <div id= "div2" > <p>views.helpers</p> <table> <thead> <tr> <th width= "50%" >名称</th> <th width= "50%" >单价</th> </tr> </thead> <tbody id= "list2" > <script id= "testTmpl2" type= "text/x-jsrender" > <tr> <td>{{:name}}</td> <td> {{!-- 利用原生的 if 做分支跳转,利用helper做逻辑处理 --}} {{ if ~isShow123(price)}} {{:price}} {{ else }} -- {{/ if }} </td> </tr> </script> </tbody> </table> </div> <body> <script src= "../js/jquery-3.1.1.min.js" ></script> <script src= "../js/Jsrender.js" ></script> <script> //数据源 var dataSrouce = [{ name: "苹果" , price: 108 },{ name: "鸭梨" , price: 370 },{ name: "桃子" , price: 99 },{ name: "菠萝" , price: 371 },{ name: "橘子" , price: 153 }]; //自定义标签 $.views.tags可以自定义标签,指定自定义标签的渲染规则。它可以给一段固定格式的html块起个名称,然后通过这个名称直接调用 $.views.tags({ "isShow" : function (price){ var temp=price+ '' .split( '' ); //this.tagCtx.render(val)有点像指定参数的感觉。官方说是 if ( this .tagCtx.props.age === 0){ //判断价格是否为水仙花数,如果是,则显示,否则不显示 if (price==(Math.pow(parseInt(temp[0],10),3)+Math.pow(parseInt(temp[1],10),3)+Math.pow(parseInt(temp[2],10),3))){ return "<p><em style='color: red'>" + this .tagCtxs[0].render()+ "</em></p>" ; } else { return this .tagCtxs[1].render(); } } else { return "" ; } } }); $.views.helpers({ "isShow123" : function (price){ var temp=price+ '' .split( '' ); if (price==(Math.pow(parseInt(temp[0],10),3)+Math.pow(parseInt(temp[1],10),3)+Math.pow(parseInt(temp[2],10),3))){ return true ; } else { return false ; } } }); //views.tags渲染数据 var html = $( "#testTmpl" ).render(dataSrouce); $( "#list" ).append(html); //vies.helpers渲染数据 var html2 = $( "#testTmpl2" ).render(dataSrouce); $( "#list2" ).append(html2); </script> </body> </html> |
转换器 converter
转换器可以对输出结果进行处理,例如大小写转换等。
语法:
1. 视图 {{"转化器名称":参数}}
2. js $.views.converters({"转换器名称":function(参数){...}})
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <script type= "text/tmp" id= "tmp11" > {{ for }} <li> Upper Name: {{toUpper: #parent.data.name}} </li> {{/ for }} </script> $.views.converters({ "toUpper" : function (name){ if (name){ return name.toUpperCase(); } } }) var html = $( "#tmp11" ).render(arr); $( "#list" ).html(html) |
转载自:http://www.cnblogs.com/panmy/p/5927269.html
官网:www.jsviews.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2013-07-10 ORA-04031: