手撕Vue-编译指令数据

news2025/7/14 11:21:39

经过上一篇的分析,完成了查找指令和模板的功能,接下来就是编译指令的数据了。

所以本章节主要处理的方法则是 buildElement 方法,我们先分析一下我们所拿到的数据在进行编码,这样会更加清晰一些。

我将 name, value 打印出来,分别对应的值是 name: v-model, value: name,在今后我们的命令中可不止只有 v-model,还有 v-text、v-html、v-on 等等,所以我们需要对这些指令进行分类,然后再进行编译。

所以我这里特意定义了一个工具类叫 CompilerUtil,用来处理指令的分类,代码如下:

let CompilerUtil = {
    /**
     * 处理 v-model 指令
     * @param node 当前元素
     * @param value 指令的值
     * @param vm Nue 的实例对象
     */
    model: function (node, value, vm) {
    },
    html: function (node, value, vm) {
    },
    text: function (node, value, vm) {
    }
}

然后我们在 buildElement 方法中调用这个方法,代码如下:

// 解构 name
let [, directive] = name.split('-');
// v-model -> [v, model]

// 2.根据指令名称, 调用不同的处理函数
CompilerUtil[directive](node, value, this.vm);

这样我们就可以根据指令的名称,调用不同的处理函数了。

接下来我们就来处理 v-model 指令,代码如下:

/**
 * 处理 model 指令
 * @param node 当前元素
 * @param value 指令的值
 * @param vm Nue 的实例对象
 */
model: function (node, value, vm) {
    node.value = vm.$data[value];
},

这样我们就可以将数据渲染到页面上了,打开浏览器,可以看到效果如下:

image-20231015171034901

v-model 指令已经可以正常使用了,但是还有问题,就是我们的数据结构目前是比较简单的,那么如果我们的数据是一个对象呢,例如:

image-20231015172334067

time: {
    h: 10,
    m: 10,
    s: 10
}

在用 input 绑定 v-model 进行渲染发现,只有第一个 input 能够正常渲染,其他的 input 都是 undefined,这是为什么呢?

<input type="text" v-model="time.h">
<input type="text" v-model="time.m">
<input type="text" v-model="time.s">

那么这里就要去看一下我们 model 方法的实现了,如果是 time.h,value 等于的值为 time.h, 然后我们在执行 vm.$data[value] 就变为了 vm.$data[time.h], 正常的获取这种数据结构的方式应该是先 vm.$data[time] 拿到 time 对象,然后再 time[h] 拿到 h 的值,所以我们需要对这种数据结构进行处理,为了已维护,我这里单独抽离了一个方法出来进行处理获取 value,方法名字叫做 getValue,代码如下:

getValue(vm, value) {
    // time.h --> [time, h]
    return value.split('.').reduce((data, currentKey) => {
        // 第一次执行: data=$data, currentKey=time
        // 第二次执行: data=time, currentKey=h
        return data[currentKey];
    }, vm.$data);
},

reduce 方法被用于迭代这个字符串数组。它接受一个回调函数,这个回调函数在每次迭代中被调用。在这个回调函数中,data 是上一次迭代的结果,而 currentKey 是当前迭代的数组元素(键路径中的一个部分)在每次迭代中,回调函数通过 data[currentKey] 的方式访问嵌套对象的属性,然后将这个属性的值作为下一次迭代的 data, 最终,reduce 方法将遍历整个键路径,直到达到最深层的属性,然后返回该属性的值。这样我们就可以正常的获取到数据了,最后在改造一下之前 model 方法获取值的地方,调用下刚刚编写的 getValue 方法即可:

model: function (node, value, vm) {
    node.value = this.getValue(vm, value);
},

再次打开浏览器,可以看到效果如下:

image-20231015172812038

这个搞定之后,我们紧接着把 v-html 和 v-text 也搞定,代码基本上都是一样的,只是渲染的方式不一样,代码如下:

/**
 * 处理 html 指令
 * @param node 当前元素
 * @param value 指令的值
 * @param vm Nue 的实例对象
 */
