vue源码2

        vue之mustache库的机理其实是将模板字符串转化为tokens 然后再将 tokens 转化为 dom字符串,如下图

 对于一般的将模板字符串转化为dom字符串,这样不能实现复杂的功能

let data = {name:'小王',age:18
}
let templateStr = `<h1>我叫{{name}},我今年{{age}}岁<h1>
`
templateStr = templateStr.trim()let htmlStr = templateStr.replace(/\{{(\w+)}}/g,function(match,$1,index){//第一个参数为他寻找的部分,第二个为捕获的东西,第三个所在的位置,第四个为该字符串return data[$1] })
console.log(htmlStr) //我叫小王,我今年18岁

 将模板字符串转化为tokens

前面已经知道了musache的工作原理为 将模板字符串转化为tokens,然后再将tokens转化为BOM字符串所以此小节的任务为:

class Scanner {constructor (templateStr ){//将模板字符串写到实例身上this.templateStr = templateStr//指针this.pos = 0//尾巴,刚开始为字符串本身this.tail = templateStr}//让指针跳过目标,进而扫描后面的内容scan(target){this.pos += target.lengththis.tail = this.templateStr.substring(this.pos)}//扫描字符串,直到扫描到目标,返回目标之前的字符串scanUtil(target) {let recordPosValue = this.pos//如果该字符串的地一个元素即该目标的索引不为0时,说明指针还需要往右走while(this.tail.indexOf(target)!=0&&this.pos<this.templateStr.length){this.pos++;//尾巴变为pos后面的部分this.tail = this.templateStr.substring(this.pos)}return this.templateStr.substring(recordPosValue,this.pos)}
}
export default function becomeEasyToken (templateStr){let token = []//实例化一个扫描器,针对模板字符串工作let scanner = new Scanner(templateStr)while(scanner.pos<templateStr.length){let word;word = scanner.scanUtil('{{');if(word !=''){token.push(["text",word])}scanner.scan('{{')word = scanner.scanUtil("}}")if(word !=''){if(word[0] == "#"){token.push(["#",word.substring(1)])}else if(word[0]=="/"){token.push(['/',word.substring(1)])}else{token.push(["name",word])}}scanner.scan("}}")}return token
}

以上代码没有处理 "#" 的循环功能 ,所以还必须添加一个函数,并对该返回值稍加修改

import foldToken  from "./foldToken";
export default function becomeEasyToken (templateStr){let token = []//实例化一个扫描器,针对模板字符串工作let scanner = new Scanner(templateStr)while(scanner.pos<templateStr.length){let word;word = scanner.scanUtil('{{');if(word !=''){token.push(["text",word])}scanner.scan('{{')word = scanner.scanUtil("}}")if(word !=''){if(word[0] == "#"){token.push(["#",word.substring(1)])}else if(word[0]=="/"){token.push(['/',word.substring(1)])}else{token.push(["name",word])}}scanner.scan("}}")}return foldToken(token)
}
export default function foldToken(tokens) {//结果数组let nestedTokens = []//栈结构,存放小tokenslet section = [];//与nestedTokens指向的是同一数组,该数组为一级数组let collentor = nestedTokensfor (const item of tokens) {switch (item[0]) {case "#"://进栈section.push(item)collentor.push(item)//创建新一级的数组collentor = item[2] = [] break;case "/"://出栈section.pop(item)//如果都出完了,则回到一级数组,还没出完则回到其上一级collentor =  section.length>0?section[section.length-1][2]:nestedTokensbreak;default://仅负责给各级数组添加 "text" 元素collentor.push(item)}}return nestedTokens;
}

效果展示:

 

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

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

相关文章

centos7 服务开机自启动 - systemctl -以禅道为例

在服务器上安装的各种中间件&#xff0c;一般都需要配置成开机自启动。但是有些中间件的安装过程中并没有提供相关配置开机自启动的说明文档。本文总结一下Centos7通过systemctl enble配置服务自启动的方法。一、Centos7通过systemctl enble配置服务自启动 在Centos7后&#x…

GraphSAGE

GraphSAGE 节点采样&#xff1a;聚合&#xff08;Aggregation&#xff09;&#xff1a;更新&#xff08;update&#xff09;&#xff1a;例子&#xff1a;总结&#xff1a; 啥是GraphSAGE呢&#xff1f; 是一种用于图嵌入的无监督学习方法。 通过采样和聚合邻居节点的信息来生成…

【一步一步了解Java系列】:Java中的方法对标C语言中的函数

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a;Gu Gu Study 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 _ 如果喜欢能否点个赞支持一下&#xff0c;谢谢…

Xfce4桌面背景和桌面图标消失问题解决@FreeBSD

问题&#xff1a;Xfce4桌面背景和桌面图标消失 以前碰到过好几次桌面背景和桌面图标消失&#xff0c;整个桌面除了上面一条和下面中间的工具条&#xff0c;其它地方全是黑色的问题&#xff0c;但是这次重启之后也没有修复&#xff0c;整个桌面乌黑一片&#xff0c;啥都没有&am…

认知V2X的技术列一个学习大纲

为了深入学习和理解V2X&#xff08;Vehicle to Everything&#xff09;技术&#xff0c;以下是一个学习大纲的概述&#xff0c;结合了参考文章中的相关数字和信息&#xff1a; 一、V2X技术基础 V2X概述 定义&#xff1a;V2X是车用无线通信技术&#xff0c;将车辆与一切事物相连…

WebService相关内容

WebService中的wsdl什么意思? WSDL(Web Services Description Language)Web服务描述语言及其功能、操作、参数和返回值的XML格式的语言。它在Java和其他编程语言中都可以使用,用于定义Web服务的接口以及如何与这些服务进行交互。 WSDL的作用 WSDL的主要作用是提供一种标准…

idea上传git命令

git init git remote add origin git add . git commit -m "标题" git push -u origin master

Qt 模型视图详细介绍

一.文件系统模型&#xff08;QFileSystemModel&#xff09; 1.定义 QFileSystemModel 是 Qt 框架中的一个类&#xff0c;它提供了一个用于管理文件系统结构的模型。它可以用于显示文件系统的目录结构&#xff0c;以及在视图中显示文件和文件夹的详细信息。 这个模型将文件系统…

15分钟Element-UI快速入门

Element-UI 是一个基于 Vue.js 2.0 的桌面端组件库&#xff0c;它提供了丰富的、可复用的组件&#xff0c;帮助开发者快速构建出美观且功能强大的网页应用。以下是一个 Element-UI 的快速入门指南&#xff1a; 1. 安装 Element-UI 首先&#xff0c;你需要在你的 Vue.js 项目中…

各种测试方法,黑盒测试、白盒测试,静态测试,动态测试

1.测试方法 软件测试方法的分类有很多种&#xff0c;以测试过程中程序执行状态为依据可分为静态测试 (Static Testing,ST) 和动态测试 (Dynamic Testing,DT); 以具体实现算法细节和系统内部结构的相 关情况为根据可分黑盒测试、白盒测试和灰盒测试3类&#xff1b;从程序执行的方…

Python编程之调试魔法与列表逆转之谜

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、调试魔法&#xff1a;揭开Python编程的神秘面纱 代码调试实例 二、列表逆转之谜&#…

实验一:通过路由器实现内外网互联

通过路由器实现内外网互联 一、实验拓扑 相关配置详见下图&#xff0c;内网区域为AR2以内设备&#xff0c;外网区域以AR1和PC1代替进行实验测试。 二、实验要求 通过路由器实现内外网互联&#xff1a; 1.各内网PC可自动获取ip地址&#xff1b; 2.各内网PC可ping通外网PC&…

SCSS 基本使用详解

一、引言 SCSS 是 Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;的其中一种语法&#xff0c;是一种预处理器脚本语言&#xff0c;能够扩展 CSS 的功能&#xff0c;使其更加强大和高效。SCSS 保留了 CSS 的原有语法&#xff0c;同时增加了变量、嵌套规则、混…

蓝海卓越计费管理系统 agent_setstate.php SQL注入漏洞复现

0x01 产品简介 蓝海卓越计费管理系统是一套以实现网络运营为基础,增强全局安全为中心,提高管理效率为目的的网络安全运营管理系统,提供“高安全、可运营、易管理”的运营管理体验,基于标准的RADIUS协议开发,它不仅支持PPPOE和WEB认证计费,还支持802.1X接入控制技术,与其…

WordPress外贸网站建设的成功要素与技术点

WordPress作为一款强大的建站平台&#xff0c;为外贸企业提供了丰富的功能和灵活的定制选项。在这篇文章中&#xff0c;我们将揭示一些成功建站的秘笈&#xff0c;涵盖了WordPress外贸网站建设中的关键要素和技术点&#xff0c;帮助您打造一个引领行业的成功网站。 1. 选择合适…

【java深入学习第3章】利用 Spring Boot 和 Screw 快速生成数据库设计文档

免费多模型AI网站,支持豆包、GPT-4o、谷歌Gemini等AI模型&#xff0c;无限制使用&#xff0c;快去白嫖&#x1f449;海鲸AI&#x1f525;&#x1f525;&#x1f525; 在开发过程中&#xff0c;数据库设计文档是非常重要的&#xff0c;它可以帮助开发者理解数据库结构&#xff0…

Kubernetes部署dashboard

Kubernetes部署dashboard Kubernetes集群安装 鲲鹏arm64架构下安装KubeSphere linux安装部署k8s(kubernetes)和解决遇到的坑 dashboard部署 $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashbo…

STM32学习和实践笔记(30):窗口看门狗(WWDG)实验

1.WWDG介绍 1.1 WWDG简介 上一章我们已经介绍了IWDG&#xff0c;知道它的工作原理就是一个12位递减计数器不断递减计数&#xff0c;当减到0之前还未进行喂狗的话&#xff0c;产生一个MCU复位。 窗口看门狗WWDG其实和独立看门狗类似&#xff0c;它是一个7位递减计数器不断的往…

Vue3在Element UI 表格中自定义时间格式化显示

Vue3在Element UI 表格中自定义时间格式化显示 一、前言1、准备工作2、实现步骤1. 引入 Element UI 组件2. 自定义时间格式化函数3. 格式化日期逻辑 3、完整示例4、结论 一、前言 在开发 Web 应用程序时&#xff0c;常常需要在表格中展示时间数据。Element UI 是一个流行的 Vu…

【Python】 如何在Python中创建GUID UUID

基本原理 GUID&#xff08;全局唯一标识符&#xff09;和UUID&#xff08;通用唯一标识符&#xff09;都是用来在分布式系统中唯一标识信息的。在Python中&#xff0c;我们可以使用内置的uuid模块来生成这些唯一标识符。 UUID有几种不同的版本&#xff0c;每种版本都有其特定…