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

上文 探究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.hqwc.cn/news/7537.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础的git命令使用

Git区域概念 Git命令行操作 Git单人使用 注意项&#xff08;务必认真阅读&#xff09; Git Bash Here”终端 初始化仓库 提交工作区的内容到版本库 查看版本的记录 查看工作区的状态 版本回退 版本前进 Git远程仓库 克隆项目 推送到远程 拉取远程的更新 Git区域概…

mysql的集群和主从的区别

现在的项目使用mysql数据库&#xff0c;要自己设计数据存储架构。所以研究了一下mysql的集群(cluster)和主从&#xff08;master/slave&#xff09;这两个概念。两者非常容易混淆&#xff0c;所以需要分辨出这2者之间的区别。 一、Mysql cluster: share-nothing,分布式节点架构…

个性化邮件营销怎么做?试试这几种方法

电子邮件营销是最古老的数字营销形式之一&#xff0c;但也是最有效的营销策略之一。企业不仅可以通过电子邮件来推广产品或服务&#xff0c;也可以用来维护与潜在客户或已有顾客的关系&#xff0c;因此电子邮件营销被广泛应用于网络营销领域。在海量的邮件营销推广中&#xff0…

MySQL数据引擎、建库及账号管理

目录 一、引言 二、MySQL数据库引擎 1、InnoDB(MySQL默认引擎) 2、事务 ACID事务 四种隔离级别 何为脏读&#xff0c;幻读&#xff0c;不可重复读&#xff1f; 脏读 不可重复读 幻读 三、数据库授权 1、查看用户 2、创建用户、用户设置密码 3、设置用户授权 4、…

namecheap 域名服务器 设置为Cloudflare

Namecheap 设置 自定义 域名服务器 登录Namecheap 帐户。进入后&#xff0c;将鼠标悬停在页面右上角的“帐户”选项上&#xff0c;然后选择“域列表”或选择左侧边栏中的“域列表” 参考 如何在 Cloudflare 帐户中域设置 DNS 记录

leetcode 206.反转链表

⭐️ 往期相关文章 ✨链接&#xff1a;数据结构-手撕单链表代码详解。 ⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;反转链表 1️⃣ 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* }…

升级Win10后多了个恢复分区,有什么用

很多用户从Win7/Win8/Win8.1升级到Win10之后发现电脑硬盘上多出了一个“恢复分区”&#xff0c;64位系统下这个分区大小在450MB左右。那么为什么会多出这样一个分区&#xff0c;这个分区又是干什么的&#xff0c;能不能删除呢&#xff1f;下面以MBR硬盘情况为例来说明。 1.全盘…

前端Vue组件Mixin技术

前端vue组件开发的一大优势在于可以提高代码的复用性。极大的提升开发效率&#xff0c;通过Mixin技术&#xff0c;我们可以实现类似继承的效果&#xff0c;组件的复用性可以得到加强。 当我们开发前端项目时&#xff0c;可能会定义非常多的组件&#xff0c;这些组件中可能有部…

网络服务——DHCP服务

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。 个人主页&#xff1a;小李会科技的…

SpringBoot 项目模板:摆脱步步搭建

前言 在我的工作中&#xff0c;我从零开始搭建了不少软件项目&#xff0c;其中包含了基础代码框架和持续集成基础设施等&#xff0c;这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是&#xff0c;当项目运行了一段时间之后再来反观&#xff0c;我总会发现一些不足…

怎么解决找不到msvcp120.dll,msvcp120.dll一键修复方法

小伙伴们知道msvcp120.dll是什么文件吗?那么今天小编就来讲解电脑出现msvcp120.dll丢失的解决方法介绍&#xff0c;希望能够帮助到大家呢。 msvcp120.dll 是windows系统中必备的动态链接库文件。msvcp120.dll可以解决某些大型游戏、程序由于vs2010编译系统中缺失此dll的问题。…

Blazor前后端框架Known-V1.2.1

V1.2.1 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 概述 基于C#和Blazor实现的快速开发框架&#xff0c;前后端分离&#xff0c;开箱即用。跨平台&#xff0c;单页应用&#xff…