html: function (node, value, vm) {
    node.innerHTML = this.getValue(vm, value);
},
/**
 * 处理 text 指令
 * @param node 当前元素
 * @param value 指令的值
 * @param vm Nue 的实例对象
 */
text: function (node, value, vm) {
    node.innerText = this.getValue(vm, value);
}

编写测试代码:

image-20231015173151943

html: `<div>我是div</div>`,
text: `<div>我是div</div>`

编写HTML代码:

<div v-html="html">abc</div>
<div v-text="text">123</div>

打开浏览器,可以看到效果如下:

image-20231015173252270

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

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

相关文章

常规动态网页爬取

1.抓取动态网页“http://www.ptpress.com.cn”内容&#xff0c;将新书推荐中生活板块的书籍书名、价格和作者爬取并保存。 import requests import json import openpyxlurl https://www.ptpress.com.cn/recommendBook/getRecommendBookListForPortal?bookTagIdd5cbb56d-09ef…

Linux友人帐之Emacs文本编译器

一、概述 Emacs是一款功能强大、可定制、可扩展的文本编辑器&#xff0c;可以用于各种用途&#xff0c;如编程、文档处理和配置文件编辑。 安装 sudo yum install emacs 二、基础入门 2.1emacs基本文件操作 emacs -nw命令 emacs -nw命令是在终端中以无界面&#xff08;非图…

CANoe.Diva配置模板的使用

文章目录 前言一、CDD导入二、保存配置三、使用配置模板 前言 DiVa 是一种 CANoe 选项&#xff0c;用于对 ECU 中的诊断软件实施进行自动化测试。 可以通过CDD文件自动生成测试用例&#xff0c; CANoe 自动执行这些测试用例并生成结论性测试报告。 一、CDD导入 在新建Diva工程…

解决QT中文乱码

选中文本带有中文字符的文件&#xff0c;然后按如下点击 弹出对话框&#xff0c;选择当前操作系统的编码格式&#xff0c;选择Save with Encoding 中文字符前用u8进行标识

【知识】超详细! 论文相关知识科普大全

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] CSDN上粘贴有点问题&#xff0c;请前往原文查看&#xff0c;以便点击链接&#xff1a; 【知识】超详细! 论文相关知识科普大全 - 小锋学长生活大爆炸

C++数据结构X篇_16_二叉树的拷贝和释放(采用递归的方法)

在上篇的基础上&#xff0c;本篇介绍如何进行二叉树的拷贝和释放。从代码中可以看到采用递归方式进行的拷贝、释放操作&#xff0c;基本套路都是一样的。 文章目录 1. 二叉树的拷贝2. 二叉树的释放 1. 二叉树的拷贝 #include <iostream> using namespace std;//定义二叉…

美国经济危机历史与展望

目录 美国一战靠做两边的军火生意快速成长 门罗主义 咆哮的二十年 经济繁荣发展 经济大衰退前期 当时美国发生经济危机的时候&#xff0c;为什么很多乳制品加工商宁愿把牛奶导入河中&#xff0c;也不卖&#xff0c;为了保持商品的价值&#xff0c;为什么不能贱卖呢&#xf…

Linux性能优化--性能追踪2:延迟敏感的应用程序

11.0 概述 本章包含了一个例子&#xff1a;如何用Linux性能工具在延迟敏感的应用程序中寻找并修复性能问题。 阅读本章后&#xff0c;你将能够&#xff1a; 在延迟敏感的应用程序中用ltrace和oprofile弄清楚哪里产生了延迟。对“热点”函数的每个调用&#xff0c;用gdb生成栈…

spring java 动态获取consul K/V

spring java 动态获取consul K/V 1.springConsul配置kv路径 spring:cloud:consul:enabled: ${CONSUL_ENABLED:true}host: ${CONSUL_HOST:localhost}port: ${CONSUL_PORT:8500}config:prefix: ${CONSUL_CONFIG_PREFIX:config} #consul kv前缀fail-fast: ${CONFIG_FAIL_FAST:fa…

