Vue面试题合集(原理深入,持续更新)

news2024/11/15 23:46:26

2023Vue面试题剖析原理

  • 18.生命周期有哪些
  • 19.Vue中的diff算法原理
    • diff概念
    • diff比较流程
  • 20.Vue中key的作用和原理
    • key的概念
    • key的作用
  • 21.Vue.use作用和原理
    • use概念
    • 插件的功能
    • 实现原理
  • 22.Vue.extend方法的作用
    • Vue.extend概念
    • 原理分析
  • 23.Vue组件中data为什么必须是函数
  • 24.函数式组件的优势
  • 25.Vue中过滤器和使用场景
  • 26.v-once的使用场景
    • v-once概念
  • 27.Vue.mixin的使用场景和原理
    • Vue.mixin概念
    • 混入方式
    • minx合并策略
  • 28.Vue中slot如何实现及什么时候使用
    • 插槽概念
    • 什么时候使用
    • 插槽的分类和原理
  • 29.双向数据绑定的理解和原理
    • 双向数据绑定的概念
    • 表单元素中的v-model
    • 组件中的v-model
  • 30.Vue中.sync修饰符的作用


18.生命周期有哪些

19.Vue中的diff算法原理

diff概念

Vue基于虚拟DOM做更新。diff算法的核心是比较两个虚拟节点的差异。Vue的diff算法是平级比较的,不考虑跨级比较的情况。内部采用深度递归+双指针的方式进行比较。

diff比较流程

  1. 先比较是否是相同节点(key和tag)
  2. 相同节点比较属性,并复用老节点(将老的虚拟dom复用给新的虚拟节点dom)
  3. 比较儿子节点,考虑老节点和新节点儿子的情况
    • 老的没子节点,现在有子节点,直接插入新的子节点
    • 老的有子节点,新的没子节点,直接删除页面节点
    • 老的子节点是文本,新的子节点是文本,直接更新文本节点即可
    • 老的子节点是一个列表,新的子节点也是一个列表,更新子节点
  4. 优化比较:两个子节点为列表:头头、尾尾、头尾、尾头,而乱序时创建映射表去复用
  5. 比较查找进行复用

注:Vue3中采用最长递增子序列来实现diff优化

20.Vue中key的作用和原理

key的概念

  • key的特殊属性主要用在Vue虚拟DOM算法,在新旧节点对比时辨别VNodes。如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。
    • 例如:以下两个输入框,输入数据并切换时,数据仍保留,只是类型发生变化了,可加key破坏复用
<input type="text" v-if="!isPassword">
<input type="password" v-else>
  • 当Vue正在更新使用v-for渲染元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被该边,Vue将不会移动DOM元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

key的作用

  • Vue在patch的过程中,通过key可以判断两个虚拟节点是否是相同节点(可以复用老节点)
  • 无key会导致更新的时候出问题(逆序添加,逆序删除等破坏顺序操作)
  • 尽量不要采用索引作为key

21.Vue.use作用和原理

use概念

安装Vue.js插件时,如果插件是一个对象,必须提供install方法。如果插件是一个函数,它会被作为install方法。install方法调用时,会将Vue作为参数传入,这样插件中就不需要依赖Vue了。如:Vuex,Vue-Router

插件的功能

  • 添加全局指令、全局过滤器、全局组件
  • 通过全局混入来添加一些组件选项
  • 添加Vue实例方法,通过把他们添加到Vue.prototype上实现

实现原理

Vue.use = function(plugin:Function | Object){
    //插件缓存
    const installedPlugins = this._installedPlugins || (this._installedPlugins = [])
    if(installedPlugins.indexOf(plugin) > -1){
        //如果已经有插件,直接返回
        return this
    }

    //添加参数
    const args = toArray(arguments, 1) //除了第一项,其它的参数整合成数组
    args.unshift(this) //将Vue放入数组中
    if(typeof plugin.install === 'function'){
        //调用install方法
        plugin.install.apply(plugin, args)
    }else if(typeof plugin === 'function'){
        //直接调用方法
        plugin.apply(null, args)
    }
    installedPlugins.push(plugin) //缓存插件
    return this
}

22.Vue.extend方法的作用

Vue.extend概念

