new file---mustache使用指南
Showing
1 changed file
with
156 additions
and
0 deletions
前端开发相关/Mustache使用指南.md
0 → 100644
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);.....一会儿以后,你就可以享受预编译模板带来的渲染快感了 |
-
Please register or login to post a comment