探究Vue源码:mustache模板引擎(10) 解决不能用连续点符号找到多层对象问题,为编译循环结构做铺垫

上文 探究Vue源码:mustache模板引擎(9) 将单层无喜欢结果tokens转为dom字符串 我们简单处理了 token转字符串的业务逻辑
但是 我们只处理了最贱的花括号
接下来 带着大家将井号的也处理一下
我们打开项目 将 www中的index.html代码改回之前的这样

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script src = "/xuni/bundle.js"></script><script>let templateStr = `<div>{{#students}}<ul><li>{{ item.name }}</li>{{#item.list}}<li>{{ . }}</li>{{/item.list}}</ul>{{/students}}</div>`;let data = {name: "小猫猫",age: 2,students: [{id: 0,name: "小明",list: ["篮球","唱","跳"]},{id: 1,name: "小红",list: ["电子游戏","计算机编程"]}]}GrManagData.render(templateStr,data);</script>
</body>
</html>

我们来处理一下这个循环嵌套的结构

然后 我们运行项目 会发现 到 井号位置就有问题了 它无法处理
在这里插入图片描述
这里 我们显然 用平行的结构是搞不定的 需要递归
首先 我们可以想一很简单的思路 不带井号 是调用renderTemplate
那么 我们带井号的 不就可以递归去调用这个 renderTemplate 吗?
是不是 思路非常简单

但在写递归之前 我们先要解决一个问题

例如 我们将 www 下的 index.html
改成这样

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script src = "/xuni/bundle.js"></script><script>let templateStr = `<div>我超喜欢我家的{{name}},我家{{name}}也超喜欢我,它今年{{a.b.c}}岁啦</div>`;let data = {name: "小猫猫",a: {b: {c: 2}}}GrManagData.render(templateStr,data);</script>
</body>
</html>

这样 我们在语句中 用了 data中的 a对象下的 b 对象下的c对象
然后我们运行项目
在这里插入图片描述
这里 直接成了undefined 因为 他无法识别 点这个语法 就是 你用对象名点字段名 我们写的这个
在这里插入图片描述
它没办法识别

其实 我们可以打印一下 看看这里 a.b.c 它生成的name是什么样的
在这里插入图片描述
我们这里 用console.log 看看里面到底是个什么
在这里插入图片描述

没错 这里 拿到的确实是 a.b.c
但你现在的语法相当于

data["a.b.c"]

这里 我们 js这个括号 只支持找直接下标 他是不认识我们这个点的语法的 他不会帮你往下找
所以 这里就有问题了
真的这个问题
我们在src下再创建一个 lookup.js
先放上这样一段代码

/*可以在data中,用连续点符号的形式找到对应键值
*/
export default function lookup(data,keyName) {}

先暴露一个函数出去
这个函数 需要两个参数 第一个是总的data 你要找 肯定要给总的数据嘛 对不对?
然后 第二参数 是字段名 例如 a.b.c
写完这个函数 就可以取到 对象中的对象中的对象了

我们将 lookup 内容改成这样

/*可以在data中,用连续点符号的形式找到对应键值
*/
export default function lookup(data,keyName) {//判断keyName字符串中是否有  .  符号if(keyName.indexOf(".") > 0) {//将keyName按点拆分成数组var names = keyName.split('.');//存一个 指向 data 的临时变量let temp = data;//循环遍历 用点拆分开的数组namesfor(let i = 0;i < names.length;i++) {//  一层一层寻找对应字段temp = temp[names[i]];}//将得到的结果返回return temp;}//没有  点符号 就直接将data中的keyName字段返回就ok了return data[keyName]
}