使用基础Vue构造器,创建一个“子类”。参数是一个包含组件选项的对象。 data选项是特例,需要注意在Vue.extend( )中它必须是函数。

var Profile = Vue.extend({
    template:"<p>{{firstName}}{{lastName}} aka {{alias}}</p>",
    data:function(){
        return {
            firstName:'water',
            lastName:'white',
            alias:'Hi'
        }
    }
})
//创建Profile实例,并挂载到一个元素上
new Profile().$mount("#mount-point")

new Vue().$mount()

原理分析

  • 所有的组件创建时都会调用Vue.extend方法进行创建
  • 有了此方法可以手动挂载组件去指定节点
  • 后端存储的字符串模板,可以通过Vue.extend方法将其、进行渲染,但是需要引入编译时

23.Vue组件中data为什么必须是函数

  • 根实例对象data可以是对象也可以是函数“单例”,不会产生数据污染情况
  • 组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染,所以要通过工厂函数返回全新的data作为组件and数据源

24.函数式组件的优势

  • 函数组件的特性:无状态、无生命周期、无this,但是性能高。正常组件是一个类继承了Vue,函数式组件就是普通的函数,没有new的过程。
  • 最终就是将返回的虚拟DOM变成真实DOM替换对应的组件
  • 函数式组件不会被记录在组件的父子关系中,在Vue3中因为所有的组件都不用new了,所以在性能上没有了优势

25.Vue中过滤器和使用场景

过滤器实质不改变原始数据,只是对数据进行加工处理后放回过滤的数据再进行调用处理,可理解诶为纯函数

{{message | filterA("arg1","arg2") | filterB("arg1", "arg2")}}
Vue.filter('filterA', function(value){
    //返回处理后的值
})
Vue.filter('filterB', function(value){
    //返回处理后的值
})

常见场景:单位转换、千分符、文本格式化、时间格式化操作。但可使用方法代替,因此Vue3中废弃

<p>{{format(number)}}</p>
const format = (n) =>{
    return parseFloat(n).toFixed(2)
}

26.v-once的使用场景

v-once概念

v-once是Vue中内置指令,只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。

可用在:单个元素、父节点、组件、列表

vue3.2之后,增加了v-memo指令,通过依赖列表的方式控制页面渲染,如果依赖的属性(valueA,valueB)没有改变,则默认渲染缓存的结果,类似于计算属性

<div>
    <div v-memo="[valueA,valueB]">
        <div class="box" v-for="item in arr" :key="item">{{item}}</div>
    </div>
</div>

27.Vue.mixin的使用场景和原理

Vue.mixin概念

mixin可以用来扩展组件,将公共逻辑进行抽离。在需要改逻辑时进行“混入”,采用策略模式针对不同的属性进行合并。如果混入的数据和本身组件中的数据冲突,会采用“就近原则”以组件的数据为准

mixin(换入对象)中有很多缺陷:“命名冲突问题”,“数据来源问题”,Vue3中采用组合式API提取公共逻辑非常方便(hook函数)。

混入方式

分为全局混入和局部混入。一般情况下全局混入用于编写插件(如:Vuex,Vue-Router),局部混入用于复用逻辑。

minx合并策略

核心:对象的合并处理

  • props、methods、inject、computed同名时会被替换(组件为主)
  • data会被合并(组件为主)
  • 生命周期和watch方法会被合并成队列
  • components、directives、filters会在原型链上叠加(子找到父的)

组件的扩展除了mixin外还有一个属性叫extends,但不常用

28.Vue中slot如何实现及什么时候使用

插槽概念

插槽设计来源于Web Components规范草案,利用slot进行占位,在使用组件时,组件标签内部内容会分发到对应的slot中

什么时候使用

通过插槽可以让用户更好的对组件进行扩展和定制化。可以通过具名插槽指定渲染的位置,常用的组件例如:弹框组件、布局组件、表格组件、树组件…

插槽的分类和原理

  • 默认插槽
  • 具名插槽
  • 作用域插槽

本质区别:普通插槽,渲染在父级;作用域插槽,渲染在组件内部

29.双向数据绑定的理解和原理

双向数据绑定的概念

