You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
vartplString='<h1>你好,<%= name %></h1>';functionTemplate(tpl){//todo}vartpl=newTemplate(tplString);varres=tpl.render({name: 'damocles'});// <h1>你好,damocles</h1>
javascript模板引擎
之前使用过的模板引擎有:ejs、handlebars。能提升不少工作效率,不用去具体操作dom,只关心数据的获取,然后把渲染好的模板再一股脑儿插入到dom中。
网上也看到很多说几十行就实现模板引擎的文章,原理清楚,不过一直没有亲自实践过(纸上得来终觉浅啊),虽然现在我几乎没用前端的模板引擎了。今日闲来无事,也来把玩把玩。
想要知道怎么写,首先得清楚要怎么用?假设我有这么一段模板内容(js字符串,或script[type != javascript]标签,或新元素template),如下:
这里模板分割符采用<% %>
那我在js里面这样调用
如果只是针对这个例子,采用简单替换就可以了,这里不作介绍,因为这种情况,现实应用中确实太少了。现实运用中,最好有简单的js执行逻辑,比如:if,else,for之类,数据不仅是支持基本类型,还可以有复杂类型:object,array({menu: ['菜单1','菜单2','菜单3'] }),不过调用就是这样。
先只处理这两种情况
<%- jscode %> js执行代码
<%= variable %> 输出变量
采用上面这中代码,有一定限制,在渲染模板的时候,变量为this[变量名],参考其他文章的做法,有些是在循环匹配阶段手动添加"this.",这种限制比较大,要考虑在什么情况下添加,有些是在使用模板代码时,在模板里面加this,这种其实比较灵活,但是会比较繁琐,每个变量前面都需要加this。
一个完整的例子
这里采用了在模板代码加this的方式,但是觉得感觉好繁琐。想在搜集模板代码的时候,自动添加this.,尝试无果(可能是我没有找到方法吧),于是想:我如果在函数创建时,把渲染模板时的数据当作参数传进去,这种可以实现。
模板代码中省去this的完整例子
采用这种方法,就能够省去模板代码中的this,当然这里使用this也不会报错,同样可用。只是不会在new Template的时候创建函数,没有了预编译,只在渲染的时候才创建函数,可能会影响到速度?
本来在搜集模板代码内容时候,想直接使用字符串拼接的方式,这样比数组push的方式快一点儿,只是可读性会差很多。
The text was updated successfully, but these errors were encountered: