vue2面试题:什么是双向数据绑定

vue2面试题:什么是双向数据绑定

  • 回答思路:1.什么是双向绑定-->2.双向数据绑定的原理-->3.如何实现双向数据绑定
    • 1.什么是双向绑定
    • 2.双向数据绑定的原理
    • 3.如何实现双向数据绑定
      • 来一个构造函数:执行初始化,对data执行响应化处理
      • 编译compile
      • 依赖收集

回答思路:1.什么是双向绑定–>2.双向数据绑定的原理–>3.如何实现双向数据绑定

1.什么是双向绑定

把Model绑定到View上为单向绑定,双向绑定就是在单向绑定的基础上,用户更新了view后model也会随之更新

2.双向数据绑定的原理

Dep:属性订阅器
Observer:监听器(对所有属性进行监听)
Compile:解析器(对每个节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数)
Watcher:观察者(负责建立Vue实例属性与视图之间的联系,在属性值发生变化时更新视图)

vue.js采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,在数据发生变动时发布消息给订阅者,触发相应的监听回调,分为一下几个步骤:
在这里插入图片描述
(1)对需要监听的数据对象进行递归遍历,包括子属性对象的属性,都加上setter、getter,改变其中值就会触发setter,Observer就能监听到了
(2)compile解析模板指令,将模板指令替换成数据,然后初始化渲染页面视图,绑定更新函数,添加订阅者,一旦有数据变化就通知watcher进行更新
(3)watcher是observer和compile的通信桥梁,主要作用:1.自身实例化时往Dep中添加订阅者2.自身必须要有一个update()函数3.等属性变动时Dep会调用dep.notify()通知watcher,watcher调用自身的update()方法进行更新,并触发compile绑定的回调函数

3.如何实现双向数据绑定

来一个构造函数:执行初始化,对data执行响应化处理

class Vue { constructor(options) { this.$options = options; this.$data = options.data; // 对data选项做响应式处理 observe(this.$data); // 代理data到 vm上 proxy(this); // 执行编译new Compile(options.el, this); } 
}

在observer中对data响应化的具体操作:

function observe(obj) { if (typeof obj !== "object" || obj == null) { return; } new Observer(obj); 
} class Observer { constructor(value) { this.value = value; this.walk(value); 
} 
walk(obj) { Object.keys(obj).forEach((key) => { defineReactive(obj, key, obj[key]); }); } 
}

编译compile

对每个元素节点的指令进行扫描和解析,根据指令替换数据,以及绑定相应的更新函数

class Compile { constructor(el, vm) { this.$vm = vm; this.$el = document.querySelector(el); //获取dom if (this.$el) { this.compile(this.$el); } } compile(el) { const childNodes = el.childNodes; Array.from(childNodes).forEach((node) => { // if (this.isElement(node)) { // console.log(" " + node.nodeName); 
} else if (this.isInterpolation(node)) { console.log(" " + node.textContent); // 判断是否为插值文本{{}} } if (node.childNodes && node.childNodes.length > 0) { //判断是否有子元素 this.compile(node); // 对子元素进行递归遍历} 
}); 
} 
isElement(node) { return node.nodeType == 1; 
} 
isInterpolation(node) { return node.nodeType == 3 && /\{\{(.*)\}\}/.test(node.textContent); } 
}

依赖收集

依赖收集,创建Dep实例

