手撕Vue-界面驱动数据更新
经过上一篇文章,已经将数据驱动界面改变的过程实现了,本章节将实现界面驱动数据更新的过程。
界面驱动数据更新的过程,主要是通过 v-model 指令实现的, 只有 v-model 指令才能实现界面驱动数据更新的过程。
好了,那么说了是通过 v-model 那么直接处理下 CompilerUtil 中的 model 方法就好了。
只需要在 model 方法在加几行代码即可实现界面驱动数据更新的过程(双向绑定的功能)。
首先说一下思路,监听文本框的输入事件,当文本框的值发生改变时,通过事件对象 e 获取到文本框最新输入的值,将最新的值设置到模型当中这样是不是就可以了。
但是在设置到模型当中有一个注意点:
!> 在 model 方法中,在参数列表中将属性的名称以参数的形式已经传递过来了,但是这个属性的名称有可能是 name, 也有可能是 person.name, 也有可能是一个多级的,这个时候就需要一级一级取,取到最后一级,给最后一级设置值就可以了。
所以我这里就专门在编写一个方法用来设置值,叫做 setValue, 我将 vm, attr, 以及最新的值 value 也穿递过去,然后在 setValue 方法中,先将 attr 以 . 分割成数组,然后通过循环遍历数组,将 vm 的值一级一级取出来,直到取到最后一级,给最后一级设置值就可以了。
好了废话不多说,直接上代码, CompilerUtil 中 setValue:
setValue(vm, attr, newValue) {
attr.split('.').reduce((data, currentAttr, index, arr) => {
if (index === arr.length - 1) {
data[currentAttr] = newValue;
}
return data[currentAttr];
}, vm.$data)
},
然后在 model 方法中, 监听文本框的输入事件在调用 setValue 方法,将 vm, attr, 以及最新的值 value 也穿递过去,代码如下:
// 监听文本框的输入事件
node.addEventListener('input', (e) => {
let newValue = e.target.value;
this.setValue(vm, value, newValue);
});
打开浏览器,输入框输入内容,发现数据已经更新了(不录制 gif 了)好了,这样就实现了界面驱动数据更新的过程。
手撕Vue-界面驱动数据更新的更多相关文章
- 手撕公司SSO登陆原理
Single Sign-on SSO是老生常谈的话题了,但部分同学对SSO可能掌握的也是云里雾里,一知半解.本次手撕公司的SSO登陆原理,试图以一种简单,流畅的形式为你提供 有用的SSO登陆原理. 按 ...
- 手写 Vue 系列 之 Vue1.x
前言 前面我们用 12 篇文章详细讲解了 Vue2 的框架源码.接下来我们就开始手写 Vue 系列,写一个自己的 Vue 框架,用最简单的代码实现 Vue 的核心功能,进一步理解 Vue 核心原理. ...
- Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上
前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...
- 手撕RPC框架
手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...
- NN入门,手把手教你用Numpy手撕NN(一)
前言 这是一篇包含极少数学推导的NN入门文章 大概从今年4月份起就想着学一学NN,但是无奈平时时间不多,而且空闲时间都拿去做比赛或是看动漫去了,所以一拖再拖,直到这8月份才正式开始NN的学习. 这篇文 ...
- NN入门,手把手教你用Numpy手撕NN(2)
这是一篇包含较少数学推导的NN入门文章 上篇文章中简单介绍了如何手撕一个NN,但其中仍有可以改进的地方,将在这篇文章中进行完善. 误差反向传播 之前的NN计算梯度是利用数值微分法,虽容易实现,但是计算 ...
- NN入门,手把手教你用Numpy手撕NN(三)
NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...
- 手撕代码:统计1到n二进制数中1出现的总次数
题目描述: 互娱手撕代码题. 统计从1到n这n个数的二进制表示中1出现的次数. 思路分析: 思路一:直接的做法是从1遍历到n,对于每个数和1做与操作,之后,对于这个数不断做右移操作,不断和1做与操作, ...
- 手撕ES6--Promise
手撕ES6--Promise:https://www.jianshu.com/p/0925eae38d2c 手写一个Promise,附源码分析:https://blog.csdn.net/weixin ...
- 编译原理--05 用C++手撕PL/0
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...
随机推荐
- python3.8下安装robotframework历险记
首先非常感谢本文章博主,极大的给与我可以装好的信心(差点要重装python)https://blog.csdn.net/qq_21583077/article/details/107848409?sp ...
- 零基础如何自学C#?
前言 本文来源于知乎的一个提问,提问的是一个大一软件工程专业的学生,他想要自学C#但是不知道该怎么去学,这让他感到很迷茫,希望有人能给他一些建议和提供一些学习方向. 个人建议 确认目标:自学C#首先你 ...
- SQL Server 数据库字符串分割函数
SQL Server 数据库字符串分割函数,源代码如下: ALTER FUNCTION [dbo].[f_split] ( @SourceStr VARCHAR(MAX), -- 源字符串 @Spli ...
- python 将中文数字转换成阿拉伯数字
日常遇到的中文数字主要有两种情况: 1."二零零一"这种类型,只包含[0-9]对应的十个中文字,需要转换成数字:2001.这种情况的转换十分简单. 2. "三百二十一&q ...
- ASP.NET 6 使用工作单元操作 MongoDB
大家好,我是Edison. 最近工作中需要用到MongoDB的事务操作,因此参考了一些资料封装了一个小的组件,提供基础的CRUD Repository基类 和 UnitOfWork工作单元模式.今天, ...
- 【技术积累】Vue中的核心概念【四】
Vue的生命周期 Vue中的生命周期是指组件从创建到销毁的整个过程中,会触发一系列的钩子函数 Vue2中的生命周期 Vue2中的生命周期钩子函数是在组件的不同阶段执行的特定函数.这些钩子函数允许开发者 ...
- Unity UGUI的RawImage(原始图片)组件的介绍及使用
Unity UGUI的RawImage(原始图片)组件的介绍及使用 1. 什么是RawImage组件? RawImage是Unity UGUI中的一个组件,用于显示原始图片.与Image组件不同,Ra ...
- 使用netdata 监控Linux 主机
在linux主机上,直接使用下面的命令创建容器即可 docker run -d --name=netdata \ -p 19999:19999 \ -v netdataconfig:/etc/netd ...
- Django: request.query_params取值
取值 request.query_params.dict(),将querydict对象转换为字典 参考链接 https://www.jianshu.com/p/f2f73c426623 https:/ ...
- 让nodejs开启服务更简单--koa篇
在nodejs原始的http模块中,开启一个服务编码相对麻烦,需要对请求方式及上传的数据进行各种判断,而koa给我们提供了比较便捷的编码方式,同时它还有很多中间件可以直接拿来使用. 首先来看,如何 ...