zoukankan      html  css  js  c++  java
  • JsRender 学习总结

      最近学习了一下Jsrender模板渲染工具,非常不错,功能比较强大,官网说他是“简单直观 功能强大 可扩展的 快如闪电”确实如此。总结一下!!

          jsRender 三个最重要的概念:模板、容器和数据。 最重要的是:view(视图) 是我们定义的模板,上下文是视图所用的对象。

     一、基础。

           {{:}} 和 {{>}}(或{{html:}})两者都可以输出内容,不过后者是经过html编码的。  

    {{: pathOrExpr}}             (value) 值类型  
    {{> pathOrExpr}}             (HTML-encoded value) html编码后的值  
    {{* mycode}}                 (using code) 代码  

    二、逻辑判断和循环。

           if-else

       语法:{{if condition}} ... {else condition} ... {{else}}... {{/if}}

          例子: 

    <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}}

       例子:

    <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}}

      例子:

    <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属性指定。  

      例子:

    <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); 

      

     嵌套循环使用参数访问父级数据,直接看例子:
    <!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"

      例子:

      

    <!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比较灵活

        例子:

    <!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(参数){...}})

    <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://borismoore.github.io/jsrender/demos/demos.html,最好是参考官网:www.jsviews.com

      

  • 相关阅读:
    创建一个简单的图片服务器
    spring-boot系列:初试spring-boot
    java的动态代理机制
    jedis连接池详解(Redis)
    使用logback.xml配置来实现日志文件输出
    redis在mac上的安装
    理解RESTful架构
    分布式应用框架Akka快速入门
    [Java基础]Java通配符
    Mac vim iterm2配色方案
  • 原文地址:https://www.cnblogs.com/panmy/p/5927269.html
Copyright © 2011-2022 走看看