現在前端 framework 百家爭鳴,不過和後端 framework
遇到一樣的問題,版本更動超快寫法不相容,今日的當紅炸子機相隔一年後消失的無影無蹤時有所聞,後端比較沒有迅速隕落的問題,畢竟他的開發門檻還是稍高一些,也因此除了有玩一下 vuejs 以外對
front-end framework 真的沒有太高的興趣,即便我超愛寫 JavaScript,不過專案裡面還滿常用到 js render template 這件事情,所以我還是有使用一些 plugin
來實現這件事情,今天就來介紹 JsRender 這個 plugin
基礎功能
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>JsRender</title> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jsrender/0.9.88/jsrender.min.js"></script> |
| <script> |
| $(function() { |
| var data = {name: 'chan'}; |
| var html = $.templates('<strong>{{:name}}</strong>').render(data); |
| $('#app').append(html); |
| }); |
| </script> |
| </head> |
| <body> |
| <div id="app"></div> |
| </body> |
| </html> |
JsRender 傳進去的資料為 JSON,上面的內容會得到:
<div id="app"><strong>chan</strong></div>
如果是複數的內容,JsRender 會自動幫你做 repeat。
script
| $(function() { |
| let data = [ |
| {name: 'chan'}, |
| {name: 'phoebe'} |
| ]; |
| let html = $.templates('<strong>{{:name}}</strong>').render(data); |
| $('#app').append(html); |
| }); |
output
| |
| <div id="app"><strong>chan</strong><strong>phoebe</strong></div> |
樣板
如果將樣板寫在 script 裡面,往往會變得很難維護,字串也超長,所以 JsRender 有一個把樣板隔離出來的套用方式。
script
| $(function() { |
| let data = [ |
| {name: 'chan'}, |
| {name: 'phoebe'} |
| ]; |
| let html = $.templates('#info').render(data); |
| |
| $('#app').append(html); |
| }); |
html
| <script id="info" type="text/html"> |
| <strong>{{:name}}</strong> |
| </script> |
output
| <div id="app"> |
| <strong>chan</strong> |
| <strong>phoebe</strong> |
| </div> |
內建函式
{{> …}} (HTML-encode)
將輸出的部份加上 >
的話會將程式碼 encode。
script
| $(function() { |
| let data = {link: '<a href="http://www.google.com">google</a>'}; |
| let html = $.templates('#info').render(data); |
| |
| $('#app').append(html); |
| }); |
html
| <script id="info" type="text/html"> |
| {{>link}} |
| </script> |
output
| <a href="http://www.google.com">google</a> |
| |
{{if …}}
判斷式。
script
| $(function() { |
| let data = [ |
| {name: 'chan', age: 37}, |
| {name: 'phoebe', age: 38}, |
| {name: 'lucas', age: 2} |
| ]; |
| let html = $.templates('#info').render(data); |
| |
| $('#app').append(html); |
| }); |
html
| <script id="info" type="text/html"> |
| {{:name}} is {{if age > 10}}adult{{else}}children{{/if}}<br> |
| </script> |
output
| <div id="app"> |
| chan is adult<br> |
| phoebe is adult<br> |
| lucas is children<br> |
| </div> |
{{for …}}
迴圈。
script
| $(function() { |
| let data = [{ |
| name: 'chan', |
| likes: [{ |
| name: 'music' |
| }, { |
| name: 'movie' |
| }] |
| }, { |
| name: 'phoebe' |
| }, { |
| name: 'lucas', |
| likes: [{ |
| name: 'cartoon' |
| }] |
| }]; |
| let html = $.templates('#info').render(data); |
| |
| $('#app').append(html); |
| }); |
html
| <script id="info" type="text/html"> |
| <div> |
| {{:#index}}: {{:name}} |
| {{if likes}} |
| <ul> |
| {{for likes}} |
| <li>{{:#index + 1}}: {{:name}}</li> |
| {{/for}} |
| </ul> |
| {{else}} |
| <div>no likes</div> |
| {{/if}} |
| </div> |
| </script> |
output
| <div id="app"> |
| <div> |
| 0: chan |
| <ul> |
| <li>1: music</li> |
| <li>2: movie</li> |
| </ul> |
| </div> |
| <div> |
| 1: phoebe |
| <div>no likes</div> |
| </div> |
| <div> |
| 2: lucas |
| <ul> |
| <li>1: cartoon</li> |
| </ul> |
| </div> |
| </div> |
{{include …}}
引入其他的樣板。
script
| $(function() { |
| let data = { |
| name: 'test', |
| data: [ |
| { |
| name: 'chan', |
| age: 42 |
| }, |
| { |
| name: 'phoebe', |
| age: 42 |
| } |
| ] |
| }; |
| |
| console.log($('#main').render(data)); |
| }); |
| |
html
| <script id="main" type="text/html"> |
| <h3>{{:name}}</h3> |
| {{include tmpl="#sub"/}} |
| </script> |
| <script id="sub" type="text/html"> |
| <ol> |
| {{for data}} |
| <li>{{:name}}: {{:age}}</li> |
| {{/for}} |
| </ol> |
| </script> |
| |
output
| <h3>test</h3> |
| <ol> |
| <li>chan: 42</li> |
| <li>phoebe: 42</li> |
| </ol> |
{{props …}}
key value 式的迴圈。
script
| $(function() { |
| var data = [ |
| { |
| name: 'Chan', |
| likes: { |
| name: 'a1', |
| age: 33 |
| } |
| }, |
| { |
| name: 'Phoebe', |
| likes: { |
| food: 'steak', |
| drink: 'juice' |
| } |
| } |
| ] |
| var html = $.templates('#info').render(data); |
| |
| $('#app').html(html); |
| }); |
html
| <script id="info" type="text/html"> |
| <div> |
| {{:name}} |
| <ul> |
| {{props likes}} |
| <li>{{:key}}: {{:prop}}</li> |
| {{/props}} |
| </ul> |
| </div> |
| </script> |
output
| <div id="app"> |
| <div> |
| Chan |
| <ul> |
| <li>name: a1</li> |
| <li>age: 33</li> |
| </ul> |
| </div> |
| <div> |
| Phoebe |
| <ul> |
| <li>food: steak</li> |
| <li>drink: juice</li> |
| </ul> |
| </div> |
| </div> |
helper
helper 也是一種 JSON 格式,可以是文字或者是 function。
script
| $(function() { |
| var helpers = { |
| prefix: function(val) { |
| return val + ' is cool'; |
| }, |
| version: '1.1' |
| }; |
| var data = { |
| name: 'chan' |
| }; |
| var html = $.templates('#info').render(data, helpers); |
| |
| $('#app').append(html); |
| }); |
html
| |
| <script id="info" type="text/html"> |
| version: {{:~version}} name: {{:~prefix(name)}} |
| </script> |
output
| <div id="app"> |
| version: 1.1 name: chan is cool |
| </div> |
helper 還有另一種 global 的傳入方式。
script
| $(function() { |
| let helpers = { |
| prefix: function(val) { |
| return val + ' is cool'; |
| }, |
| version: '1.1' |
| }; |
| $.views.helpers(helpers); |
| let data = { |
| name: 'chan' |
| }; |
| let html = $.templates('#info').render(data); |
| |
| $('#app').append(html); |
| }); |
以上是最基本的範例,不過應該可以應付大部分的情況了,若要使用其他更詳盡的功能可以前往他的官網 https://www.jsviews.com/