从面试官的角度带你从源码分析关于vue(v2.7.10)的面试题

news2025/1/16 1:53:39

我们在面试的时候经常会被问到vue框架的原理类问题,我今天整理了一些常见问题和答案,希望有不正确之处还请指正。

1.new Vue时发生了什么

首先实例化一个对象,该对象执行init方法初始化生命周期等等,随后执行$mount方法开始生成vnode和dom。其中el会作为根dom,然后会根据render生成vnode。
在这里插入图片描述
执行init方法
在这里插入图片描述
开始挂载
在这里插入图片描述
判断有无render函数,没有则会生成
在这里插入图片描述

h函数就是$createElement,调用该方法生成vnode
在这里插入图片描述
总结:new Vue时会触发vue的_init方法去初始化数据,将el作为根dom,然后调用$mount方法去挂载组件,挂载的过程中会执行_render方法生成vnode。

2.双向数据绑定的原理

所谓的双向数据绑定就是当数据改变时视图也跟着变化,接下来我们看看关键代码。首先在get方法中会判断Dep.target是否存在,target是watcher实例,在视图中或者函数中获取该变量就会触发变量的get方法。然后该变量的dep实例就会放入当前的watcher(建立变量和watcher的联系)。
在这里插入图片描述
在这里插入图片描述
在set的时候,即数据发生修改的时候会执行当前变量的dep实例的notify方法,该方法会遍历执行当前观察的视图(所有的watcher)的update方法去异步更新视图。
在这里插入图片描述
在这里插入图片描述
总结:双向绑定的原理就是利用Object.defineProperty去设置变量的get和set方法,在该函数中会实例化dep数组。在获取数据的时候会触发变量的get方法去收集watcher,当变量发生改变时会触发变量的set方法去遍历dep数组,并执行watcher的update方法去刷新视图。

3.Computed 和 Watch 的区别

computed

首先在init过程中会执行initProxy,在渲染的时候获取getA会从vm实例中获取getA:
在这里插入图片描述

我们再来看看computed的实现过程:
在这里插入图片描述
我们进入watcher看看,其中getter函数就是我们定义的computed函数getA。
在这里插入图片描述
在执行渲染函数的时候触发我们开头设置的proxy
在这里插入图片描述
createComputedGetter函数在init过程中定义
在这里插入图片描述
执行watcher的evaluate方法,此时调用get方法,该方法就是getA函数。
在这里插入图片描述
此时会触发变量的get方法去收集当前的Dep.target(computed的watcher实例)。所以当变量发生变化时会执行watcher的update方法。
在这里插入图片描述

缓存

computed还有缓存功能,当依赖不发生变化时是不会重新执行的,看如下代码dirty为false不会重新执行computed函数而是直接返回值。
在这里插入图片描述

不支持异步

从上面的分析可知会执行computed函数然后通知变量收集依赖,如果是异步函数那么返回的就是一个Promise,此时变量无法收集依赖,所以不支持异步也很好解释。

watch

先看看实现过程,首先watch也会实例化一个watcher,handler就是watcher函数。
在这里插入图片描述

支持异步监听

之所以支持异步是因为是根据获取函数名去监听的,函数名是从变量中获取到的,不涉及到函数内部实现,所以函数内部是否异步并无关联。
在这里插入图片描述
通过执行watcher的get方法获取初始值
在这里插入图片描述
在这里插入图片描述

由于expOrFn是字符串,所以会执行parsePath函数,obj是vm对象,从vm对象中获取变量的。在获取对象的值时,变量会收集当前的watcher。

在这里插入图片描述
当变量改变时,会触发watcher的update方法,从而执行queneWatcher函数,异步执行flushSchedulerQueue方法
在这里插入图片描述
这里又会执行watcher的run方法
在这里插入图片描述

不支持缓存

通过get方法获取变量的最新值,通过判断当前值是否改变或者值是个对象,或者有deep属性从而记录oldValue。然后调用用户定义的watch函数并传入新值和旧值,在实现方法中并没有缓存这么一说,因为没有返回值。
在这里插入图片描述
总结:
相同点:

  1. 初始化过程都会生成watcher实例。
  2. 监听的过程都是触发变量的get方法收集watcher实例

不同点:

  1. computed会对结果缓存(是因为有返回值), watch没有缓存(是因为没有返回值)。
  2. computed不支持异步(因为要函数执行结果只能拿到promise,无法触发变量的get方法),watch支持异步(因为不依赖函数内部实现)

4. 说说once事件修饰符原理

带once和不带的区别是渲染的时候click函数不一样,带once的是~click还有arguments参数和$event事件。
在这里插入图片描述
我们来看看怎么处理~click的,在createElm的时候执行invokeCreateHooks:
在这里插入图片描述
cbs.create对象中包含了updateDOMListeners函数:
在这里插入图片描述
在这里插入图片描述
这里先执行normalizeEvent解析name,
在这里插入图片描述
执行createOnceHandler返回onceHandler函数,如果当前执行函数返回不是null则会移除该事件。
在这里插入图片描述
所以函数返回值为null时是不会移除监听事件的

在这里插入图片描述
总结
在render函数createEle的时候会通过addEventListener给当前dom添加事件,once就是通过判断返回值是否为null来决定是否移除监听事件

5.说说v-show的原理

v-show时vue的内部指令,会被解析为如下格式
在这里插入图片描述
createEle时调用如下函数
在这里插入图片描述

在这里插入图片描述
这里会执行updateDirectives函数的_update
在这里插入图片描述
这里执行了
在这里插入图片描述
在这里插入图片描述

在执行bind方法的时候会先获取当前的指令的value值,然后根据该值设置是否设置当前el的display是否为none。

在这里插入图片描述
总结
v-show只是在创建el的时候通过获取判断条件的值去设置当前dom的display属性,所以v-show不会影响到vnode的形成。

未完待续,持续更新。。。

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

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

相关文章

时间序列模型SCINet(代码解析)

前言 SCINet模型,精度仅次于NLinear的时间序列模型,在ETTh2数据集上单变量预测结果甚至比NLinear模型还要好。在这里还是建议大家去读一读论文,论文写的很规范,很值得学习,论文地址SCINet模型Github项目地址&#xff…

SpringBoot文件上传功能实现、异常处理

目录 一、文件上传 1、页面表单 2、文件上传代码 3、自动配置原理 二、异常处理 错误处理 1、默认规则 2、定制错误处理逻辑 3、异常处理自动配置原理 4、异常处理步骤流程 一、文件上传 1、页面表单 <form method"post" action"/upload" e…

详细实例说明+典型案例实现 对递归法进行全面分析 | C++

第二章 递归法 目录 ●第二章 递归法 ●前言 ●一、递归法是什么&#xff1f; 1.简要介绍 2.生活实例 ●二、递归法的典型案例——阶乘函数&斐波那契数列 1.阶乘函数 2.斐波那契数列 ●总结 前言 简单的来说&#xff0c;算法就是用计算机程序代码来实现数学…

static关键字的作用

目录 C语言中static关键字的作用 1.static关键字修饰局部变量 2.static关键字修饰全局变量 3.static关键字修饰函数 在C中static关键的作用 1.静态成员变量 2.静态成员函数 C语言中static关键字的作用 1.static关键字修饰局部变量 概念&#xff1a; static修饰局部变量就…

这才是2023年csdn最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

2. 认识O(logN)的排序

