在SO中有几个类似的问题和许多答案,这些答案大多针对特定情况进行了定制。但是,通过使用本地JS 模板文字,您可以轻松地想出自己的模板抽象。也许您甚至可以放弃将来使用模板引擎库来完成这样的工作。
以下代码是纯JS。让我们从适当的数据开始。
var data = { labels: ['ID','Name']
, rows : [ {"id": "1", 'name': "richard"}
, {"id": "2", 'name': "santos"}
]
};
现在,让我们定义一个
tableTemplate
函数,该函数接受
data
并给我们返回一个HTML表格。
function tableTemplate(data){
return `
<table>
<tr> ${data.labels.map(label => html`
<th>$${label}</th>`).join("")}
</tr>${data.rows.map(row => html`
<tr>
<td>$${row.id}</td>
<td>$${row.name}</td>
</tr>`).join("")}
</table>`;
}
那么这个 html`
是什么东西,还有那个 $$
呢?
- 首先,
html`
只是一个通用的 标签函数,我们只需要定义一次,而不需要修改它,就可以在所有的模板函数中使用它。
- 另一方面,
$$
很简单。第一个 $
只是一个简单的字符串字符,而第二个则是模板字符串中变量的转义字符,例如 ${x}
。我们可以使用标签函数来验证我们的 HTML 代码,通过转义无效的 HTML 字符,如 &
、>
、<
、"
、'
或 `
。下面给出的版本看起来有点复杂,但实际上非常简单且非常有用。它基本上转义了无效的 HTML 字符,并提供了模板字符串的“原始”版本。
请点击上面的链接获取更多信息。以下是内容:
function html(lits,...vars){
var esc = { "&": "&"
, ">": ">"
, "<": "<"
, '"': """
, "'": "'"
, "`": "`"
};
return lits.raw
.reduce( (res,lit,i) => (res += lit.endsWith("$") ? lit.slice(0,-1) + [...vars[i].toString()].reduce((s,c) => s += esc[c] || c, "")
: lit + (vars[i] || ""))
, ""
);
}
现在,是时候将所有内容组合起来,创建一个可工作的示例。这次我们还要添加<thead>
和<tbody>
标签以及一些CSS样式。
function html(lits,...vars){
var esc = { "&": "&"
, ">": ">"
, "<": "<"
, '"': """
, "'": "'"
, "`": "`"
};
return lits.raw
.reduce( (res,lit,i) => (res += lit.endsWith("$") ? lit.slice(0,-1) + [...vars[i].toString()].reduce((s,c) => s += esc[c] || c, "")
: lit + (vars[i] || ""))
, ""
);
}
function tableTemplate(data){
return `
<table>
<thead>
<tr>${data.labels.map(label => html`
<th>$${label}</th>`).join("")}
</tr>
</thead>
<tbody>${data.rows.map(row => html`
<tr>
<td>$${row.id}</td>
<td>$${row.name}</td>
</tr>`).join("")}
</tbody>
</table>`;
}
var data = { labels: ['ID','Name']
, rows : [ {"id": 1, 'name': "richard"}
, {"id": 2, 'name': "santos"}
, {"id": 3, 'name': "<ömer & 'x'>"}
]
};
document.write(tableTemplate(data));
table {
background-color: LightPink;
border : 0.2em solid #00493E;
border-radius : 0.4em;
padding : 0.2em
}
thead {
background-color: #00493E;
color : #E6FFB6
}
tbody {
background-color: #E6FFB6;
color : #00493E
}
显然,您现在可以像在HTML文本文件中一样,在tableTemplate
函数的准HTML模板文字中插入<style>
标签或class="whatever"
属性。
另请注意,如果您将结果html文本字符串console.log
出来,由于原始转换的原因,它会像下面这样美观地显示(根据tableTemplate
函数中的缩进)...
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>richard</td>
</tr>
<tr>
<td>2</td>
<td>santos</td>
</tr>
<tr>
<td>317</td>
<td><ömer & 'x'></td>
</tr>
</tbody>
</table>
object
将抛出语法错误。(b) 对象是无序的。 - Roamer-1888这是代码
。您的键盘上有三个不同的单引号字符 - 但它们都非常不同:一个用于组合重音符号,一个用于撇号和单引号,一个是反引号 - 最后一个在这里具有特殊的格式化含义。 - Mörre