探究Vue源码:mustache模板引擎(2) mustache使用方法

news2024/11/27 7:37:20

mustache是最早的模板引擎 比vue的诞生还要早很多 而他的语法 就是基于 {{ }} 这样的双花括号

mustache属于通用性的应用 他既可以在浏览器中直接用 也可以在npm中使用
这里 我们为了方便 就直接去拿在浏览器中使用的包了 没必要再自己搭个环境
大家可以下载我上传的资源
vue源码探究辅助工具mustache.js

我们随便找一个目录 创建一个html文件和一个文件夹叫js
在这里插入图片描述
然后将刚刚弄来的mustache.js放进js文件夹中
在这里插入图片描述
然后 我们打开 mustache.js
他的最后一段代码是一个导出的语法
在这里插入图片描述
我们html环境显然不会允许他的存在
直接改成

window.Mustache = mustache;

将他定义在window对象上

然后 我们html代码编写如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src = "./js/mustache.js"></script>
    <script>
       console.log(Mustache);
    </script>
</body>
</html>

这里 我们引入了mustache.js 然后利用console.log将Mustache对象输出在浏览器控制台上
然后我们运行html文件
打开控制台
就可以看到 我们的Mustache对象就被输出在了控制台上
在这里插入图片描述
大家会发现 这里有个 render 方法
这和react渲染元素的生命周期是如出一辙
没错mustache 就要用它渲染界面
在这里插入图片描述
话说 那我们还是继续来实现上文中的那个需求

我们将html代码修改如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src = "./js/mustache.js"></script>
    <script>
        var data = {
            list: [
                {
                    "name": "小猫猫",
                    "age": 12,"sex":"男"
                },
                {
                    "name":"小红",
                    "age": 11,
                    "sex":"女"
                },{
                    "name":"小强",
                    "age": 13,
                    "sex":"男"
                }
            ]
        };
        var templateStr = `
            <ul>
                {{ #list }}
                    <li>
                        {{ name }}
                    </li>
                {{ /list }}
            </ul>`;
        let html = Mustache.render(templateStr, data);
        console.log(html);
    </script>
</body>
</html>

我们这里定义了数据data 将上文那个对象数组 放进了data对象中的list字段中
然后 我们定义了一个templateStr模板字符串 里面写的就是我们页面体
然后 我们先定义外面一个ul
然后 开启循环语句 换行的是list 这样 他就会找 render接到的第二个参数中的list字段
然后循环遍历他 里面写的 {{ name }} 就是取循环出来的每个下标的name值

然后调用Mustache中的render 第一个参数 需要一个页面体的模板字符串 用于渲染
第二个参数需要渲染时用到的一个对象数据

然后 我们将render函数返回的结果定义给了html 变量 然后在控制台输出

运行结果如下
在这里插入图片描述
可以看到 这样 我们就会去到了一个界面格式的html字符串

当然 mustache 不会帮你上树
你得到这个字符串 需要自己去上树

将html代码改成这样

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    <script src = "./js/mustache.js"></script>
    <script>
        var data = {
            list: [
                {
                    "name": "小猫猫",
                    "age": 12,"sex":"男"
                },
                {
                    "name":"小红",
                    "age": 11,
                    "sex":"女"
                },{
                    "name":"小强",
                    "age": 13,
                    "sex":"男"
                }
            ]
        };
        var templateStr = `
            <ul>
                {{ #list }}
                    <li>
                        {{ name }}
                    </li>
                {{ /list }}
            </ul>`;
        document.getElementById('list').innerHTML = Mustache.render(templateStr, data);
    </script>
</body>
</html>

运行结果如下
在这里插入图片描述
这样 我们的模板就上去了

循环语句中 大家一定要记住 不是一定要叫list啊
简单说 就是 {{ #需要循环的字段 }} 内容 {{ /需要循环的字段 }}
这样就可以了

然后 我们来看一下不循环的写法
html代码修改如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    <script src = "./js/mustache.js"></script>
    <script>
        var data = {
            name: "小猫猫",
            age: 2
        };
        var templateStr = `<h1>我是一只{{ name }},我今年{{ age }}岁啦</h1>`;
        document.getElementById('list').innerHTML = Mustache.render(templateStr, data);
    </script>
</body>
</html>

我们可以看到 我们直接通过 {{ 属性名 }} 就可以像vue的写法一样 去那响应式数据了
然后 我们打开界面
在这里插入图片描述
也是没有任何问题

然后 我们来看另一种用法

遍历非对象数组
我们将html代码修改如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    <script src = "./js/mustache.js"></script>
    <script>
        var data = {
            arr: [
                "小明",
                "小光",
                "小猫猫"
            ]
        };
        var templateStr = `<div>
            {{ #arr }}
                <p>{{ . }}</p>
            {{ /arr }}
        </div>`;
        document.getElementById('list').innerHTML = Mustache.render(templateStr, data);
    </script>
</body>
</html>

这里 我们在data中将arr定义为一个字符串数组
然后 在循环中 如果你想用数组下标 用一个 . 就行了
运行结果如下
在这里插入图片描述
然后 我们来处理多层数组嵌套的逻辑

我们这样编写代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    <script src = "./js/mustache.js"></script>
    <script>
        var data = {
            list: [
                {
                    name: "小明",
                    hobby: [
                        "羽毛球",
                        "游泳"
                    ]
                },
                {
                    name: "小光",
                    hobby: [
                        "游戏"
                    ]
                },
                {
                    name: "小猫猫",
                    hobby: [
                        "唱跳",
                        "rap",
                        "篮球"
                    ]
                }
            ]
        };
        var templateStr = `<div>
            {{ #list }}
                <h1>{{ name }}</h1>
                <div>
                    {{ #hobby }}
                        <span>{{ . }}</span>
                    {{ /hobby }}
                </div>
            {{ /list }}
        </div>`;
        document.getElementById('list').innerHTML = Mustache.render(templateStr, data);
    </script>
</body>
</html>

可以看到 我们对象数组中每一个下标对象里面又有一个数组hobby
这样 我们只需要在遍历的语法中再用变量就好了
运行结果如下
在这里插入图片描述
我一般管这种一层一层的叫俄罗斯套娃

然后 我们再来看看 一个类似于 v-if的语法

但是大家要先搞清楚 mustache 是识别不了表达式的 你要是写 arr == 1 mustache是识别不了的
他的判断 你只能给 false或 true

我们将html代码改成这样

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    <script src = "./js/mustache.js"></script>
    <script>
        var data = {
            bint: true
        };
        var templateStr = `<div>
            {{ #bint }}
                你好
            {{ /bint }}
        </div>`;
        document.getElementById('list').innerHTML = Mustache.render(templateStr, data);
    </script>
</body>
</html>

此时 我们语法判断了bint那么 data中的 bint 值是true 说明 这个内容是可以展示的 我们运行代码
在这里插入图片描述
然后 我们这次将 bint改为false
在这里插入图片描述
运行代码
在这里插入图片描述
可以看到 这下就啥都没了

然后 我们再来看个比较好玩的东西

在这里插入图片描述
我们这里 直接在js部分去写一个html代码
在这里插入图片描述
可以看到 这样 我们控制台就报错了 js也不继续往下走了
但是我们可以这样写

<script type="text/template">
  <div>你好</div>
 </script>

其实这个text/template只是因为 template 有模板的意思 而且后面大家都这样写 就约定俗成了 但其实这个东西浏览器是不识别的

简单说 就是 script 标签中的type 你都可以乱写 反正就是要让浏览器读不懂 他就不会读这里面的脚本

将页面结构写在这里面 然后我们运行界面就一起正常了
在这里插入图片描述
我们可以这样编写html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    <script src = "./js/mustache.js"></script>
    <script type="text/template" id="mytemplate">
        <div>
            {{ #list }}
                <h1> {{ . }} </h1>
            {{ /list }}
        </div>
    </script>
    <script>
        var data = {
            list: [
                "嗨",
                "飞来"
            ]
        };
        var templateStr = document.getElementById('mytemplate').innerHTML;
        document.getElementById('list').innerHTML = Mustache.render(templateStr, data);
    </script>
</body>
</html>

我们就用刚刚改变script的type的方法将页面模板放进去了 然后 定义了一个id
然后 templateStr 直接通过id 拿到我们写在模板里的内容

渲染在界面上

运行代码 效果如下
在这里插入图片描述
也是没有任何问题

后面我们就不是使用了 后续会了解并书写这个东西的底层逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职场老油条表示真干不过,部门新来的00后测试员已把我卷崩溃,想离职了...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

Linux学习之vim正常模式和插入模式

使用vim新建或者打开一个文件后&#xff0c;首先进入的就是正常模式&#xff0c;从正常模式按不同的按键能够进入其他三种模式。 在正常模式下&#xff0c;按i&#xff0c;I&#xff08;大写的i键&#xff09;&#xff0c;a&#xff0c;A&#xff0c;o&#xff08;小写的o&…

【3DsMAX】从零开始建房(6)

目录 1. 制作广告牌 2. 制作屋顶小船船身 1. 制作广告牌 先创建一个长方体 转换为可编辑多边形&#xff0c;选中面&#xff0c;插入 挤出 添加两个圆柱体作为支架 用轮廓工具收一下面 选中这三个物体打组 统一材质 设置线条颜色为黑色 2. 制作屋顶小船船身 先添加一个球体&…

顺序表刷题(1~3)

目录 移除元素 删除有序数组重复项 合并有序数组 移除元素 方法一&#xff1a; 如果找到一个删除一个这样的时间复杂度为O(n^2)&#xff08;最坏删除所有数据&#xff09;删除后还要挪动数据。我们可以将符合条件的数组元素放入一个临时数组中&#xff0c;这种方法的时间复杂…

什么是数据结构

一、什么是数据结构 1、数据结构的定义 数据&#xff1a;从计算机的角度来看&#xff0c;数据是所有能被输入到计算机中且能被计算机处理的符号的集合。它是计算机操作的对象的总称&#xff0c;也是计算机处理信息的某种特定的符号表示形式&#xff08;二进制码的抽象表示&am…

【高级篇】服务异步通信

服务异步通信-高级篇 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送…

030 JavaWeb Html CSS

目录 JavaWeb概述1.访问web的原理2.C/S软件和B/S软件区别3.静态网站和动态网站 HTMLHTML的概述Table表格详细用法见W3CSchool.chm合并单元格课程表 img标签table和img标签组合使用a标签表单表单Get提交和post提交 div和span CSS1.CSS概述2.CSS语法3.CSS三种写法行内样式内部样式…

VueX使用简明笔记

1、作用&#xff1a; vuex是使用vue中必不可少的一部分&#xff0c;基于父子、兄弟组件&#xff0c;我们传值可能会很方便&#xff0c;但是如果是没有关联的组件之间要使用同一组数据&#xff0c;就显得很无能为力&#xff0c;那么vuex就很好的解决了我们这种问题&#xff0c;…

Knife4j的使用、SpringFox和SpringDoc介绍

knife4j是一个Swagger的增强工具&#xff0c;能够完善项目的接口文档。 官网&#xff1a; Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j Swagger的生成的默认文档确实不好用&#xff08;不美观、不支持搜索、不能导出&#xff09; 在Swagger2中使用 想一想…

Android 12.0 原生SystemUI下拉通知栏每条通知默认展开

1.前言 在12.0的系统rom原生开发中,在在对SystemUI下拉通知栏做定制的时候,在下拉状态栏的时候,通知栏中 最后一条通知默认是收缩的 点击按钮 就会展开 原生系统systemui就是如此,为了更美观 所以要求最后一条通知也默认展开,显得更美观 最终效果图: 2.原生SystemUI下拉通…

C++/C按照时间命名保存bin文件

背景 在Linux应用编程过程中&#xff0c;使用C或者C语言保存、读取bin文件是比较常见的需求。这里详细记录一下使用C保存bin文件&#xff0c;也可以使用C语言实现。 代码 C/C语言保存bin文件函数&#xff0c;C中也能使用 正确写入返回0&#xff0c;错误返回-1 // C 保存bi…

双重检查锁定与延迟初始化

双重检查锁定的由来 在Java程序中&#xff0c;有时候可能需要推迟一些高开销的对象初始化操作&#xff0c;并且只有在使用这些对象时才进行初始化。此时&#xff0c;程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧&#xff0c;否则很容易出现问题…

51单片机操作系统——RTX51 Tiny

简介 RTX51 是keil公司开发的一款实时操作系统&#xff0c;其有两个版本&#xff1a; 1.Tiny 2.Full&#xff0c;区别如下&#xff1a; RTX51 Full &#xff1a;使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换 RTX51工作与中断功能相似的状态下 &#xff0c…

华为OD机试真题 JavaScript 实现【最远足迹】【2022Q4 100分】,附详细解题思路

一、题目描述 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时&#xff0c;随身携带的记录器会不定期地记录自身的坐标&#xff0c;但在记录的间隙中也会记录其他数据。探索工作结束后&#xff0c;探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足…

【打卡】苹果叶片病害分类和建筑物变化检测数据挖掘竞赛

【打卡】苹果叶片病害分类和建筑物变化检测数据挖掘竞赛 文章目录 【打卡】苹果叶片病害分类和建筑物变化检测数据挖掘竞赛Task 1两个赛题数据可视化任务2 苹果病害数据加载与数据增强任务三 Task 1两个赛题数据可视化 在这个任务中&#xff0c;参赛选手需要对两个赛题的数据进…

卡奥斯开源社区六月创作之星挑战赛开始啦!

活动须知 发布优质文章争榜&#xff0c;获取专属勋章、流量扶持及奖励&#xff01; 活动时间&#xff1a;6 月 1 日- 6 月 30 日 奖品发放&#xff1a;7月10日 参与方式 完成认证发布优质文章&#xff0c;选中相关活动标签&#xff0c;文章默认参与活动 文章要求 文章符合…

宠物行业传统“夫妻店”,如何向“线下 线上”模式转型?

据研究&#xff0c;目前我国宠物店以单体店为主&#xff0c;占比高达85%。      这些单体店规模较小&#xff0c;以夫妻店为主&#xff0c;并且服务区域有限&#xff0c;较少涉及到大规模连锁运营。      同时&#xff0c;在我国宠物店形态中&#xff0c;区域性小规模的…

YOLOV5 训练

YOLOV5训练过程 CUDA 和cuDnnan 安装教程 windows上安装可以参考这篇知乎文章 数据集准备 自己准备数据集 可以使用 labelImg 工具&#xff0c;直接 pip install labelimg 就可以安装了。 命令行中输入 labelImg 就可以运行 标注数据的输出结果有多种过格式&#xff0c;V…

【数据结构与算法】掌握顺序栈:从入门到实践

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f331;系列专栏&#xff1a;数据结构与算法 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 顺序栈的实现 初始化栈 判断栈空 判断栈满 入&#xff08;进&#xff09;栈 出栈 获取栈…

【算法系列 | 3】深入解析排序算法之插入排序

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…