前端八股文(vue篇)

一.vue中的key的作用

key的作用主要是为了高效的更新虚拟dom。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换内部属性而不会触发过渡效果。

二.接口请求一般放在哪个生命周期?为什么要这样做?

接口请求可以放在钩子函数created,beforeMount,mounted中进行调用,因为在这三个钩子函数中,data已经创建,可以将服务器端返回的数据进行赋值。

但推荐在created钩子函数中调用异步请求,因为在created钩子函数中调用异步请求有以下几个优点

  • 能够更快获取到服务器端数据,减少页面loading时间
  • SSR不支持beforeMount,mounted钩子函数,所以放在created中有助于代码一致性
  • created是在模板渲染成html调用,即通常初始化某些元素属性值,然后再渲染成视图。如果在mounted钩子函数中请求数据可能导致页面闪屏问题

三.说一下vue中computed和methods的区别是什么?

首先从表现形式上面来看,computed和methods的区别大致有下面4点:

  1. 在使用时,computed可以当做属性使用,而methods则当做方法调用
  2. computed可以具有getter和setter,因此可以赋值,而methods不行。
  3. computed无法接收多个参数,而methods可以
  4. computed具有缓存,而methods没有

如果从底层来看的话,computed和methods在底层实现上面还有很大的区别。

vue对于methods的处理比较简单,只需要遍历methods配置中的每一个属性,将其对于的函数使用bind绑定当前组价实例后复制其引用到组件实例中即可

四.nextTick的作用是什么?他的实现原理是什么?

作用:vue更新DOM是异步更新的,数据变化,DOM的更新不会马上完成,nextTick的回调是在下次DOM更新循环结束之后执行的延迟回调。

实现原理:nextTick主要使用了宏任务和微任务。根据执行环境分别尝试采用

  • Promise :可以将函数延迟到当前函数调用栈最末端
  •  MutationObserver:是H5新增加的一个功能,其功能是监听dom节点的变动,在所有dom变动完成后,执行回调函数
  • setImmediate:用于中断长时间运行的操作,并在浏览器完成其他操作(如事件和显示更新)后立即运行回调函数
  • 如果以上都不行则采用setTimeout把函数延迟到DOM更新之后再使用,原因是宏任务消耗大于微任务,优先使用微任务,最后使用消耗最大的宏任务。

五.vue组件的data为什么必须是函数

组件中的data写成一个函数,数据以函数返回值形式定义。这样每复用一次组件,就会返回一份新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用一份data,就会造成一个变了会导致全变的结果

六.Proxy相比于defineProperty的优势在哪里?

Vue3.x改用了Proxy来替代Object.defineProperty

原因在于Object.defineProperty本身存在一些问题:

  • Object.defineProperty只能劫持对象属性的getter和setter方法。
  • Object.defineProperty不支持数组(可以监听数组,不过数组方法无法监听自己重写),更准确的说是不支持数组的各种API(所以Vue重写了数组方法)

而相比于Object.defineProperty,Proxy的优点在于:

  • Proxy是直接代理劫持整个对象
  • Proxy可以监听对象和数组的变化,并且有多达13种拦截方法。

七.说一下watch与computed的区别是什么?以及他们的使用场景分别是什么?

区别如下:

  •        都是观察数据变化的(相同点)
  • 计算属性将会混入到vue实例中,所以需要监听自定义变量;watch监听data,props里面数据的变化。
  • computed有缓存,它依赖的值发生了变化才会重新计算,watch没有;
  • watch支持异步,computed不支持;
  • watch是一对多;computed是多对一(监听属性依赖于其他元素)
  • watch监听函数接收两个参数,第一个是最新值,第二个是输入之前的值;
  • computed属性是函数时,都有get和set方法,默认走get方法,get方法必须有返回值。

watch的参数:

  • deep:深度监听
  • immediate:组件加载立即触发回调函数执行

computed的缓存原理:

computed本质是一个惰性的观察者,当计算数据存在于data或者是props里时挥别警告;


八.scoped是如何实现样式穿透

首先说一下什么场景下需要scoped样式穿透

在很多项目中,会出现这么一种情况,即:引用了第三方组件,需要在组件中局部修改第三方组件的样式,而又不想去除scoped属性造成的组件之间的样式污染。此时只能通过特殊的方式,穿透scoped。

有三种方式来实现样式穿透:

方法一:

使用::v-deep操作符(>>>的别名)

如果希望scoped样式中一个选择器能够作用更深,例如影响子组件,可以使用>>>操作符;

<style scoped>.a >>> .b { /* ... */ }</style>

上述代码将会编译成:

.a[data-v-f3f3eg9] .b { /* ... */ }

后面的类名没有data属性,所以能选到子组件里面的类名。

方法二:

定义一个含有scoped属性的style标签之外,在定义一个不含scoped属性的style标签,即在一个vue组件定义一个全局的style标签,一个含有作用域的style标签。

