Authored by xuqi

new file---mustache使用指南

  1 +# Mustache使用指南
  2 +先拐远一点:mustache,读[ˈmʌsˌtæʃ],而不是[ˈmʌstˌek],胡子的意思,取这名字大概是将模板引擎中的`{`顺时针转个90度就像个人的胡子了,嗯,大概是这样...
  3 +
  4 +再进入正题:mustache是一个轻逻辑的模板引擎(为啥叫“轻逻辑”呢,因为没有if else for等逻辑语句,取而代之的是只用标签实现 )
  5 +
  6 +mustache.js是mustache模板系统的js实现,或者叫解析器。下面介绍下使用方法,很简单的语法~
  7 +
  8 +## quick example
  9 +
  10 + Mustache.render('<p>I am {{name}}, I am {{age}} years old</p>', {
  11 + title: 'xuqi',
  12 + age: function() {
  13 + return 24;
  14 + }
  15 + });
  16 +上述例子输出一段HTML片段:`<p>I am xuqi, I am 24 years old</p>`
  17 +
  18 +首先上述例子给我们最直观的印象就是:templates + data => html-partials。使用render(tpls, dataObj)。使用dataObj去渲染tpls得到html片段。
  19 +
  20 +## 模板
  21 +模板就是一段包含任意数目`{{keyname}}`的字符串~
  22 +`{{keyname}}`中的包裹的keyname即为mustache模板的键名(稍微了解下就好)。下面介绍三种加载模板的方法
  23 +1 直接在js中声明模板字符串,如quick example所示
  24 +2 从HTML中读取模板
  25 +
  26 + <script id="ex-tpl" type="x-tmpl-mustache">
  27 + My name is {{name}}, I am {{age}} years old
  28 + </script>
  29 +
  30 + //example.js
  31 + var tpl = $('#ex-tpl').html(),
  32 + html;
  33 + html = Mustache.render(tpl, data);
  34 +3 从.mst文件中读取/通过ajax异步渲染
  35 +
  36 + function loadTpl() {
  37 + $.get('tpl.mst', function(tpl) {
  38 + var html = Mustache.render(tpl, data);
  39 + //Operation of html
  40 + });
  41 + }
  42 +
  43 +## 变量
  44 +最简单的标签就是一个变量`{{key}}`...使用当前上下文环境中的key值替换标签,如果key不存在,则不会被渲染。
  45 +
  46 +`{{key}}`会默认转义一些HTML标记,如果不想使用转义, 可以使用`{{{}}}`或者`{{&}}`
  47 +
  48 +另外,JS中的`.`也可以在mustache中使用,比如:`{{person.name}}`
  49 +
  50 +## 区块
  51 +
  52 + {{section}}
  53 + {{name}}
  54 + //other code
  55 + {{/section}}
  56 +
  57 +根据上下文环境中的section的值去渲染区块内的代码。如果section键名不存在或者存在但是值为'false'值(null,undefined,false,0,NaN,'',[]),区块内代码不会被渲染。
  58 +
  59 +键名存在也为'true'值的情况下,区块内代码被渲染1+次。比如:
  60 +
  61 + //view
  62 + {
  63 + section: [
  64 + {name: 'xuqi'},
  65 + {name: 'xuqi2'}
  66 + ]
  67 + }
  68 +
  69 + //template
  70 + {{section}}
  71 + <b>{{name}}</b>
  72 + {{/section}}
  73 +
  74 + //output
  75 + <b>xuqi</b>
  76 + <b>xuqi2</b>
  77 +我们把上面的view简化一下:
  78 +
  79 + {
  80 + section: ['xuqi', 'xuqi2']
  81 + }
  82 +对,就是把section的元素由对象简化为了字符串,那键名没了我怎么去渲染?`{{.}}`来帮你~
  83 +
  84 + {{section}}<b>{{.}}</b>{{/section}}
  85 +这样就可以得到同样的output啦。
  86 +
  87 +再来看一种稍微复杂一点的情况:外国人都有firstname和lastname,如果按照上面的情况去实现就得`{{firstname}}.{{lastname}}`去手动拼接。所以现在要引入函数来帮我们实现拼接了,而不是把逻辑扔在template中去实现。
  88 +
  89 +如果section中有个变量是一个函数,那么会遍历对应上下文中的各个项并执行,例如:
  90 +
  91 + //view
  92 + {
  93 + 'section': [
  94 + { 'firstName': 'qi', 'lastName': 'xu' },
  95 + { 'firstName': 'qi2', 'lastName': 'xu' }
  96 + ],
  97 + 'name': function () {
  98 + return this.firstName + '.' + this.lastName;
  99 + }
  100 + }
  101 +
  102 + //template
  103 + {{#section}}
  104 + <b>{{name}}</b>
  105 + {{/section}}
  106 +
  107 + //output
  108 + <b>qi.xu</b>
  109 + <b>qi2.xu</b>
  110 +## 取反区块
  111 +`{{^section}}`与区块的情况相反,section的值为'false'值时执行,否则不执行
  112 +
  113 +## 区块函数
  114 +如果section键名为函数,即`{{#sectionFn}}{{/sectionFn}}`中sectionFn为函数时,是个奇葩,官方文档看不懂是什么意思,直接来看例子吧~~
  115 +
  116 + //view
  117 + {
  118 + name: 'xuqi',
  119 + bold: function() {
  120 + return function(text, render) {
  121 + return '<b>' + render(text) + '</b>';
  122 + }
  123 + }
  124 + }
  125 +
  126 + //tpl
  127 + {{#bold}}Hi {{name}}{{/bold}}
  128 +
  129 + //output
  130 + <b>Hi xuqi</b>
  131 +
  132 +function里面的实现意思就是:render(text)替换`{{bold}}`块中的内容并将数据渲染进去,然后把`{{bold}}`替换成`<b>`标签就行了
  133 +## 注释
  134 +`{{!}}` 内容不显示
  135 +
  136 +## partials
  137 +`{{> partial-name}}`引入某个小部件到模板中,比如
  138 +
  139 + base.mst
  140 + {{#name}}
  141 + {{> user}}
  142 + {{/name}}
  143 +
  144 + user.mst
  145 + <b>{{name}}</b>
  146 +mustache将user.mst的内容插入到base.mst中`{{> user}}`的位置。
  147 +
  148 +如果在Mustache.render中使用partials的话,将partials当做render的第三个参数即可,即:
  149 +
  150 + Mustache.render(tpl, data, {
  151 + user: userTplText,
  152 + ...
  153 + });
  154 +
  155 +## 预编译和缓存模板
  156 +默认情况下Mustache在第一次编译模板后会缓存起来,如果第二次的模板没有变化,就直接从缓存中取编译后的模板去渲染,加快了渲染速度。如果你需要提前预编译和缓存,可调用Mustache.parse(tpl);.....一会儿以后,你就可以享受预编译模板带来的渲染快感了