1. 递归 递归arr[L…R]范围上求最大值 流程分析如下: java代码: package paixu.class01;public class Code08_GetMax {public static void main(String[] args) {int[] arr {3,2,5,6,7,4};System.out.println(getMax(arr));}public static int getMax(int[] arr) {return p…

浅谈非类型模板参数、模板的特化

非类型模板参数 1.模板参数分类类型形参与非类型形参。 2.类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。类型参数也可以给缺省值 3.非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函…

FARO RevEng Software 22.3.9 Crack

FARO RevEng Software 22.3.9 用于反向工程的三维点云捕捉和网格生成 先进的 FARO RevEng 软件平台能为用户带来全面的数字设计体验。该反向工程软件有助于利用三维点云创建和编辑高质量的网格和 CAD 表面&#xff0c;以实现反向工程工作流程。然后&#xff0c;工业设计师可以利…

Zookeeper 集群安装

Zookeeper 集群 主机 IP SoftWare Port OS Myidnode1 192.168.230.128 apache-zookeeper-3.7.1 2181 Centos 7 1 node2 192.168.230.129 apache-zookeeper-3.7.1 2181 Centos 7 2 node3 192.168.230.130 apache-zookeeper-3.7.1 2181 Centos 7 31. 下载 Apache Downloads 下…

2022简单一年

牙齿软件决定开发的时间是2021年底&#xff0c; 老板说2022年任务是要开发牙齿咬合力的软件&#xff0c; 功能主要借鉴美国的一款软件,老板给了我一份软件的说明书&#xff0c; 包含了软件的所有功能。 看到软件第一感觉是&#xff0c; 做的确实是牛逼&#xff0c; 并且各…

【十 二】Netty 文件传输

概念介绍 文件是最常见的数据源之一&#xff0c;程序经常需要在文件中读取数据&#xff0c;也要将数据保存在文件中&#xff0c;进行持久化。 文件是计算机中一种基本的数据存储形式。即使计算机关机&#xff0c;文件的数据还是存在的&#xff0c;但是内存的数据就会丢失。 相…

联合证券|五定增项目同日被否 保荐机构该不该“背锅”?

一天之内5家上市公司定增一起被拒&#xff0c;这一音讯瞬间引发商场重视。 1月11日&#xff0c;浙江世宝、铭普光磁、胜华新材、日辰股份、振华科技等5家上市公司一起公告称&#xff0c;定增不被证监会受理&#xff0c;理由均是证监会以为请求资料不符合法定方式。 投行业界人…

18.Isaac教程--坐标系

坐标系 本节介绍相机、网格/矩阵/图像和机器人坐标系。 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录坐标系网格像素中心网格/矩阵/图像坐标系相机坐标系机器人坐标系网格像素中心 存储网格 GGG 上的值&#xff0c;使得网格单元将值…

Crack:CAD Exchanger GUI/CAD Exchanger Lab 不是SDK

CAD Exchanger GUI/CAD Exchanger Lab 用于查看、转换和分析 CAD、BIM 和 3D 数据 在 Windows、Mac 和 Linux 上加载和转换模型&#xff0c;而无需处理昂贵的 CAD 系统。 使用 CATIA、SOLIDWORKS、Creo、STEP、JT、IFC 和更多格式。 非常适合您的 3D 数据工作流程 连接不同的软…

多频电磁仪在2018年杭州电磁大会的报告(ICEEG)

本篇是对多频电磁方法,应用的解读。 本汇报讲述了EMI传感器的基本情况,以及用手持多频电磁仪进行实际探测应用的例子。 什么是电磁感应?用发射装置(TX)激发谐波,产生一次场(Primary field),地下导体目标会相应产生涡流电磁场,产生二次场,被接收装置(RX)探测到。 …

超参数、划分数据集、偏差与方差、正则化

目录1.超参数(hyperparameters)参数(Parameters)&#xff1a;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;...超参数&#xff1a;能够控制参数W,b的参数&#xff0c;是在开始学习之前设置的参数。比如&#xff1a;学习率、梯度下降循环的数量#iterations、隐…

力扣sql基础篇(七)

力扣sql基础篇(七) 1 统计各专业学生人数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 想要没有学生的部门也保存,就得以部门表作为主表 #字母表顺序就是升序 SELECT d.dept_name,IFNULL(s1.number,0) student_number FROM Department d LEFT …

2022. 12 青少年机器人技术等级考试理论综合试卷(二级)

2022.年12月青少年机器人技术等级考试理论综合试卷&#xff08;二级&#xff09; 一、 单选题(共 30 题&#xff0c; 共 60 分) 1.“机器人三原则” 是由谁提出的&#xff1f; &#xff08; &#xff09; A.美国人艾萨克 阿西莫夫 B.日本人森昌弘 C.美国人乔治 德沃尔 D.中国人…

谈谈 MongoDB 中连接池、索引、事务等问题

大家好&#xff0c;三分钟你将学会&#xff1a; MongoDB连接池的使用方式与常用参数查询五步走&#xff0c;能活九十九&#xff1f;MongoDB索引与MySQL索引有何异同&#xff1f;MongoDB事务与ACID什么是聚合框架&#xff1f;在最开始接触MongoDB的时候&#xff0c;是通过 Mong…

H3C V7MSR路由器定时限速的典型应用配置

某公司希望在上班时间对员工进行每IP限速&#xff0c;其他时间不限制。 1.主要配置如下&#xff1a; #创建关闭接口g0/1的限速功能 scheduler job close-car-g0/1 command 1 system-view command 2 interface g0/1 command 3 undo qos car inbound carl 1 #创建开启接口g0…