<style>/* global styles */</style><style scoped>/* local styles */</style>

此时,我们只需要将修改的第三方样式的css写到第一个style标签里面即可、

第三个方法:

上面的方法一需要单独书写一个不含有 scoped 属性的 style 标签,可能会造成全局样式的污染。

更推荐的方式是在组件的外层 DOM 上添加唯一的 class 来区分不同组件,在书写样式时就可以正常针对针对这部分 DOM 书写样式。


九.说一下vue模板编译的原理是什么?

简单说,Vue的编译过程就是将template转化为render函数的过程。会经历以下阶段:

  • 生成AST树
  • 优化
  • codegen

首先解析模板,生成AST语法树(一种用JavaScript对象的形式来描述整个模板)。

使用大量的正则表达式对模板进行解析,遇到标签,文本的时候都会执行对于的钩子进行相关处理。

Vue的数据是响应式的,但其实模板中并不是所有的数据都是响应式的。有些数据首次渲染后就不会再变化。那么优化过程就是深度遍历AST树,按照相关条件对树节点进行标记。这些被标记的节点(静态节点)我们就可以跳过对他们的对比,对运行时的模板起到很大的优化作用。

编译的最后一步是将优化后的AST树转换为可执行的代码。


十.Vue的数据为什么频繁变化但只会更新一次?

这是因为vue的Dom更新是一个异步操作,在数据更新后会首先被set钩子函数监听到,但是不会马上执行DOM更新,而是在下一轮循环中执行更新。

具体实现是vue中实现了一个queue队列用于存放本次事件循环中的所有watcher更新,并且同一个watcher的更新只会被推入队列一次,并在本轮事件循环的微任务执行结束后执行此更新,这就是DOM只会更新一次的原因。

这种在缓冲时去除重复数据对于避免不必要的计算和dom操作是非常重要的。然后,在下一个的事件循环“tick”中,vue刷新队列并执行实际工作。vue在内部对异步队列尝试使用原生Promise.then,MutationObserve和setImmediate,如果执行环境不支持,则会采用setTimeout(fn,0)代替

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

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

相关文章

详解数据科学自动化与机器学习自动化

过去十年里&#xff0c;人工智能&#xff08;AI&#xff09;构建自动化发展迅速并取得了多项成就。在关于AI未来的讨论中&#xff0c;您可能会经常听到人们交替使用数据科学自动化与机器学习自动化这两个术语。事实上&#xff0c;这些术语有着不同的定义&#xff1a;如今的自动…

【QT Visual Studio环境配置】error MSB8020: 无法找到 v141/v142 的生成工具(完整版)

首先要了解V**平台工具集根据你安装的Visual Studio版本不同而有所区别&#xff0c;知道这个就容易解决问题了&#xff0c;确定你安装的那个版本&#xff0c;需要使用哪个工具集。 v143–>VS2022v142–>VS2019v141–>VS2017v140–>VS2015v120–>VS2013 一、解决…

[kubernetes]基于版本v1.28.5+containerd + helm 搭建集群

0 环境准备 节点数量: 3 台虚拟机 centos7硬件配置: 2G或更多的RAM&#xff0c;2个CPU或更多的CPU&#xff0c;硬盘至少30G 以上网络要求: 多个节点之间网络互通&#xff0c;每个节点能访问外网 1 集群规划 k8s-node1&#xff1a;10.0.0.32k8s-node2&#xff1a;10.0.3.231k…

TypeScript 中的 interface 和 type 有什么区别?应该如何选择?

背景 TypeScript中的 interface 和 type 都是声明自定义类型的方式&#xff0c;但它们有一些区别&#xff0c;适用于不同的使用场景。 两者使用案例 interface interface 主要用于描述对象的形状或者类的结构&#xff0c;这是它最经常的应用场景。 interface使用示例&…

机器学习之线性回归(Linear Regression)附代码

概念 线性回归(Linear Regression)是机器学习中的一种基本的监督学习算法,用于建立输入变量(特征)与输出变量(目标)之间的线性关系。它假设输入变量与输出变量之间存在线性关系,并试图找到最佳拟合线来描述这种关系。 在简单线性回归中,只涉及两个变量:一个是自变量…

MySQL:通过官方mysql server,搭建绿色版mysql服务器(Windows)

1. 官网下载mysql server 下载mysql server的zip文件&#xff0c;地址&#xff1a; https://downloads.mysql.com/archives/community/ 解压后 2. 初始化数据库 运行cmd&#xff0c; 进入bin目录&#xff0c;运行 mysqld --initialize-insecureinitialize-insecure说明如…

python面向对象反射

就是通过字符串的形式操作对象相关属性 反射基本语法 from django.test import TestCase# Create your tests here. class Students:def __init__(self, name, gender):self.name nameself.gender genderdef play(self, game, novel):print(game, novel)s Students(lyz, …

