XTemplate模板学习和使用总结

XTemplate模板学习和使用总结

前言

  XTemplate是我接触的第一个模板语言,用在公司的一个NodeJS项目中,跟它打交道经常是因为需要使用它的语法向模板中注入数据。因为是刚入门前端不久,所以一开始对这个语言有些抵触(毕竟不会用,还要上手写业务...),“这种我明明可以写在js文件里啊,为啥非要写在模板里??”之类。但是在了解并使用它写了一些业务之后就发现,模板语言是真的好用。

XTemplate的好处

  1. 首先,使用XTemplate可以很方便地使用include语法调用不同的模板。你可以将一个复杂的页面拆成几个不同的模块来写,其中很可能一些模块是可复用的,这样将来再需要这些模块时只要简单的将其include进来就好,而不必每次都重新写一遍。在浏览代码时也会显得很直观;
  2. 这种可拆分的特性不仅仅只是直观而已,其可维护性和可扩展性都大大提高了。业务需求变更时,只需更改涉及到的功能模块,然后所有调用这个模块的页面都会同步修改。想要增加功能时亦是如此;
  3. 也是因为可拆分的特性,一个项目可以方便的分由几个团队成员共同完成,每个人都可以专注于开发自己的模块,避免不必要的代码冲突,这使得开发效率大大提高;
  4. 就数据的导入来讲,在模板阶段导入数据和采用js文件异步方式导入数据优势各有不同。js异步加载一般是在页面在用户浏览器端加载完成时进行,也就是说页面“到达”浏览器端时是没有数据的。但这个特点并不影响js异步加载作为页面交互的主要手段。模板加载的方式就不同了,页面在“到达”用户浏览器之前就已经是加载好了的,用户不必再通过js向服务器发送请求,以加载页面的基础数据,只需要在需要交互的时候再发送请求即可,体验更加无缝;
  5. XTemplate对编写HTML也是非常友好的。具体在于XTemplate提供了不少非常实用的语法功能,正是在了解和使用这些功能的过程中,我逐渐改变了想法(留下了不学无术的泪水.jpg);
  6. 由于没有接触过其他模板引擎,所以XTemplate独立于其他模板引擎的独有特点这里就不讲了(毕竟刚入门的菜鸡)。但是就自己在工作中的使用体验来讲,XTemplate还是很好上手的,学习成本并不高。

XTemplate语法

  下面着重介绍一些我在工作中经常用到的语法:

一、变量

  利用这个语法可以向HTML中插入变量(数据),是一个经常会被用到的基础功能,语法如下:

{{ pageData }}

  不但如此,还可以访问并取到变量的子级变量,语法和js相同:

{{ pageData.num }}
{{ pageData['num'] }}

  然而,使用 {{}} 会对一些类似"<", ">"这样的字符串进行转义,显示出来就是"& lt;", "& gt;",所以如果需要引入原始数据(不被转义),就需要使用下面的语法:

{{{ pageData }}}
{{{ pageData.num }}}

  如果连大括号都要保留(不被转义或误识别)的话,那就需要这样写:

{{%
  {{ pageData }}
%}}

  如果想添加注释呢,只需要在双括号内加一个感叹号就行了:

{{! 博主很帅(cai),大家知道就行了,不要声张}}

二、作用域

  每一个模板都有一个独立的作用域,在子模板中可以访问到父模板的上下文,但是在子模板中定义或者修改变量不会影响到父模板的变量。如下所示:

  parent.XTpl:

{{ set (a = 1, b = 2) }}
{{include ("sub.XTpl") }}
in parent:
a = {{ a }}
b = {{ b }}

  sub.XTpl:

in sub:
{{ set b = 3 }}
a = {{ a }}
b = {{ b }}

  渲染 parent.XTpl,将会得到下面的结果:

in sub:
a: 1
b: 3
in parent:
a: 1
b: 2

三、方法

  在写模板的时候可以使用js自带的方法,比如数组的方法、字符串的方法都可以使用,这点非常方便。

{{ set str = '我没有钱' }}
{{ str.split('')[0] + str.split('')[2] + str.split('')[3] }}  // => 我有钱

四、操作符

  XTemplate支持常见的操作符,比如:加(+),减(-),乘(*),除(/),余(%),还有比较类型的:=, !, >, >=, <, <=,以及逻辑操作方面的:或(||),与(&&),非(!)等等,甚至支持三元运算符:

{{ a > b ? a : b }}

  然而需要注意的是:这里面不包含""号,如果需要使用等于,必须使用全等号(=),否则会报错。

五、函数调用

  如果你传递了 javascript 的方法到模板中,你可以像在 javascript 中一样使用它。比如使用预先定义并传进来的函数,将加载进模板的json数据转换为字符串,以供js文件从HTML中调取。

六、if 语句

  使用if语句可以对一个或多个条件进行判断,从而根据需求的不同而显示不同的代码块。

{{# if (I'm rich) }}
  Show me my money.
{{/ if }}  

  或者你还可以加入 elseif 语句

{{# if (I am handsome) }}
  I am handsome.
{{ elseif (I am owesome) }}
  I am not only handsome but also owesome.
{{ else }}
  Sorry, but there is no else.
{{/ if }}

七、each 语句

  使用each语句可以对数据和HTML结构进行循环,非常方便的将数据按照顺序写入到HTML结构中:

{{set (array = [{
  name: "one"
}, {
  name: "two"
}])}}

{{#each(array)}}
  {{'第' + (xindex + 1) + '行:' + this.name}}
{{/each}}

  渲染这个模版,将会得到结果:

第1行:one
第2行:two

八、include 语句

  include语句用于引入其他模板:

{{ include ("item.xtpl") }}

  不但如此,在引入模板时还可以传递并修改参数:

{{ set (x = "x", y = "y") }}
{{ include ("sub.xtpl", a = x, b = x)}}

  渲染 parent.html 将会得到结果:

x: x
y: y
a: x
b: x

九、模板继承

  模板继承可以使用户非常容易地复用模板。比如可以写一个基础模板,里面写入一些公用的内容,并且在里面定义一些block,比如header/body/footer之类,然后子模板只需要将这些block重写即可。如下:

  先定义一个base.xtpl:

<!doctype html>
<html>
    <head>
        <meta name="charset" content="utf-8" />
        <title>{{title}}</title>
        {{{block ("head")}}}
    </head>
    <body>
        {{{block ("body")}}}
    </body>
</html>

  再编写content.xtpl:

{{extend ("./parent")}}

{{#block ("head")}}
    <link type="text/css" href="test.css" rev="stylesheet" rel="stylesheet"/>
{{/block}}

{{#block ("body")}}
    <h2>{{title}}</h2>
{{/block}}

  然后我们使用数据 {title: 'XTemplate'} 渲染 content.xtpl,将会得到下面的结果:

<!doctype html>
<html>
    <head>
        <meta name="charset" content="utf-8" />
        <title>XTemplate</title>
        <link type="text/css" href="test.css" rev="stylesheet" rel="stylesheet"/>
    </head>
    <body>
        <h2>XTemplate</h2>
    </body>
</html>

总结

  XTemplete是博主接触的第一款模板语言,算是有了一个概念。希望将来可以不断拓展知识面,不断接触更多更好玩的东西。

posted @ 2018-09-05 10:12  hexiaobang  阅读(4869)  评论(0编辑  收藏  举报