JsRender实用入门教程


Posted in Javascript onOctober 31, 2014

本文是一篇JsRender的实用入门教程,实例讲述了tag else使用、循环嵌套访问父级数据等知识点。分享给大家供大家参考。具体如下:

前言

JsRender是一款基于jQuery的JavaScript模版引擎,它具有如下特点:

  ·  简单直观

  ·  功能强大

  ·  可扩展的

  ·  快如闪电

这些特性看起来很厉害,但几乎每个模版引擎,都会这么宣传。。。

由于工作需要,小菜才接触到此款模版引擎。使用了一段时间,发现它确实比较强大,但小菜觉得有些地方强大的过头了,反倒让人觉得很难理解。

另一方面,JsRender的官方文档比较详细,但其他资料出奇的少,遇到点什么问题,基本搜不到,不仅仅是相关问题搜不到,几乎就是没有结果。

再加上JsRender有些地方确实是不好理解,所以急需小菜分享一些“最佳实践”。

基于最近一段时间的使用,小菜总结了一些实用经验,当然,这些经验在官方文档上是找不到的。

嵌套循环使用#parent访问父级数据(不推荐)

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>嵌套循环使用#parent访问父级数据 --- by 杨元</title>

    <style>

    </style>

    

  </head>

  <body>

    

    <div>

      <table>

        <thead>

          <tr>

            <th width="10%">序号</th>

            <th width="10%">姓名</th>

            <th width="80%">家庭成员</th>

          </tr>

        </thead>

        <tbody id="list">

          

        </tbody>

      </table>

    </div>

    

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

    <script src="jsviews.js"></script>

    

    <!-- 定义JsRender模版 -->

    <script id="testTmpl" type="text/x-jsrender">

      <tr>

        <td>{{:#index + 1}}</td>

        <td>{{:name}}</td>

        <td>

          {{for family}}

            {{!-- 利用#parent访问父级index --}}

            <b>{{:#parent.parent.index + 1}}.{{:#index + 1}}</b>

            {{!-- 利用#parent访问父级数据,父级数据保存在data属性中 --}}

            {{!-- #data相当于this --}}

            {{:#parent.parent.data.name}}的{{:#data}}

          {{/for}}

        </td>

      </tr>

    </script>

    

    <script>

      //数据源

      var dataSrouce = [{

        name: "张三",

        family: [

          "爸爸",

          "妈妈",

          "哥哥"

        ]

      },{

        name: "李四",

        family: [

          "爷爷",

          "奶奶",

          "叔叔"

        ]

      }];

      

      //渲染数据

      var html = $("#testTmpl").render(dataSrouce);

      $("#list").append(html);

      

    </script>

    

  </body>

</html>

嵌套循环使用参数访问父级数据(推荐)

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>嵌套循环使用参数访问父级数据 --- by 杨元</title>

    <style>

    </style>

    

  </head>

  <body>

    

    <div>

      <table>

        <thead>

          <tr>

            <th width="10%">序号</th>

            <th width="10%">姓名</th>

            <th width="80%">家庭成员</th>

          </tr>

        </thead>

        <tbody id="list">

          

        </tbody>

      </table>

    </div>

    

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

    <script src="jsviews.js"></script>

    

    <!-- 定义JsRender模版 -->

    <script id="testTmpl" type="text/x-jsrender">

      <tr>

        <td>{{:#index + 1}}</td>

        <td>{{:name}}</td>

        <td>

          {{!-- 使用for循环时,可以在后边添加参数,参数必须以~开头,多个参数用空格分隔 --}}

          {{!-- 通过参数,我们缓存了父级的数据,在子循环中通过访问参数,就可以间接访问父级数据 --}}

          {{for family ~parentIndex=#index ~parentName=name}}

            <b>{{:~parentIndex + 1}}.{{:#index + 1}}</b>

            {{!-- #data相当于this --}}

            {{:~parentName}}的{{:#data}}

          {{/for}}

        </td>

      </tr>

    </script>

    

    <script>

      //数据源

      var dataSrouce = [{

        name: "张三",

        family: [

          "爸爸",

          "妈妈",

          "哥哥"

        ]

      },{

        name: "李四",

        family: [

          "爷爷",

          "奶奶",

          "叔叔"

        ]

      }];

      

      //渲染数据

      var html = $("#testTmpl").render(dataSrouce);

      $("#list").append(html);

      

    </script>

    

  </body>

</html>

自定义标签(custom tag)中使用else(强烈不推荐)

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>自定义标签中使用else --- by 杨元</title>

    <style>

    </style>

    

  </head>

  <body>

    

    <div>

      <table>

        <thead>

          <tr>

            <th width="50%">名称</th>

            <th width="50%">单价</th>

          </tr>

        </thead>

        <tbody id="list">

          

        </tbody>

      </table>

    </div>

    

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

    <script src="jsviews.js"></script>

    

    <!-- 定义JsRender模版 -->

    <script id="testTmpl" type="text/x-jsrender">

      <tr>

        <td>{{:name}}</td>

        <td>

          {{!-- isShow为自定义标签,price是传入的参数,status是附加属性 --}}

          {{isShow price status=0}}

            {{:price}}

          {{else price status=1}}

            --

          {{/isShow}}

        </td>

      </tr>

    </script>

    

    <script>

      //数据源

      var dataSrouce = [{

        name: "苹果",

        price: 108

      },{

        name: "鸭梨",

        price: 370

      },{

        name: "桃子",

        price: 99

      },{

        name: "菠萝",

        price: 371

      },{

        name: "橘子",

        price: 153

      }];

      

      //自定义标签

      $.views.tags({

        "isShow": function(price){

          var temp=price+''.split('');

          

          if(this.tagCtx.props.status === 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 this.tagCtxs[0].render();

            }else{

              return this.tagCtxs[1].render();

            }

          }else{

            return "";

          }

          

        }

      });

     
      //渲染数据

      var html = $("#testTmpl").render(dataSrouce);

      $("#list").append(html);

      

    </script>

    

  </body>

</html>

用helper代替自定义标签(推荐)

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>用helper代替自定义标签 --- by 杨元</title>

    <style>

    </style>

    

  </head>

  <body>

    

    <div>

      <table>

        <thead>

          <tr>

            <th width="50%">名称</th>

            <th width="50%">单价</th>

          </tr>

        </thead>

        <tbody id="list">

          

        </tbody>

      </table>

    </div>

    

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

    <script src="jsviews.js"></script>

    

    <!-- 定义JsRender模版 -->

    <script id="testTmpl" type="text/x-jsrender">

      <tr>

        <td>{{:name}}</td>

        <td>

          {{!-- 利用原生的if做分支跳转,利用helper做逻辑处理 --}}

          {{if ~isShow(price)}}

            {{:price}}

          {{else}}

            --

          {{/if}}

        </td>

      </tr>

    </script>

    

    <script>

      //数据源

      var dataSrouce = [{

        name: "苹果",

        price: 108

      },{

        name: "鸭梨",

        price: 370

      },{

        name: "桃子",

        price: 99

      },{

        name: "菠萝",

        price: 371

      },{

        name: "橘子",

        price: 153

      }];

      

      //Helper

      $.views.helpers({

        "isShow": 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;

          }

        }

      });
      //渲染数据

      var html = $("#testTmpl").render(dataSrouce);

      $("#list").append(html);

      

    </script>

    

  </body>

</html>

完整实例代码点击此处本站下载。

希望本文所述对大家JsRender程序设计的学习有所帮助。

Javascript 相关文章推荐
javascript中的作用域和上下文使用简要概述
Dec 05 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
Dec 10 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
js仿苹果iwatch外观的计时器代码分享
Aug 26 Javascript
JavaScript中的this机制
Jan 30 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
Oct 05 Javascript
简单实现node.js图片上传
Dec 18 Javascript
Angular2.js实现表单验证详解
Jun 23 Javascript
Js自定义多选框效果的实例代码
Jul 05 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
Dec 19 Javascript
编写React组件项目实践分析
Mar 04 Javascript
分享5个好用的javascript文件上传插件
Sep 16 Javascript
JsRender for object语法简介
Oct 31 #Javascript
JsRender for index循环索引用法详解
Oct 31 #Javascript
javascript常用函数归纳整理
Oct 31 #Javascript
让html页面不缓存js的实现方法
Oct 31 #Javascript
js读取cookie方法总结
Oct 31 #Javascript
jQuery获取对象简单实现方法小结
Oct 30 #Javascript
js 通过cookie实现刷新不变化树形菜单
Oct 30 #Javascript
You might like
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
php简单分页类实现方法
2015/02/26 PHP
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
Python XML RPC服务器端和客户端实例
2014/11/22 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
幼儿老师求职信
2014/06/30 职场文书
会计学习心得体会
2014/09/09 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js