ThinkJS 视图

2021-09-17 10:22 更新

视图

视图即模版,默认的根目录为 view/

视图文件

视图文件默认的规则为 模块/控制器_操作.html

假如 URL home/article/detail 解析后的模块是 home,控制器是 article,操作是 detail,那么对应的视图文件为 home/article_detail.html

视图配置

视图默认配置如下,可以在配置文件 src/common/config/view.js 中修改:

export default {
  content_type: "text/html", //输出模版时发送的 Content-Type
  file_ext: ".html", //文件的扩展名
  file_depr: "_", //控制器和操作之间的连接符
  root_path: think.ROOT_PATH + "/view", //视图文件的根目录
  type: "ejs", //模版引擎
  options: {} //模版引擎需要的配置项
};

注: 视图默认根目录在 view/。如果想每个模块有独立的视图目录,将配置 root_path 修改为空即可。

修改连接符

默认控制器和操作之间的连接符是 _,文件名类似为 index_index.html,如果想将控制器作为一层目录的话,可以将连接符修改为 /

export default {
  file_depr: "/"
}

模版引擎

ThinkJS 默认支持的模版引擎有:ejsjadeswig 和 nunjucks,默认模版引擎为 ejs,可以根据需要修改为其他的模版引擎。

ejs

定界符

ejs 默认的定界符是 <% 和 %>。如果想修改定界符,可以通过配置里的 options 来修改,如:

export default {
  options: {
    delimiter: "&" //将定界符修改为 <& 和 &>
  }
}

变量输出

  • 转义输出 <%= data.name%>
  • 不转义输出 <%- data.name%>
  • 注释 <%# data.name%>

条件判断

<%if(data.name === "1"){%>
    <p>...</p>
<%}else if(data.name === "2"){%>
    <p>...</p>
<%}else{%>
    <p>...</p>
<%}%>

循环

<%list.forEach(function(item)){%>
    <li><%=item.name%></li>
<%}%>

引用文件

ejs 不支持模版继承。但可以将公用的模版独立成一个文件,然后通过 include 来引入。

<%include inc/header.html%>

注: ejs 模版使用的变量需要在控制器中赋值,否则会报错。

更多 ejs 使用文档请见 这里

nunjucks

nunjucks 是一款类似于 jinja2 的模版引擎,功能异常强大,复杂项目建议使用该模版引擎。

定界符

块级定界符为 {% 和 %},变量定界符为 {{ 和 }},注释定界符为 <# 和 #>。如:

{{ username }}  

{% block header %} 
This is the default content
{% endblock %}

变量输出

可以通过 {{ username }} 来输出变量,默认输出的变量会自动转义,如果不想被转义,可以通过 {{ username | safe }} 来处理。

模版继承

父级模版:

{% block header %}
This is the default content
{% endblock %}

<section class="left">
  {% block left %}{% endblock %}
</section>

<section class="right">
  {% block right %}
  This is more content
  {% endblock %}
</section>

子级模版:

{% extends "parent.html" %}

{% block left %}
This is the left side!
{% endblock %}

{% block right %}
This is the right side!
{% endblock %}

条件判断

{% if hungry %}
  I am hungry
{% elif tired %}
  I am tired
{% else %}
  I am good!
{% endif %}

循环

<h1>Posts</h1>
<ul>
{% for item in items %}
  <li>{{ item.title }}</li>
{% else %}
  <li>This would display if the "item" collection were empty</li>
{% endfor %}
</ul>

具体使用文档请见 这里

jade

jade 模版使用方式请见 这里

swig

swig 模版使用方式请见 这里

扩展模版引擎

模版引擎使用 Adapter 实现。如果项目里需要使用其他模版引擎,可以通过 Adapter 进行扩展,具体请见 这里

变量赋值

控制器中可以通过 assign 方法进行变量赋值。

赋值单个变量

export default class extends think.controlle.base {
  indexAction(){
    this.assign("title", "ThinkJS 官网");
  }
}

赋值多个变量

export default class extends think.controlle.base {
  indexAction(){
    this.assign({
      title: "ThinkJS 官网",
      author: "thinkjs"
    });
  }
}

获取赋值

变量赋值后也可以通过 assign 来获取赋过的值。如:

export default class extends think.controlle.base {
  indexAction(){
    this.assign("title", "ThinkJS 官网");
    let title = this.assign("title");
  }
}

模版渲染

可以通过 display 方法进行模版渲染。如果不传具体的模版文件路径,会自动查找。如:

export default class extends think.controller.base {
  indexAction(){
    this.display();// render home/index_index.html
  }
}

也可以指定具体的模版文件进行渲染,关于 display 方法的详细使用请见 这里

获取渲染后的内容

如果有时候不想支持输出模版,而是想获取渲染后的模版内容,那么可以通过 fetch 方法来获取。

ES6 方式

export default class extends think.controller.base {
  * indexAction(){
    let content = yield this.fetch();
    ...
  }
}

动态创建类的方式

module.exports = think.controller({
  indexAction: function(){
    this.fetch().then(function(content){
      ...
    })
  }
})

关于 fetch 方法的详细使用方式请见 这里

国际化

启动国际化后,视图路径会多一层国际化的目录。如:具体的视图路径变为 view/zh-CN/home/index_index.html,其中 zh-CN 为语言名。

关于如果使用国际化请见 扩展功能 -> 国际化

多主题

设置多主题后,视图路径会多一层多主题的目录。如:具体的视图路径变为view/default/home/index_index.html,其中 default 为主题名称。

可以通过 http.theme 方法来设置当前的主题,设置主题一般是通过 middleware 来实现。

关于 middleware 更多信息请见 扩展功能 - Middleware

默认模版变量

为了可以在模版里很方便的获取一些通用的变量,框架自动向模版里注册了 httpcontrollerconfig 等变量,这些变量可以在模版里直接使用。

下面的代码示例都是基于 ejs 模版引擎的,其他的模版引擎下需要根据相应的语法进行修改。

http

模版里可以直接使用 http 对象下的属性和方法。

controller

模版里可以直接使用 controller 对象下的属性和方法。

export default class extends think.controller.base {
  indexAction(){
    this.navType = "home";
  }
}

Action 里给当前控制器添加了属性 navType,那么模版里就可以直接通过 controller.navType 来使用。

<%if(controller.navType === "home")%>
  <li className="action">home</li>
<%}else{%>
  <li>home</li>
<%}%>

config

通过 config 对象可以在模版中直接对应的配置,如:

<%if(config.name === "text"){%>

<%}%>

国际化方法 _

在模版中可以直接通过 _ 方法获取对应本地化的值,这些值在 src/common/config/locales/[lang].js 中定义。

<%= _("title")%>

更多国际化相关的信息请见 这里

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号