工学1号馆

home

« | 返回首页 | »

关于Hogan.js

By Wu Yudong on March 08, 2019

最近在看一个源码的过程中发现了一个很简洁强大的模板Hogan.js。这里学习、实践、记录一下

Hogan的github地址为:https://github.com/twitter/hogan.js/

当然也可以直接引用cdn.bootcss.com上的资源

Hogan.js 是 Mustache 模板引擎的另一套实现,增加了预编译机制,使得模板字符串可以在打包阶段被预先处理成模板函数,这样浏览器就不必再重复去编译模板。

Hogan.js 同时提供了可以运行与_浏览器端,浏览器端负责用预编译后的代码渲染页面。

先看一个例子:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/hogan.js/3.0.2/hogan.js"></script>
</head>
<body>

<div id="wrapper"></div>
<script>
 var tab = {
     data: {
         "list":[
             {"name":"lily", "age":18, "food":"苹果"},
             {"name":"lucy", "age":20, "food":"香蕉"}
         ]
     },

     init: function() {
         this.onload()
     },

     onload: function() {
         // 定义模板
         var tpl =
         '{{#list}}'+
             '<div>我叫{{name}}, 今年{{age}}岁, 最爱吃{{food}}</div>'+
         '{{/list}}'

         var result = this.renderHtml(tpl, {list:this.data.list});

         $('#wrapper').html(result)
     },

     renderHtml : function(tpl, data){
         var template = Hogan.compile(tpl);
         var result = template.render(data);
         return result;
     }
 }

 $(function() {
     tab.init()
 })
</script>

</body>
</html>

输出结果:
我叫lily, 今年18岁, 最爱吃苹果
我叫lucy, 今年20岁, 最爱吃香蕉
当然,tab中的代码还可以简化为:

 var tab = {
     data: {
         "list":[
             {"name":"lily", "age":18, "food":"苹果"},
             {"name":"lucy", "age":20, "food":"香蕉"}
         ]
     },

     init: function() {
         this.onload()
     },

     onload: function() {
         // 定义模板
         var tpl =
         '{{#list}}'+
             '<div>我叫{{name}}, 今年{{age}}岁, 最爱吃{{food}}</div>'+
         '{{/list}}'

         var result = Hogan.compile(tpl).render({list:this.data.list});
         $('#wrapper').html(result)
     },
 }

1、{{name}}

<body>

<div id="wrapper"></div>
<script>
//渲染所需模板
var template = '<div>Hey! I am {{name}}!</div>';

//渲染所需数据
var data = {
    name : 'Rosen'
};

// 模板的编译、渲染
var result = Hogan.compile(template).render(data);

// 输出结果 
$('#wrapper').html(result);

//输出:Hey! I am Rosen!
</script>

</body>

2、{{{name}}}

<body>

<div id="wrapper"></div>
<script>
//渲染所需模板
var template = '<div>Hey! I am {{{name}}}!</div>';

//渲染所需数据
var data = { name : '<span style="color:red">Rosen</span>' };

// 模板的编译、渲染
var result = Hogan.compile(template).render(data);

// 输出结果 
$('#wrapper').html(result);

//输出:Hey! I am Rosen!
</script>

</body>

3、{{#list}} {{/list}}

这个作用于循环,当然#标记还可以当做bool型的判断。

<body>

<div id="wrapper1"></div>
<div id="wrapper2"></div>
<script>
//渲染所需模板
var template1 = '{{#list}} <span>{{name}}</span> {{/list}}';
var template2 = '{{#isRosen}}我就是Rosen啊!{{/isRosen}}';

//渲染所需数据

var data = {
	list : [ 
		{ name : 'Rosen' }, 
		{ name : 'JIM' } 
	],
	isRosen : true
};

// 模板的编译、渲染
var result1 = Hogan.compile(template1).render(data);
var result2 = Hogan.compile(template2).render(data);
// 输出结果 
$('#wrapper1').html(result1);
$('#wrapper2').html(result2);

//输出:
//Rosen JIM
//我就是Rosen啊!
</script>

</body>

4、{{^list}} {{/list}}

和上一个是相反的,就是非的逻辑。如果列表为空,或者非真值都会进这个分支,其中包括false,null,undefined,0什么的。

<div id="wrapper"></div>
<script>
//渲染所需模板
var template = '{{^isRosen}}谁是Rosen? 不认识!{{/isRosen}}';

//渲染所需数据

var data = {
	list : [ 
		{ name : 'Rosen' }, 
		{ name : 'JIM' } 
	],
	isRosen : false
};

// 模板的编译、渲染
var result = Hogan.compile(template).render(data);

// 输出结果 
$('#wrapper').html(result);

//输出:
//谁是Rosen? 不认识!
</script>

5、{{.}}

代表枚举类型里的当前元素,枚举类型没有索引名,只能用{{.}}

<div id="wrapper"></div>
<script>
//渲染所需模板
var template = '{{#list}}<span>{{.}}</span>{{/list}}';

//渲染所需数据

var data = {
	list : ['Wu', 'He']
};

// 模板的编译、渲染
var result = Hogan.compile(template).render(data);

// 输出结果 
$('#wrapper').html(result);

//输出:
//<span>Wu</span><span>He</span>

</script>

6、{{!}}

表示注释

简单的总结一下:

{{data}} 转义的变量

{{{data}}} 不转义的变量

{{#list}} {{/list}} 列表循环 / 真值判断

{{^list}} {{/list}} 空列表 / 非真值判断

{{.}} 枚举的当前元素

{{!}} 我是注释

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)