mustache模板引擎(上)

256 阅读2分钟

mustache

简介

mustache 是一个模板引擎,比 Vue 的诞生要早许多。该库是开源的,在node环境可以 npm install 下载,也可以在浏览器端使用,引入外部链接即可。

以浏览器端使用为例:引入文件

<script src="https://cdn.bootcdn.net/ajax/libs/mustache.js/4.2.0/mustache.min.js"></script>

引入后在全局中多了 mustache 这个对象,该对象的render()方法有2个参数,第一个参数是HTML结构模板,第二个参数是填充的数据对象

基本用法

{{ }} 的形式使用变量,内部不支持JS表达式,会报错。

  • 非循环案例
 const domStr = mustache.render(`我是{{name}},今年{{age}}岁了。`, {
        name: "小李",
        age: 22,
  });
 console.log(domStr); // 我是小李,今年22岁了。
  • 循环案例
 const demoStr = `<ul>
        {{#arr}}
            <li>我是:{{name}},今年{{age}}岁了。</li>
        {{/arr}}
    </ul>`;
const data = {
    arr: [
      {
        name: "小洪",
        age: 21,
      },
      {
        name: "小蔡",
        age: 22,
      },
      {
        name: "小林",
        age: 22,
      },
    ],
};
const domStr = mustache.render(demoStr, data);
document.querySelector(".box").innerHTML = domStr;

image.png

当循环的数组中都是简单的元素时,可以用 . 代替。如

const demoStr = `<ul>
    {{#arr}}
        <li>{{.}}</li>
    {{/arr}}
</ul>`;
const domStr = mustache.render(demoStr, {
arr: ["小陈", "小王", "小徐", "小林"],
});
console.log(domStr);
/*
    <ul>
        <li>小陈</li>
        <li>小王</li>
        <li>小徐</li>
        <li>小林</li>
    </ul>
*/

当循环的是多重数组时,可以 {{#}} {{/}} 嵌套多个数组去循环操作

  • 可以使用布尔值控制元素的显示与隐藏,相当于vue中的v-if。
// 当 show 为 false 时,页面中不会显示数据;为true时可以显示
const templateStr = `{{#show}}<p>{{name}}</p>{{/show}}`;
const domStr = mustache.render(templateStr, {
    show: true,
    name: "小李",
});
document.querySelector(".box").innerHTML = domStr;
  • 可以使用script标签来存储模板,type不要为text/javascript即可。
// 效果跟上面的是一样的
<script type="text/template" id="template">
     {{#show}}<p>{{name}}</p>{{/show}}
</script>
<script>
  const templateStr = document.getElementById("template").innerHTML;
  const domStr = mustache.render(templateStr, {
    show: true,
    name: "小李",
  });
  document.querySelector(".box").innerHTML = domStr;
</script>

底层原理

最简单的模板引擎是利用字符串的repalce(),replace第一个参数是一个匹配的正则,第二个参数可以是一个函数,该函数可以捕获到正则匹配出来的内容,从而进行替换。