进来 我们先判断keyName 有没有点符号
如果有 走进来 我们利用字符串拆分的split将他拆开成数组
然后用一个零时变量将data存起来
然后我们循环我们用 点 符号拆开的这个数组 那么 内容自然是 [“a”,“b”,“c”]
那么 循环一次内容 就是 a b c
那么 第一次进来 temp 的值指向的是 data 第一个下标 是 a 就是找到 data下的a
第二次 temp 目前是data下的a 然后 第二个下标是 b 就是 在a下寻找b
第三次 就成立 b下寻找c
非常简单 最后处理好将temp返回回去

如果没有点符号 没有走进if 那就更简单 直接 找data下的keyName值

然后 我们将
src下的 renderTemplate.js 代码改一下

这里 我们引入并使用一下lookup
在这里插入图片描述
运行项目
在这里插入图片描述
可以看到 这些数据就读到啦
在这里插入图片描述

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

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

相关文章

通过PMP考试的伙伴看过来!免试多拿一个证书!

有PMP电子证书或纸质证书的伙伴可以免考申领国家CSPM二级证书&#xff01;&#xff08;项目管理专业人员评价国标证书&#xff09;&#xff01;免试&#xff0c;多拿一个证书&#xff0c;真香&#xff01; 本周已经开始提交新一批名单! 现在持有PMP证书可以免培训、免考试申报…

改进的麻雀算法优化最大相关峭度解卷积(SCSSA-MCKD),实现早期微弱故障诊断,MATLAB代码实现

01 引言 由于一些设备的早期故障产生的冲击十分微弱&#xff0c;易被系统噪声干扰&#xff0c;如何有效地对设备的原始故障信号进行降噪并增强信号中微弱冲击成分&#xff0c;是进行该类部件早期故障诊断的关键。 最大相关峭度解卷积&#xff08;MCKD&#xff09;通过解卷积运算…

【UE】VS无法调试,不能进入断点、未命中断点、断点不可用解决办法

问题&#xff1a;通过 附加进程的方式 调试DS&#xff0c;部分代码可以打断点&#xff0c;部分无法打断点 原因&#xff1a;XP限制一次加载的dll符号不能超过500个 解决&#xff1a; WinR 打开regedit在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manag…

【HTML】label 标签

在HTML中&#xff0c;<label> 标签用于为表单元素创建标签文本或标题。它可以与输入字段&#xff08;如文本框、单选按钮、复选框等&#xff09;和其他表单元素关联起来&#xff0c;以提高可用性和可访问性。 <label> 元素有两种常见的用法&#xff1a; 包裹方式…

【VUE 监听用户滑动】

监听滑动方法 一. touchstart、touchmove、touchend二.v-touch三. 自定义指令 一. touchstart、touchmove、touchend 在 Vue 中监听用户往哪个方向滑动可以通过添加事件监听器&#xff0c;然后在事件回调函数中判断滑动方向。常用的事件监听器有touchstart、touchmove、touche…

leetcode 399-除法求值

法一&#xff1a;并查集 分析示例1&#xff1a; a / b 2.0 a/ b 2.0 a/b2.0&#xff0c;说明 a 2 b a2b a2b&#xff0c; a a a和 b b b在同一个集合中 b / c 3.0 b/c3.0 b/c3.0&#xff0c;说明 b 3 c b3c b3c&#xff0c; b b b和 c c c在同一个集合中 求 a / c a/…

24届近5年重庆邮电大学自动化考研院校分析

今天给大家带来的是重庆邮电大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、重庆邮电大学 学校简介 重庆邮电大学简称"重邮"&#xff0c;坐落于直辖市-重庆市&#xff0c;入选国家"中西部高校基础能力建设工程”、国家“卓越工程师教育培养计划…

c51单片机16个按键密码锁源代码(富proteus电路图)

注意了&#xff1a;这个代码你是没法直接运行的&#xff0c;但是如果你看得懂&#xff0c;随便改一改不超过1分钟就可以用 #include "reg51.h" #include "myheader.h" void displayNumber(unsigned char num) {if(num1){P10XFF;P10P11P14P15P160;}else if…

PyCharm新手入门指南