优秀案例 | 以虚拟人IP“科普熊猫”,为2023成都市全国科普日注入新活力

成都科普IP | 全国首个科普数字虚拟形象大使 虚拟人IP“科普熊猫” 2023成都市全国科普日启动仪式上&#xff0c;成都市科学技术协会现场发布了成都市科普熊猫数字虚拟形象大使——虚拟人“科科”。在2023成都世界科幻大会即将召开之际&#xff0c;结合了3D动作捕捉技术以及AR技…

【Java 进阶篇】JavaScript DOM Element 对象详解

JavaScript是一门广泛用于网页开发的脚本语言&#xff0c;而DOM&#xff08;文档对象模型&#xff09;是JavaScript在网页中操作HTML和XML文档的核心。DOM以树状结构表示文档&#xff0c;允许开发者以编程方式访问、操作和修改文档的内容和结构。在DOM中&#xff0c;Element对象…

MySQL查询优化看一篇就够了

关联查询优化 数据准备 #分类 CREATE TABLE IF NOT EXISTS type( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRIMARY KEY ( id ) );#图书 CREATE TABLE IF NOT EXISTS book(bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,cardINT(10…

从自动化到测开,测试人员逆袭之路从此起步

在当今竞争激烈的软件测试行业中&#xff0c;近期的招聘市场确实面临一些挑战。大量的求职者争相涌入岗位&#xff0c;许多热衷于功能测试的人士甚至难以找到理想的工作机会。更不幸的是&#xff0c;连自动化测试和性能测试这些专业领域也受到了测试开发人员的竞争压力。然而&a…

Springboot 启动报错@spring.active@解析错误

Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character that cannot start any token. (Do not use for indentation)in reader, line 10, column 13:active: spring.active^查看是否勾选

uni-app--》基于小程序开发的电商平台项目实战(六)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

Tang Capital宣布收购纳斯达克上市公司Rain Oncology100%股权

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;纳斯达克上市公司Rain Oncology(Rain)宣布近期已收到Tang Capital Partners旗下的子公司Concentra Biosciences以每股1.25美元的现金收购要约。 这家临床阶段微型市值癌症治疗药物开发商的股价在消…

【打印机故障】打印时一直显示任务“排队中”无法打印或取消

解决办法 一、关闭打印服务 如果打印任务无法取消或者删除&#xff0c;可以先暂停打印机的“服务&#xff0c;关闭”后台处理程序。具体方法如下&#xff1a; 1.在开始菜单搜索框中输入 services.msc或者中文输入“服务”&#xff0c;然后按下 enter 键。 2.从服务列表中选择打…

【Qt控件之QDialogButtonBox】概述及使用

概述 QDialogButtonBox类是一个小部件&#xff0c;它以适合当前小部件样式的布局呈现按钮。 对话框和消息框通常以符合该台界面指南的布局呈现按钮。不同的平台会有不同的对话框布局。QDialogButtonBox允许发人员向其添加按钮&#xff0c;并将自使用用户的桌面环境所适合的布局…

发现了一个牛逼的网站 可以免费使用chatGPT(看到最后)

最近,打工人们集体陷入了一场焦虑。“一觉醒来,我感觉自己快要失业了……”“身为文字工作者,我该如何自保饭碗?”“人工智能到底会不会完全取代人类的工作?” ChatGPT最近都听说了吧?据说,改论文、敲代码、写文案……只有你想不到的,没有人家办不成的! 它是什么? …

一篇文章带你搞定所有二叉树题型的递归思维(思路超详细)

文章目录 &#x1f380;前言&#xff1a;&#x1f3c5;先在开头总结一下&#xff0c;二叉树解题的思维模式分两类&#xff1a;&#x1f387;先解释一下“前序位置”&#xff0c;“后序位置”的意思&#x1f3e8;举一个简单的例子&#xff1a; &#x1fa80;下面通过两道例题&am…