handlebars的使用方法和art-template 模板引擎类似,同时支持 NodeJs和浏览器。使用模板引擎的好处就是便于对代码进行维护,同时,使用模板引擎操作DOM,效率也会更高一些。个人觉得还是art-template 比较好用一些,因为工作中使用了handlebars,查看它的官方文档时,使用方法介绍的也不详细,花时间整理了一些它的常用方法,希望会对你有帮助。
如果想了解art-template 模板引擎,可以点击这里查看。
可以在命令行中使用如下命令安装,然后使用require直接引入
npm install handlebars --save
也可以直接下载 js 文件,进入链接 Ctrl+s 保存文件至项目目录中:https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.3/handlebars.min.js
//if 判断
{{#if user}}
<h2>{{user.name}}</h2>
{{/if}}
// if else
{{#if user}}
<h2>{{user.name}}</h2>
{{else}}
<h2>未登录</h2>
{{/if}}
//多分支
{{#if user}}
<h2>{{user.name}}</h2>
{{else if ...}}
<h2>未登录</h2>
{{/if}}
{{#each this}}
{{#if @first}} First! {{/if}}
{{@index}} {{@key}}
{{#if @last}} Last :( {{/if}}
{{/each}}
例如:
/*html模板*/
{{#each this}}
<p>城市:{{city}},天气:{{weather}}</p>
{{/each}}
/*数据*/
let array=[
{city:"北京",weather:"sunshine"},
{city:"上海",weather:"wind"},
{city:"天津",weather:"rain"},
{city:"广州",weather:"snow"},
]
/*页面输出*/
<p>城市:北京,天气:sunshine</p>
<p>城市:上海,天气:wind</p>
<p>城市:天津,天气:rain</p>
<p>城市:广州,天气:snow</p>
/*html模板*/
{{#each this}}
<p>{{@key}}:{{this}}</p>
{{/each}}
/*数据*/
let data={
name:"张三",
age:"19",
sex:"男"
}
/*页面输出*/
<p>name:张三</p>
<p>age:19</p>
<p>sex:男</p>
当我们传进来的数据有多层嵌套时,循环内部调用外部的变量,需要在变量前面加../
,看下面这个例子:
/*html模板*/
<p>当前是第{{pageNo}}页,显示{{pageSize}}条数据</p>
<ul>
{{#each pageList}}
<li><a href="?pagesize={{../pageSize}}&pageNo={{this}}">{{this}}</a></li>
{{/each}}
</ul>
/*数据*/
let data={
pageNo:1,
pageSize:5,
pageList:[1,2,3,4,5,6]
}
/*页面输出*/
<p>当前是第1页,显示5条数据</p>
<ul>
<li><a href="?pagesize=5&pageNo=1">1</a></li>
<li><a href="?pagesize=5&pageNo=2">2</a></li>
<li><a href="?pagesize=5&pageNo=3">3</a></li>
<li><a href="?pagesize=5&pageNo=4">4</a></li>
<li><a href="?pagesize=5&pageNo=5">5</a></li>
<li><a href="?pagesize=5&pageNo=6">6</a></li>
</ul>
{{#each this}}
{{!-- 不会出现在生成的代码中--}}
<!-- 这是注释,会出现在生成的代码中 -->
<p>序号:{{sequence @index}},城市:{{city}}</p>
{{/each}}
html模板内容:
<section class="content-header">
<script type="text/x-handlebars-template" id="handle_page_title">
<h1>{{title}}</h1>
</script>
</section>
js文件内容:
//获取html结构
let source = $("#handle_page_title").html();
//编译成模板
let template = handlebars.compile(source);
//生成完成的html结构
let html = template({title: "这是标题内容"});
//插入dom
$(".content-header").html(html);
最终输出结果:
<section class="content-header">
<h1>这是标题内容</h1>
</section>
例如each遍历中,如果想让@index从1 开始,我们可以这么做:
/*html模板*/
{{#each this}}
<p>序号:{{sequence @index}},城市:{{city}}</p>
{{/each}}
/*数据*/
let array=[
{city:"北京",weather:"sunshine"},
{city:"上海",weather:"wind"},
{city:"天津",weather:"rain"},
{city:"广州",weather:"snow"},
]
/*js代码*/
//生成列表序号,需要放在handlebars.compile()的前面
Handlebars.registerHelper("sequence", (data) => {
return data + 1;
})
var source = document.getElementById("tpl").innerHTML;
var html = Handlebars.compile(source)(array);
document.getElementById("content").innerHTML=html;
/*页面输出*/
<p>序号:1,城市:北京</p>
<p>序号:2,城市:上海</p>
<p>序号:3,城市:天津</p>
<p>序号:4,城市:广州</p>