mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-28 13:02:21 +00:00
add string/template example
This commit is contained in:
parent
d660de64af
commit
64a77470f8
106
docs/string.md
106
docs/string.md
@ -318,13 +318,117 @@ var msg = `Hello, ${place}`;
|
|||||||
// 报错
|
// 报错
|
||||||
```
|
```
|
||||||
|
|
||||||
由于模板字符串的大括号内部,就是执行JavaScript代码,因此如果表达式放在引号之中,将会原样输出。
|
由于模板字符串的大括号内部,就是执行JavaScript代码,因此如果大括号内部是一个字符串,将会原样输出。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
`Hello ${'World'}`
|
`Hello ${'World'}`
|
||||||
// "Hello World"
|
// "Hello World"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 实例:模板编译
|
||||||
|
|
||||||
|
下面,我们来看一个通过模板字符串,生成正式模板的实例。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var template = `
|
||||||
|
<ul>
|
||||||
|
<% for(var i=0; i < data.supplies.length; i++) {%>
|
||||||
|
<li><%= data.supplies[i] %></li>
|
||||||
|
<% } %>
|
||||||
|
</ul>
|
||||||
|
`;
|
||||||
|
```
|
||||||
|
|
||||||
|
上面代码在模板字符串之中,放置了一个常规模板。该模板使用`<%...%>`放置JavaScript代码,使用`<%= ... %>`输出JavaScript表达式。
|
||||||
|
|
||||||
|
怎么编译这个模板字符串呢?
|
||||||
|
|
||||||
|
一种思路是将其转换为JavaScript表达式字符串。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
echo('<ul>');
|
||||||
|
for(var i=0; i < data.supplies.length; i++) {
|
||||||
|
echo('<li>');
|
||||||
|
echo(data.supplies[i]);
|
||||||
|
echo('</li>');
|
||||||
|
};
|
||||||
|
echo('</ul>');
|
||||||
|
```
|
||||||
|
|
||||||
|
这个转换使用正则表达式就行了。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var evalExpr = /<%=(.+?)%>/g;
|
||||||
|
var expr = /<%([\s\S]+?)%>/g;
|
||||||
|
|
||||||
|
template = template
|
||||||
|
.replace(evalExpr, '`); \n echo( $1 ); \n echo(`')
|
||||||
|
.replace(expr, '`); \n $1 \n echo(`');
|
||||||
|
|
||||||
|
template = 'echo(`' + template + '`);';
|
||||||
|
```
|
||||||
|
|
||||||
|
然后,将`template`封装在一个函数里面返回,就可以了。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var script =
|
||||||
|
`(function parse(data){
|
||||||
|
var output = "";
|
||||||
|
|
||||||
|
function echo(html){
|
||||||
|
output += html;
|
||||||
|
}
|
||||||
|
|
||||||
|
${ template }
|
||||||
|
|
||||||
|
return output;
|
||||||
|
})`;
|
||||||
|
|
||||||
|
return script;
|
||||||
|
```
|
||||||
|
|
||||||
|
将上面的内容拼装成一个模板编译函数`compile`。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
function compile(template){
|
||||||
|
var evalExpr = /<%=(.+?)%>/g;
|
||||||
|
var expr = /<%([\s\S]+?)%>/g;
|
||||||
|
|
||||||
|
template = template
|
||||||
|
.replace(evalExpr, '`); \n echo( $1 ); \n echo(`')
|
||||||
|
.replace(expr, '`); \n $1 \n echo(`');
|
||||||
|
|
||||||
|
template = 'echo(`' + template + '`);';
|
||||||
|
|
||||||
|
var script =
|
||||||
|
`(function parse(data){
|
||||||
|
var output = "";
|
||||||
|
|
||||||
|
function echo(html){
|
||||||
|
output += html;
|
||||||
|
}
|
||||||
|
|
||||||
|
${ template }
|
||||||
|
|
||||||
|
return output;
|
||||||
|
})`;
|
||||||
|
|
||||||
|
return script;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`compile`函数的用法如下。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var parse = eval(compile(template));
|
||||||
|
div.innerHTML = parse({ supplies: [ "broom", "mop", "cleaner" ] });
|
||||||
|
// <ul>
|
||||||
|
// <li>broom</li>
|
||||||
|
// <li>mop</li>
|
||||||
|
// <li>cleaner</li>
|
||||||
|
// </ul>
|
||||||
|
```
|
||||||
|
|
||||||
## 标签模板
|
## 标签模板
|
||||||
|
|
||||||
模板字符串的功能,不仅仅是上面这些。它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。
|
模板字符串的功能,不仅仅是上面这些。它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user