Vue中双向数据绑定靠的是执行v-model,可以绑定一个动态值到视图上,同时修改视图能改变数据对应的值(能修改的视图就是表单组件)经常会听到一句话:v-model是value+input的语法糖

表单元素中的v-model

内部会根据标签的不同解析出不同的语法。并且有“额外”的处理逻辑

  • 例如:文本框会被解析为value+input事件
  • 例如:复选框会被解析为checked+change事件

组件中的v-model

组件上的v-model默认会利用名为value的prop和名为input的事件。对于组件而言v-model就是value+input的语法糖。可用于组件中数据的双向绑定。

如果组件中有多个数据想做双向数据绑定怎么办?很遗憾在Vue2中不支持使用多个v-model(可使用.sync语法),Vue3中可以通过以下方式进行绑定

<my v-model:a="a" v-model:b="b" v-model:c="c"></my>

30.Vue中.sync修饰符的作用

在有些情况下,需要对一个prop进行“双向绑定”,这时可以使用.sync来实现。v-model默认只能双向绑定一个属性,可用过.sync修饰符绑定多个属性。

<my :a.sync="a" :b.sync="b"></my>

Vue3中.sync语法已被移除

在这里插入图片描述

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

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

相关文章

SqlServer的基本使用

本文章主要是交给大家SqlServer的基本用法&#xff0c;因为SqlServer本身的运行机制问题&#xff0c;会让很多人觉得sql语句是不是写错了&#xff1f;这个代码有问题&#xff1f; 文章目录 选中数据库语法报错&#xff1f;执行部分代码存储过程、触发器只能创建一次sql书写建议…

如何在Linux c/c++ 进行多播(组播)编程

第一章: 前言 多播技术&#xff0c;也被称为“组播”&#xff0c;是一种网络通信机制&#xff0c;它允许一个节点&#xff08;发送者&#xff09;向一组特定的节点&#xff08;接收者&#xff09;发送信息。这种方式在网络编程中非常有用&#xff0c;因为它可以大大提高效率和…

Git、GitFlow协作 、Git commit规范、语义化版本

目录 一、概述 二、Git 2.1 安装与配置 2.2 基本指令操作 2.3 创建一个新的存储库 2.4 推送一个已有的文件夹 2.5 忽略临时文件 2.6 添加commit模板 2.7 冲突解决 二、GitFlow协作 三、Git Commit规范 四、语义化版本 为什么需要语义化版本号&#xff1f; 什么是…

线段树为什么可以开三倍空间

参考链接 四倍空间的原因如上图所示&#xff0c;但是实际操作时&#xff0c;我们可以直接开三倍空间也是可以的。 原因分析&#xff1a; 由于在分割区间时&#xff0c;我们计算mid使用下取整&#xff0c;所以左边区间大小大于等于右边区间大小&#xff0c;如果要实现上图中的树…

智能路由器开发之创建一个procd init脚本示例

智能路由器开发之创建一个procd init脚本示例 Procd init脚本默认提供了许多好用的功能&#xff0c;例如重启策略和能够从UCI系统中存储和读取配置。 设置 举个例子&#xff0c;假设我们想创建一个作为服务的Shell脚本&#xff0c;并且这个服务可以通过消息和超时时间进行配…

C语言---初识指针

1、指针是什么 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; ​ 1、指针是内存中一个最小单元的编号&#xff0c;也就是地址。 ​ 2、平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff…

Docker+Jenkins+Gitee自动化部署maven项目,加入Nexus镜像仓库(补充篇)

1.前言 Hello&#xff0c;各位小伙伴&#xff0c;大家好&#xff01;&#xff01;&#xff01; 在【DockerJenkinsGitee自动化部署maven项目】一文中&#xff0c;我们介绍了如何使用Jenkins来实现自动化部署maven项目&#xff0c;没读过的小伙伴可以去回顾一下&#xff0c;这…

【求 一个人去给多个人拜年 的最短路径】【枚举所有 拜访顺序】新年好

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

ChatGPT 70个插件小测全纪录

以下插件排序按照 ChatGPT all plugins 列表,评分基于国人使用场景。 1)Polarr:用于处理和编辑图片的工具 Polarr插件可以帮助用户进行各种图片编辑任务,包括调整亮度、对比度、饱和度,应用滤镜,裁剪图片,以及其他一些高级的图片处理功能。这个插件可以让ChatGPT更好地…

