前端面试题(Vue篇)

目录

1.v-if和v-show的区别

2.v-if和v-for同时使用有什么问题

3.v-for中key的作用

4.虚拟DOM原理

5.diff算法

6.Vue2和Vue3的区别

7.MVC和MVVM的区别

8.computed和watch的区别

9.生命周期(父子组件生命周期触发顺序)

10.组件之间的通信方式

11.响应式原理

12.双向绑定原理

13.两种路由模式的原理和区别

14.keep-alive的使用及原理

15.nextTick的实现

16.怎样实现路由懒加载

17.Vuex的使用

18.常用内置指令

19.data为什么是一个函数

20.样式穿透

21.对SPA的理解

22.拦截器的使用

23.插槽

24.Vue-Router传参Params和Query的区别

25.Pinia的使用


1.v-if和v-show的区别

v-if是完整的销毁和重新创建,v-show是动态地为元素添加“display:none”属性。如果频繁切换时用v-show,运行较少时用v-if。

Vue内置指令——v-show和v-if指令_非早起选手的博客-CSDN博客

2.v-if和v-for同时使用有什么问题

v-for比v-if优先级高,所以同时使用的话,每次v-for都会执行v-if,造成不必要的计算,影响性能,尤其是当需要渲染很小一部分的时候。

vue的注意规范之v-if 与 v-for 一起使用_vue v-if v-for-CSDN博客

Vue3的v-if 和v-for优先级详解 - 掘金 (juejin.cn)

3.v-for中key的作用

key是虚拟DOM中对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后进行新旧虚拟DOM的差异比较,比较规则如下:

  • 在旧虚拟DOM中找到了与新虚拟DOM相同的key,若虚拟DOM中内容没变,则直接使用之前的真实DOM。若虚拟DOM中内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM。
  • 在旧虚拟DOM中未找到与新虚拟DOM相同的key,则创建新的真实DOM,随后渲染到页面。

key属性的作用:

  • 提升v-for渲染的效率。
  • 提高渲染性能。
  • 避免数据混乱的情况出现 。

用index作为key可能引发的问题:

  • 若对数据进行逆序添加,逆序删除等破坏顺序的操作,会产生没有必要的真实DOM更新->页面效果没问题,但效率低。
  • 若结构中还包含输入类的DOM,会产生错误DOM更新->页面有问题,出现数据混乱。

关于Vue v-for中的:key作用-CSDN博客

4.虚拟DOM原理

原理:用JavaScript对象模拟真实DOM树,对真实树进行抽象。

  • diff算法:比较两棵虚拟DOM树的差异。
  • pach算法:将两个虚拟DOM对象的差异应用到真正的DOM树。

Vue3 源码解析(五):Patch 算法 - 掘金 (juejin.cn)

好处:

  • 具备跨平台的优势。由于虚拟DOM是以JS对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如浏览器、Weex、Node等。
  • 操作DOM慢,JS运行效率高。我们可以将DOM对比操作放在JS层,提高效率。运用patching算法来计算出真正需要更新的节点,最大限度地减少DOM操作,从而显著提高性能。虚拟DOM本质上就是在JS和DOM之间做了一个缓存。
  • 提升渲染性能。虚拟DOM的优势不在于单次的操作,而是在大量、频繁的数据更新下,能够对视图进行合理、高效的更新。

vue中的虚拟DOM原理_vue虚拟dom原理-CSDN博客

5.diff算法

特点:

  • 比较只会在同层级进行,不会跨层级比较。
  • 在diff比较的过程中,循环从两边向中间比较。

方式:递归+双指针

  • 判断是否是同一元素,不是同一元素,则直接替换。
  • 是同一个元素,则比对属性→比对儿子→双指针比较→对比查找进行复用。

步骤:

(1)patch函数中对新老节点进行比较,如果新节点不存在就销毁老节点,如果老节点不存在,直接创建新的节点。当两个节点是相同节点的时候,进入 patctVnode过程,比较两个节点的内部。

(2)patchVnode函数比较两个虚拟节点内部,如果两个虚拟节点完全相同,返回当前vnode的children不是textNode,再分成三种情况:

  • 有新children,没有旧children,创建新的。
  • 没有新children,有旧children,删除旧的。
  • 新children、旧children都有,执行`updateChildren`比较children的差异,这里就是diff算法的核心,当前vnode的children是textNode,直接更新text。

(3)updateChildren函数子节点进行比较。 

  • 第一步,头头比较。若相似,旧头新头指针后移(即 `oldStartIdx++` && `newStartIdx++`),真实dom不变,进入下一次循环;不相似,进入第二步。 
  • 第二步,尾尾比较。若相似,旧尾新尾指针前移(即 `oldEndIdx--` && `newEndIdx--`),真实dom不变,进入下一次循环;不相似,进入第三步。 
  • 第三步,头尾比较。若相似,旧头指针后移,新尾指针前移(即 `oldStartIdx++` && `newEndIdx--`),未确认dom序列中的头移到尾,进入下一次循环;不相似,进入第四步。 
  • 第四步,尾头比较。若相似,旧尾指针前移,新头指针后移(即 `oldEndIdx--` && `newStartIdx++`),未确认dom序列中的尾移到头,进入下一次循环;不相似,进入第五步。 
  • 第五步,若节点有key且在旧子节点数组中找到sameVnode(tag和key都一致),则将其dom移动到当前真实dom序列的头部,新头指针后移(即 `newStartIdx++`);否则,vnode对应的dom(`vnode[newStartIdx].elm`)插入当前真实dom序列的头部,新头指针后移(即 `newStartIdx++`)。 