安装好Pycharm后&#xff0c;就可以开始编写第一个函数&#xff1a;Hello World啦~我们就先来学习一些基本的操作&#xff0c;主要包含新建Python文件&#xff0c;运行代码&#xff0c;查看结果等等。 文章主要包含五个部分&#xff1a; 一、界面介绍 主要分为菜单栏、项目目录…

osi模型

OSI 模型&#xff08;Open Systems Interconnection model&#xff09;是一个用于计算机网络体系结构的参考模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在 1984 年制定&#xff0c;旨在定义不同层次上的通信协议&#xff0c;以促进不同厂商的设备在网络上进行…

JQuery——动画效果

jQuery 提供了多种动画效果&#xff0c;可以让你在网页中添加平滑的过渡和动态效果。以下是一些常见的 jQuery 动画效果及其用法&#xff1a; 1. 隐藏和显示&#xff1a; 通过调用 .hide() 和 .show() 方法可以实现元素的渐隐和渐现效果。 $(#myElement).hide(); // 隐藏元素…

开发工具Eclipse的使用之导入项目(import)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.导读 二.详细操作步骤 1.右击项…

吐血整理,Python接口自动化测试-接口关联依赖处理(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 场景说明 在面试…

cpolar的基础使用方法

如何使用cpolar内网穿透&#xff1f; 文章目录 如何使用cpolar内网穿透&#xff1f;前言1. 在群辉NAS系统下安装cpolar套件2. 管理隧道列表3. 创建固定数据隧道 前言 群晖作为大容量存储系统&#xff0c;既可以作为个人的私有存储设备&#xff0c;也可以放在小型企业中作为数据…

创建两个线程,其中一个线程读取文件中的数据,另外一个线程将读取到的内容打印到终端上,类似实现cat一个文件。 cat数据完毕后,要结束两个线程。

#include <stdio.h> #include <pthread.h>#define BUFFER_SIZE 99999 //足够大// 全局共享的数据缓冲区 char buffer[BUFFER_SIZE]; int buffer_length 0;// 锁和条件变量用于线程同步 pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond …

vue3 Hooks 封装loading使用

vue3 Hooks 封装loading使用 个人理解&#xff1a;Hooks 就是 钩子 的意思&#xff0c;在特定时机执行的函数 之前不理解Hooks和自定义封装的utils函数有什么区别&#xff0c;它们都是函数&#xff0c;逐步理解到utils函数没有vue里面的响应式api&#xff0c;而自定义Hooks可…

基于微信小程序的传染病酒店隔离平台设计与实现(Java+spring boot+MySQL+微信小程序)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的传染病酒店隔离平台设计与实现&#xff08;Javaspring bootMySQL微信小程序&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;…

回归决策树模拟sin函数

# -*-coding:utf-8-*- import numpy as np from sklearn import tree import matplotlib.pyplot as pltplt.switch_backend("TkAgg") # 创建了一个随机数生成器对象 rng rngnp.random.RandomState(1) print("rng",rng) #5*rng.rand(80,1)生成一个80行、1列…

Go语言删除文本文件中的指定行

GO语言删除文本文件中的指定行 1. 思路2. 处理文件3. 处理后的文本文件 1. 思路 假设现在有一个文本文件&#xff0c;我们需要删除文件中乱码的行。我们可以使用go的os库来处理文件&#xff0c;遍历整个文件然后将除过乱码的行写入一个新文件&#xff0c;以此来实现我们的需求…

clion run qt 问题汇总

一、Error copying file “D:/soft/QT/5.15.2/mingw81_64/bin/Qt5Cored.dll” to “D:/work/Ccode/qtproject/cmake-build-debug-qtmingw”.报错 查看路径下确实没有Qt5Cored.dll&#xff0c;只有Qt5Core.dll 注释掉cmakelist中的这三行 重新执行后成功 二、使用CLion编辑u…