模板引擎
Template
目录
- 字符串拼接
- string format
- 模板替换
- 自制模板引擎
- 常见模板引擎介绍
一个简单的需求
用 JS 『渲染』一个歌曲列表
- 数据来自一个数组 songs
- 不能写死在页面里
songs === [
{name: '绅士', url: 'http://music.163.com/xxx', singer: '薛之谦'},
{name: '刚刚好', url: 'http://music.163.com/yyy', singer: '薛之谦'},
...
]
最傻的办法 - 遍历
你必须要能想到一个最傻的办法
方案一:拼 HTML 字符串
方案二:构造 DOM 对象(也可以用 jQuery)
字符串格式化
before:
var li = '<li>' + songs[i].name + ' - ' + songs[i].singer + '</li>'
var li = stringFormat('<li>{0} - {1}</li>', songs[i].name, songs[i].singer)
after:
自己实现 stringFormat 函数!
模板引擎
var string =
'<div class=song-list>' +
' <h1>热歌榜</h1>' +
' <ol>'
<%for (var i=0; i<songs.length; i++) {%>
<li><%songs[i].name%> - <%songs[i].singer%></li>
<%}%>
</ol>' +
'</div>'
var data = {
songs: songs
}
var result = template(string, data)
document.body.innerHTML = result
字符串格式化的升级版
我们只需要传入 string 和 data
自己实现模板引擎
第一版:替换变量
var TemplateEngine = function(tpl, data) {
还没实现呢!
}
var template = '<p>Hello, my name is <%name%>. I\'m <%age%> years old.</p>';
var data = {
name: "Krasimir",
age: 29
}
var string = TemplateEngine(template, data)
console.log(string)
预备知识
- string.replace 替换字符串
- regex.exec 正则、遍历、匹配
自己实现模板引擎
第一版的实现
var TemplateEngine = function(tpl, data) {
var regex = /<%([^%>]+)?%>/g;
while(match = regex.exec(tpl)) {
tpl = tpl.replace(match[0], data[match[1]])
}
return tpl;
}
自己实现模板引擎
第二版:更复杂的逻辑
var template =
'My skills:' +
'<%if(this.showSkills) {%>' +
'<%for(var index in this.skills) {%>' +
'<a href="#"><%this.skills[index]%></a>' +
'<%}%>' +
'<%} else {%>' +
'<p>none</p>' +
'<%}%>';
var string = TemplateEngine(template, {
skills: ["js", "html", "css"],
showSkills: true
})
document.body.innerHTML = string
预备知识
var func = new Function(...
思路
var template =
'My skills:' +
'<%if(this.showSkills) {%>' +
'<%for(var index in this.skills) {%>' +
'<a href="#"><%this.skills[index]%></a>' +
'<%}%>' +
'<%} else {%>' +
'<p>none</p>' +
'<%}%>';
观察这个字符串:
<% %> 外面,都是字符串
<% %> 里面,一是控制语句(if/for),二是变量(this.skills[index])
有没有可能变成纯 JS?
思路
var template =
'My skills:' +
'<%if(this.showSkills) {%>' +
'<%for(var index in this.skills) {%>' +
'<a href="#">' +
' <%this.skills[index]%>'+
'</a>' +
'<%}%>' +
'<%} else {%>' +
'<p>none</p>' +
'<%}%>';
var lines = ''
lines += 'My skills:'
if(this.showSkills) {
for(var index in this.skills) {
lines+= '<a href="#">'
lines+= this.skills[index]
lines+= '</a>'
}
else
lines+= '<p>none</p>'
}
lines 是什么
模板引擎
By 方方
模板引擎
- 2,790