【精选】vue中的diff算法_vue diff-CSDN博客

说说 vue2 和 vue3 核心diff算法 - 掘金 (juejin.cn)

6.Vue2和Vue3的区别

Vue3和Vue2的区别_前端_你吃香蕉吗?-华为云开发者联盟

7.MVC和MVVM的区别

mvc和mvvm之间有什么区别啊? - 知乎

8.computed和watch的区别

computed计算属性:

  • 要用的属性不存在,需要通过已有属性计算得来
  • 简化template里面{{ }}的计算和处理props/$emit的传值
  • 具有缓存性,页面重新渲染值不变化,计算属性会立即返回之前的计算结果,而不必再次执行函数
  • 不支持异步
  • 不能在data中定义

watch侦听属性:

  • 当被监视的属性变化时,回调函数自动调用,进行相关操作
  • 监听props,$emit或本组件的值执行异步操作
  • 无缓存性,页面重新渲染时值不变化也会执行
  • 支持异步
  • 监听数据必须是data中声明过或父组件传递过来的props中的数据,可以配合computed使用

watch跟computed的区别_computed与watch的区别-CSDN博客

9.生命周期(父子组件生命周期触发顺序)

Vue2:Vue的生命周期的详解_vue 生命周期-CSDN博客

Vue3:【vue3系列】vue3之生命周期(带图)_vue3生命周期图-CSDN博客

父子组件生命周期触发顺序:vue父子组件生命周期执行顺序_独钓渔的技术博客_51CTO博客 

10.组件之间的通信方式

vue中组件间通信的6种方式_vue组件通信_Jiang_JY的博客-CSDN博客

11.响应式原理

Vue2:浅谈Vue响应式原理_二九君的博客-CSDN博客

Vue3:【Vue3中的响应式原理】_vue3响应式原理_小田是个程序员的博客-CSDN博客

12.双向绑定原理

Vue2:vue双向绑定原理_vue双向绑定的原理_程序员~北北的博客-CSDN博客

Vue3:vue3双向绑定实现原理_vue3双向绑定原理_这是提莫大人的博客-CSDN博客

v-model原理:vue 中v-model原理及应用_向组件中绑定了v-mode,最终会被解析为下方的结构. 为el-checkbox增加了model属性-CSDN博客

13.两种路由模式的原理和区别

【精选】hash值和history值详解区别-CSDN博客

14.keep-alive的使用及原理

keep-alive是Vue.js的内置组件,它能够把不活动的组件的实例保存在内存中,而不是直接销毁。它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。它提供了exclude和include两个属性,允许组件有条件的缓存。

keep-alive的使用及详解-CSDN博客

15.nextTick的实现

概念:Vue中的nextTick主要用于处理数据动态变化后,DOM还未及时更新的问题。在修改数据之后立即使用这个方法就可以获取更新后的DOM。

原理:当数据发生变化,Vue将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后再统一进行更新。nextTick本质是利用JS的这些异步回调任务队列来实现Vue中的异步回调队列。

使用场景:在created生命周期执行DOM操作,在数据变化后需要进行基于DOM结构的操作。

【精选】简单易懂 关于nextTick()的理解-CSDN博客

16.怎样实现路由懒加载

路由懒加载:我们在路由中通常会定义很多不同的页面。如果不应用懒加载的话,很多页面都会打包到同一个js文件中,文件将会异常的大。进入首页时,需要加载的内容过多,时间过长,在浏览器中可能会出现短暂的空白页,从而降低用户体验,而运用路由懒加载是将各个模块分开打包,用户查看的时候再加载对应的模块,减少加载用时。

实现方式:

(1)Vue异步组件

(2)ES6的import()

(3)webpack的require.ensure()

vue 实现动态路由_白菜星的博客-CSDN博客

17.Vuex的使用

Vuex详解,一文彻底搞懂Vuex-CSDN博客

18.常用内置指令

Vue中的内置指令(汇总篇)_vue中什么是内置指令?有哪些?各有何作用?-CSDN博客

19.data为什么是一个函数

Vue中的组件是被复用的,如果Vue中的data是一个对象类型,对象类型的数据是按引用传值的,这就会导致所有组件的实例都共享同一份数据,这是不对的,我们要的是每个组件实例都是独立的。为了解决对象类型数据共享的问题,我们需要将data定义为一个函数,每个实例需要通过调用函数生成一个独立的数据对象。

vue核心面试题:组件中的data为什么是一个函数-CSDN博客

20.样式穿透

css样式穿透(深度选择器)-CSDN博客

21.对SPA的理解

浅谈前端SPA(单页面应用)-CSDN博客

面试官:说说你对SPA(单页应用)的理解?-CSDN博客

22.拦截器的使用

vue 拦截器使用_vue的拦截器-CSDN博客

23.插槽

插槽 Slots | Vue.js (vuejs.org)

24.Vue-Router传参Params和Query的区别

vue-router 传参:query传参、params传参_vue router query-CSDN博客

25.Pinia的使用

Pinia 入门 - 知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值