Jenkins 插件下载速度慢安装失败?这篇文章可能解决你头等难题!

Jenkins部署完毕&#xff0c;如果不安装插件的话&#xff0c;那它就是一个光杆司令&#xff0c;啥事也做不了&#xff01; 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI/CD必要插件。 但是问题来了&#xff0c;jenkins下载插件速度非常慢&#xff0c…

Educational Codeforces Round 160 (Div. 2) A~E

A.Rating Increase&#xff08;思维&#xff09; 题意&#xff1a; 给出一个仅包含数字的字符串 s s s&#xff0c;要求将该字符串按以下要求分成左右两部分 a , b a,b a,b&#xff1a; 两个数字均不包含前导 0 0 0 两个数字均大于 0 0 0 b > a b > a b>a 如果…

算法基础之快速幂

快速幂 核心思想&#xff1a;logk的复杂度求出ak mod p 将k拆成若干个2的n之和 (二进制) #include<iostream>#include<algorithm>using namespace std;typedef long long LL;LL qmi(int a,int k,int p){LL res 1 % p;while(k) //k转为二进制 还有正数 就进行…

U-MixFormer:用于高效语义分割的类unet结构的混合注意力Transformer

论文&#xff1a; 代码&#xff1a;GitHub - RecklessRonan/MuSE 感觉这篇比较优雅无痛涨点欸.....最近要期末了没时间看文章和做实验了&#xff08;摊 摘要 语义分割在Transformer架构的适应下取得了显著的进步。与Transformer的进步并行的是基于CNN的U-Net在高质量医学影…

QT基础介绍

QT介绍 QT 是跨平台的c开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序&#xff0c;当然也可以开发不带界面的命令行&#xff08;command user interface&#xff0c;CUI&#xff09;程序。 Qt中文官网&…

互操作性(Interoperability)如何影响着机器学习的发展?

互操作性&#xff08;Interoperability&#xff09;&#xff0c;也称为互用性&#xff0c;即两个系统之间有效沟通的能力&#xff0c;是机器学习未来发展中的关键因素。对于银行业、医疗和其他生活服务行业&#xff0c;我们期望那些用于信息交换的平台可以在我们需要时无缝沟通…

揭开 Vue3 响应式系统的神秘面纱:多种监听状态变量变化的方法大揭秘

在 Vue 3 中&#xff0c;响应式系统是其核心特性之一。通过响应式系统&#xff0c;Vue 可以自动跟踪组件的状态变化&#xff0c;并根据变化更新视图。这使得开发者能够更加高效地开发复杂的用户界面&#xff0c;同时保持代码的可读性和可维护性。在本文中&#xff0c;我们将深入…

mt5和mt4交易软件有什么区别?

MetaTrader 4&#xff08;MT4&#xff09;和MetaTrader 5&#xff08;MT5&#xff09;是两种广泛使用的外汇和金融市场交易平台&#xff0c;由MetaQuotes公司开发。尽管它们都是外汇交易的常见选择&#xff0c;但在功能和特性上存在一些区别。以下是MT4和MT5之间的主要区别&…

python三大开发框架django、 flask 和 fastapi 对比

本文讲述了什么启发了 FastAPI 的诞生&#xff0c;它与其他替代框架的对比&#xff0c;以及从中汲取的经验。 如果不是基于前人的成果&#xff0c;FastAPI 将不会存在。在 FastAPI 之前&#xff0c;前人已经创建了许多工具 。 几年来&#xff0c;我一直在避免创建新框架。首先&…

12.21 知识总结(def之序列化常用字段、常用参数、soruce用法、定制返回字段等)

一、 序列化类常用字段 字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullBooleanField()CharFieldCharField(max_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrue)EmailFieldEmailField(max_lengthNone, min_lengthNone, allow_blankFals…

Educational Codeforces Round 160 (Rated for Div. 2) A~C

目录 A. Rating Increase 题目分析&#xff1a; B. Swap and Delete 题目分析: C. Game with Multiset 题目分析: A. Rating Increase 题目分析&#xff1a; 因为首部不为零&#xff0c;故我们从第二个字符开始遍历&#xff0c;如果遇到第一个不为‘0’的字符&#xff0…

C#文件操作(一)

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第20章《文件》 二、操作文件的相关类 在C#应用程序中Syste.IO名称空间包含用于在文件中读写数据的类。在此我列举一下File、Directory、Path、FileInfo、DirectoryInfo、FileSystemInfo、FileSystemWatcher。其中在Syste…

《Spring Cloud Gateway 技术要点》

中文文档&#xff1f; Spring Cloud Gateway 中文文档 他是如何工作的? 它是如何工作的 路由谓词 12种路由谓词 Route Predicate&#xff08;路由谓词&#xff09;工厂 常见问题 1、深入解析spring cloud gateway】09 巨坑&#xff01;GlobalFilter的执行顺序 2、Sprin…