function defineReactive(obj, key, val) { this.observe(val); const dep = new Dep(); Object.defineProperty(obj, key, { get() { Dep.target && dep.addDep(Dep.target);// Dep.target 就是Watcher实例 return val; }, set(newVal) { if (newVal === val) return; dep.notify(); // 通知dep执行更新方法 }, 
}); 
}

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

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

相关文章

【江科大】STM32:定时器中断

文章目录 TIM(Timer)定时器根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型基本定时器通用定数器 高级定时器 时钟(时钟电路)的作用是什么:设置定时器触发中断普通方法:预分频器时序…

年末怒赚一笔,程序员快码住!趁热接单

元旦已过,龙年将至。 有钱没钱,回家过年。 话说回来,年关将至,农历的2023即将落下帷幕。天气渐寒,你的钱包是否也让你心生寒意?年初立下的赚钱flag是否优雅地实现了? 如果flag都倒了,你先别…

Nginx 基础使用

目录结构 进入Nginx的主目录我们可以看到这些文件夹 client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件 client_body_temp fastcgi_temp proxy_temp scg…

全文干货!信息化和数字化的本质区别是什么?

信息化和数字化都是行业的发展方向,但有一些区别。 简单来说就是,信息化侧重系统建设,用以管理生成的信息与数据,通常包括建立OA办公系统、业务系统、财务管理系统、客户关系管理系统和人力管理系统等。数字化侧重于将物理业务和…

用Axure RP 9制作弹出框

制作流程 1.准备文本框 下拉列表 按钮 动态面板 如图 2.先把下拉列表放好 再放动态面板覆盖 3.点动态面板 进入界面 如图 4.给按钮添加交互 3个按钮一样的 如图 5.提交按钮添加交互 如图

基于 LangChain 框架,向量数据库如何创建、读取、更新、删除(CRUD)

RAG是目前大语言模型从工具走向生产力实践的最热门的方式,它可以实现从海量的文本数据中检索相关的信息,并用于生成高质量的文本输出。 而聊到RAG,我们就很难避开使用RAG的基础设施-向量数据库 今天我将带领大家,以最为基础的CRU…

Linux配置yum源以及基本yum指令

文章目录 一、yum介绍二、什么是软件包三、配置yum源四、一键配置yum源【三步走】五、yum指令搜索软件安装软件卸载软件 六、其他yum指令更新内核更新软件更新指定软件显示所有可更新的软件清单卸载指定包并自动移除依赖包删除软件包,以及软件包数据和配置文件 一、…

Postman基本使用、测试环境(Environment)配置

文章目录 准备测试项目DemoController测试代码Interceptor模拟拦截配置 Postman模块简单介绍Postman通用环境配置新建环境(Environment)配置环境(Environment)设置域名变量引用域名变量查看请求结果打印 Postman脚本设置变量登录成功后设置全局Auth-Token脚本编写脚本查看conso…

大创项目推荐 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…

C语言第六弹---分支语句(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 分支语句 1、 逻辑操作符:&& , || , !4.1、 逻辑取反运算符 !4.2、 与运算符4.3、 或运算符4.4、 练习:闰…

【开源】基于JAVA的人事管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员功能模块2.2 普通员工功能模块2.3 答辩文案 三、系统展示四、核心代码4.1 查询职称4.2 新增留言回复4.3 工资申请4.4 工资审核4.5 员工请假 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的人…

golang 中使用 statik 将静态资源编译进二进制文件中

现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发…

推荐IDEA一个小插件,实用性很高!!

插件: Convert YAML and Properties File 由于每个人的开发习惯不同,在开发过程中会遇到各种小细节的问题。今天给大家介绍一个小插件,作用不大,细节很足。 就是properties类型文件和yml文件互相自由转换 解决:…

数据结构课程设计 仓储管理系统

仓储管理系统 【基本功能】 把货品信息表抽象成一个线性表,货品信息(包括ID、货品名、定价、数量等)作为线性表的一个元素,实现:按ID、货品名分别查找某货品信息(包括ID、货品名、定价、数量等&#xff0…

前台vue配置

前台 vue环境 1.傻瓜式安装node: 官网下载:https://nodejs.org/zh-cn/2.安装cnpm: >: npm install -g cnpm --registryhttps://registry.npm.taobao.org3.安装vue最新脚手架: >: cnpm install -g vue/cli注:如果2、3步报错,清除缓…

FastReport动态绑定数据源

先新建数据源 然后选择新建连接csv 选择好后,下一步完成,拖到自己想要的位置即可 程序里对应上相应的名称就行了 // 创建报表 Report report new Report(); report.Load(frxPath); DataTable dataTable1 new DataTable("MyDataTable");…

如何攻克钙钛矿太阳能电池电性能测试技术壁垒?

1 前言 “碳达峰、碳中和”背景下,发展新能源成为降低碳排放的第一驱动力。以太阳能为代表的清洁能源在市场上的占比大幅提升,与之对应的太阳能电池同样发展迅速。太阳能电池是一种吸收光能产生电能的半导体光电二极管,硅基电池作为第一代太…

beego API 自动化文档

API 全局设置 必须设置在 routers/router.go 中,文件的注释,最顶部: // APIVersion 1.0.0 // Title mobile API // Description mobile has every tool to get any job done, so codename for the new mobile APIs. // Contact astaxiegmai…

解决Windows下VSCode控制台乱码问题

我们在Windows使用VSCode编写C/C程序时,如果代码中的中文字符串使用的是UTF8编码,且代码内没有设置控制台的输出编码,或者编译时没有指定运行时编码(GCC可以在编译时使用-fexec-charsetGBK来指定运行时的字符串编码;cl…

本地读取Excel文件并进行数据压缩传递到服务器

在项目开发过程中,读取excel文件,可能存在几百或几百万条数据内容,那么对于大型文件来说,我们应该如何思考对于大型文件的读取操作以及性能的注意事项。 类库:Papa Parse - Powerful CSV Parser for JavaScript 第一步…