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网页关闭时提醒效果脚本
Oct 22 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
Jul 06 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
Oct 27 Javascript
canvas实现图像截取功能
Feb 06 Javascript
Javascript封装id、class与元素选择器方法示例
Mar 13 Javascript
JavaScript Date对象应用实例分享
Oct 30 Javascript
vue2.0安装style/css loader的方法
Mar 14 Javascript
微信小程序自定义多选事件的实现代码
May 17 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
Aug 14 Javascript
详解 javascript对象创建模式
Oct 30 Javascript
vue选项卡切换的实现案例
Apr 11 Vue.js
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 curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
yii数据库的查询方法
2015/12/28 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
python实现的系统实用log类实例
2015/06/30 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
python导入模块交叉引用的方法
2019/01/19 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python 字典访问的三种方法小结
2019/12/05 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
《故乡》教学反思
2014/04/10 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers