探究Vue源码:mustache模板引擎(4) 了解mustache转换概念,简述tokens转换

news2024/9/25 3:23:08

上文 探究Vue源码:mustache模板引擎(3) 通过编写简单正则了解mustache转换思路我们用正则表达式构建了一个简易版的render模板编译函数
但是 我们有特意强调过 mustache的render函数并非用简单正则实现的 因为这样无法实现循环和一些比较复杂的逻辑处理

它的实现基理可以参考这张图
在这里插入图片描述
这里 我们先接一个模板字符串 然后将他编译成一个 tokens
tokens作为一个中间的过度 然后 再通过数据解析tokens 转换成一个 我们需要的dom字符串

其中 我们涉及到一个词 叫 tokens
在这里插入图片描述
中文意思也差不多就相当于一个代号 标志

而在我们这套概念中 tokens 其实就是一个js的嵌套数组
就是我们 模板字符串在js中的一个表现形式
就好比说 下图这个概念 我们一个html格式的字符串 就会被转成一个二维数组
在这里插入图片描述
大家应该会发现一个规律 我们 {{ }} 包裹的内容 会被处理成 name 其余的部分 都是直接被读成text 而 每个数组的分割 也是通过 一对花括号处理的

大体流程 直观一点的代码表现是 模板字符串 转成一个js格式的tokens二维数组 然后根据数据对象去结合 最后 成为一个html字符串
在这里插入图片描述
其中 字符串转tokens 可能要将比较长的时间

然后的话 就还有一个循环遍历的概念
根据警号截取 然后 读取数组变量
从而在tokens中生成一个更深的token集合
在这里插入图片描述
所以 这就要强调 其实会用API 在编程界是没太多价值的 真正的价值体现在这种算法和概念的梳理性 考验一个程序员在代码编程中逻辑梳理和一个创造性

你要说 这个将语法转换成多层嵌套的语句难吗?其实不难
后续 大家跟着我手写 也很快就能把他写出来

也存在这种循环中写循环 多层嵌套
在这里插入图片描述

所以 说到底 我们要研究的无非是 如何将模板字符串变成 tokens 然后 如何将tokens再变回dom字符串

那代码的话 我们后面再写 我们先来看一下这个tokens
我们直接打开 mustache.js 看一下
在这里插入图片描述
它的源代码东西还是特别多的
我们找一个函数 叫 parseTemplate
在这里插入图片描述
这个函数 内容还是非常多的 所以比较长 代码大概在一百多行左右
在这里插入图片描述
他这里 返回的这个东西 其实就是 我们说的 tokens
那么 我们将这个代码改一下
我们将这里的

return nestTokens(squashTokens(tokens));

改成

let tokensMap = nestTokens(squashTokens(tokens));
console.log(tokensMap);
return tokensMap;

这里 我们其实就是用变量存起来 然后 用console.log 输出在控制台上 我们来观察一下它这个 tokens

然后 我们再写一个普通的 调用 mustache 中render渲染dom的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>

然后 我们运行代码
在这里插入图片描述
可以看到 这里的tokens 就也被输出出来了

那么 这就是一个数组形式

我们对着页面数据 看代码
在这里插入图片描述
首先 我们全部的内容 被分成了三个部分
其实怎么分完全是看 有多少的 花括号 或者特殊语句 那么 显然 我们这里只有一个循环 它就以这个循环作为分割了
然后 第一个和最后一个 肯定都是text 然后 内容就是格式字符串
然后中间 是一个 # 语法为 list循环 然后 就是我们说的 循环就继续嵌套 里面就是我们循环遍历的内容
我们循环里面这个嵌套 规则也是一样的 以花括号分开的
第一个和最后一个 text 字符串内容
然后 第二个是花括号内容 name 数据类型 去的字段是name

这个的话 大家也可以用更多不同的数据格式去了解这个东西的概念

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

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

相关文章

Ubuntu系统安装JDK教程

今天新买了一台阿里云服务器&#xff0c;因为centos 不提供了更新支持&#xff0c;所以Linux系统选择了Ubuntu 系统&#xff0c;今天就出一期 Ubuntu上安装的一系列教程&#xff0c;今天就先从JDK开始。 Ubuntu系统安装JDK教程 1、 jdk下载2、安装 lrzsz 命令 &#xff08;仅限…

FreeRTOS_系统内核控制函数

目录 1. 系统内核控制函数预览 2. 系统内核函数详解 2.1 函数 taskYIELD() 2.2 函数 taskENTER_CRITICAL() 2.3 函数 taskEXIT_CRITICAL() 2.4 函数 taskENTER_CRITICAL_FROM_ISR() 2.5 函数 taskEXIT_CRITICAL_FROM_ISR() 2.6 函数 taskDISABLE_INTERRUPTS() 2.7 函数…

1. 数字mic驱动分析

一般遇到的音频硬件都是这样的 由于项目不需要播放只需要录音&#xff0c;于是将模拟的mic换成了数字mic&#xff0c;直接通过i2s连接到soc 由于还要使用alsa架构进行录音&#xff0c;所以这里不能简单的写个代码读i2s数据&#xff0c;需要虚拟出一个codec 上面就是我们这次要分…

第九十六天学习记录:Linux基础:实用操作Ⅰ

注&#xff1a;第一张图与学习记录无关&#xff0c;是为了参与CSDN的AI绘图活动 CtrlC强制停止 1、Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键CtrlC中止 2、在命令输入错误时&#xff0c;也可以通过快捷键CtrlC快速退出当前输入 CtrlD…