章节1:XXE漏洞-上

章节1&#xff1a;XXE漏洞-上 01 XML基础知识 XML eXtensible Markup Language 可扩展标记语言 XML用途 配置文件 交换数据 XML内容 XML格式要求 XML文档必须有根元素XML文档必须有关闭标签XML标签对大小写敏感XML元素必须被正确的嵌套XML属性必须加引号 XML格式校验 …

耗时 48小时整理了网络安全学习路线,非常详细!

前言 上次发的文章【都2023年了&#xff0c;还在问网络安全怎么入门】很多小伙伴在评论区回复不知道怎么学习&#xff0c;我也反思了一下&#xff0c;确实没写到学习方法和路线&#xff0c;所以这一期就出一一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话三连…

mvn 打包jar包。 Docker 部署 jar 包程序

默认你已经安装了jdk和maven 并且配置了环境变量. 这里贴出自己的环境配置(mac) # Maven3.6.3 export M2_HOME/Users/cc/maven3.6.3/apache-maven-3.6.3 export M2$M2_HOME/bin export PATH$M2:$PATH# java8 export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_36…

表白墙的实现【前后端交互】

目录 一、Servlet API 详解 1. HttpServletRequest 1.1 HttpServletRequest 方法 1.2 getParameter 2.HttpServletResponse 2.1 HttpServletResponse 方法 2.2 代码示例: 设置状态码 2.3 代码示例: 重定向 二、表白墙 1.准备工作 2.约定前后端交互接口 2.1 接口一…

项目引入Spring Security的参考步骤token

后端&#xff1a; 1、在数据库中创建t_user用户表&#xff0c;参照建表SQL。 2、pom文件中引入Spring Security依赖、JWT依赖&#xff08;复制粘贴即可&#xff09; <!--security--> <dependency> <groupId>org.springfr…

全志V3S嵌入式驱动开发(pwm驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 pwm驱动也是常见的一种驱动方式。常见的pwm&#xff0c;其实就是一组方波&#xff0c;方波中的高低电平之比称之为空占比。通过调节这个空占比&…

前端学习--ES6模块化与异步编程高级用法

一、ES6模块化 1.1 概念与规则 ES6 模块化规范是浏览器端与服务器端通用的模块化开发规范 ES6 模块化规范中定义&#xff1a; 每个 js 文件都是一个独立的模块导入其它模块成员使用 import 关键字向外共享模块成员使用 export 关键字 1.2 在node.js体验es6模块化 配置如下&…

【问题】常见问题解决方法

记录在项目运行中遇到的问题&#xff0c;和常用的软件安装包 文章目录 安装包下载第一章&#xff1a;运行C/C小白运行须知1.DevC运行&#xff08;最简单&#xff0c;推荐&#xff09;2.Visual Studio 运行3.VC运行 第二章&#xff1a;运行C#项目1.VS环境2.打开C#项目启动失败&a…

LiteDram仿真验证(二):仿真中,DDR3初始化问题

目录 前言一、讨论1、[init_done never goes to 1 in simulation #145](https://github.com/enjoy-digital/litedram/issues/145)2、[Add ECP5 support to standalone core generator #106](https://github.com/enjoy-digital/litedram/issues/106)3、[Help generating DDR3 Ve…

【unity插件】2d切割破坏插件-Smart Slicer 2D

文章目录 效果1.切割2.破坏3.创建源码使用1.导入插件2.摄像机3.新建地面4.新建切割刀5.新建切割食物6. 运行即可不同slicer Type的切割刀类型测试1.线性2.Complex3.点4.多边形5.explode6.创建效果 1.切割

华为OD机试之数列描述(Java源码)

数列描述 题目描述 有一个数列a[N] (N60)&#xff0c;从a[0]开始&#xff0c;每一项都是一个数字。数列中a[n1]都是a[n]的描述。其中a[0]1。规则如下&#xff1a; a[0]:1a[1]:11(含义&#xff1a;其前一项a[0]1是1个1&#xff0c;即“11”。表示a[0]从左到右&#xff0c;连续出…