projection介绍及EPSG:4326和EPSG:3857的投射转换

每个地图数据在Web端加载显示时&#xff0c;都需要设罝其投影坐标系。众所周知&#xff0c;地图是不规则的椭球体&#xff0c;如果我们将其展开到二维平面上&#xff0c;会发现地图与实际情况有出入。所以&#xff0c;人们提出 投影的方式来尽量减小失真的程度。 openlayers的…

技术驱动美丽:动态贴纸与美颜SDK的应用实践与创新

随着科技的迅速发展&#xff0c;智能手机的普及以及社交媒体的兴起&#xff0c;人们对于美颜和创意贴纸的需求日益增长。动态贴纸和美颜技术的应用已经成为当今互联网时代的一种趋势。本文将重点讨论动态贴纸与美颜SDK的应用实践与创新&#xff0c;探讨它们对美容美妆行业和社交…

运维必学 | 变量定义调用-从零开始学Windows批处理(Batch)编程系列教程

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1…

vue中如何封装一个基础组件---demo

在 Vue 中封装基础组件可以提高代码的可复用性和维护性&#xff0c;使开发过程更高效。下面是封装基础组件的一般步骤&#xff1a; 确定组件功能&#xff1a;首先确定要封装的基础组件的功能和用途。基础组件通常是具有单一功能的&#xff0c;可以在不同的项目中多次使用的组件…

【C++初阶】C++入门——缺省参数、函数重载

目录 一、缺省参数1.1 定义1.2 缺省参数分类1.3 缺省参数只能出现在函数声明中 二、函数重载2.1 定义2.2 构成重载的几种情况2.3 C支持函数重载的原理 一、缺省参数 1.1 定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实…

下一代Windows被披露,任何硬件都能运行

这么些年来&#xff0c;微软似乎一直没能打破 Windows 系统隔代香魔咒。 继 Win XP 惊艳世界后 Win Vista 表现平平&#xff0c;到 Win 7 引领一个时代&#xff1b; 接着 Win 8 含泪淹没在前代耀眼光环之下&#xff0c;直到 Win 10 再创辉煌成功走入家家户户。 而最新的 Win …

vue-antd-admin——关闭当前页面,跳转到指定页面——bus事件总线的用法

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff1a; 关闭当前页面&#xff0c;然后跳转到指定页面。 具体实现方法如下&#xff1a; 1.tabsView.vue文件中添加bus文件&#xff0c;并实现跨组件之间的监听 1.1 引入bus文件 import Bus from /utils/bus; bus文件内…

C#winform自定义圆角按钮控件

本篇介绍自定义圆角渐变按钮,实现过程,实现效果如下 创建winform项目,添加组件类控件 修改的名称为ButtonEx,并点击添加 修改cs中的代码 using System; using System.ComponentModel;using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;…

HKDF秘钥生成算法

HKDF叫HMAC-based KDF(key derivation function)&#xff0c;基于HMAC的密钥推导函数&#xff0c;所以我们先认识HMAC算法。 1. HMAC 基于一个共同密钥&#xff0c;在两个对端之间提供消息完整性确认的机制叫"message authentication codes(MAC)&#xff0c;消息认证码&…

【CSS】CSS使用变量与变量定义

如何定义可以在CSS中使用的变量 CSS变量&#xff08;也称为自定义属性&#xff09;的定义规则如下&#xff1a; 使用–作为前缀&#xff0c;后跟变量名。变量名可以由字母、数字、连字符和下划线组成&#xff0c;并且不能以连字符开头。变量名区分大小写。变量定义在选择器范…

数据中心可视化——智慧机房数字孪生,高效运维管理

IDC&#xff08;Internet Data Center&#xff09;数据中心可视化是指通过可视化的方式对数据中心的运行状态、资源使用情况、安全监控等进行展示和管理。可以帮助管理员更好地了解数据中心的运行情况和趋势&#xff0c;及时发现问题并采取措施&#xff0c;提高数据中心的运行效…

鼠标悬停,用气泡形式提示用户信息

需求 鼠标悬停,用气泡形式提示用户名字信息 效果图 分析 图中深浅两色的小方块是由v-if遍历二维数组得来的,所以这个需求本质上是原生html元素的出现与隐藏,重点在于知道显示或隐藏哪一个元素 代码 <!-- shelvesList就是后台给前端的,关于库位信息的二维数组 --> &l…

用RunnerGo平替JMeter?这个测试平台确实可以!

1、前言 目前在性能测试领域市场jmeter占有率非常高&#xff0c;主要原因是相对比其他性能测试工具使用更简单&#xff08;开源、易扩展&#xff09;&#xff0c;功能更强大&#xff08;满足多种协议的接口&#xff09;&#xff0c;但是随着研发协同的升级&#xff0c;平台化…

java版本企业电子招标采购系统源码+二次开+Spring Cloud + Spring Boot 发

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…

耳骨传导耳机哪个牌子好,几款实战性高的耳骨传导耳机分享

骨传导耳机是一种利用骨头直接传声的耳机&#xff0c;因为它不需要通过耳道来听音乐&#xff0c;所以能够更好地保护听力&#xff0c;也不会因为佩戴耳机而影响到我们正常的交流&#xff0c;可以说是一种比较健康的耳机。不过骨传导耳机的价格相对于普通蓝牙耳机来说还是要贵一…

二叉树题目:相同的树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;相同的树 出处&#xff1a;100. 相同的树 难度 3 级 题目描述 要求 给你两个二叉树的根结点 p \texttt{p} p …