Vue高频面试题分析
v-show
和v-if
的区别
v-show
是通过控制display: hidden
来控制显示和隐藏v-if
是通过组件的创建和销毁实现显示和隐藏
为何需要在v-for
中用key
-
讲讲
diff
算法概述 -
必须使用
key
,且不能是index
和random
,判断是否为sameNode
-
目的:减少渲染次数、提升渲染性能
描述Vue
组件生命周期
结合官网这张图理解。
Vue
组件如何通讯
- 父子组件通过
props
和emits
- 也可以自定义事件
$on
,$off
- vuex
描述组件渲染和更新的过程
详细可以看看渲染-原理篇
- 能够描述完整流程图
- 根据流程图描述初次渲染->更新
双向数据绑定v-model
的实现原理
-
描述场景(inout输入框)
-
v-bind
绑定value -
v-on
绑定input框的input
事件 -
通过触发
input
事件将e.target.value
赋值给绑定值
对MVVM
模型的理解
computed
有何特点
- 有缓存,data不变不会重新计算
- 有响应式,提高性能
Vue2
为何组件data
是一个函数
- 具体可以讲讲编译的原理
- 组件渲染完后是一个一个的class,如果用函数包裹,数据就全局共享了
请求应该放在哪个生命周期
mounted
、vue3组合式api中是onMounted
如何将组件所有props
传递给子组件
$attr
多个组件有相同逻辑,如何抽离
- vue2中有
mixin
(容易造成变量覆盖,变量来源不易追溯) - vue3中使用
hooks
何时适合使用异步组件
defineAsyncComponent
- 加载大组件或者路由懒加载时
何时使用keep-alive
- 缓存组件,不需要重复渲染
- 比如多个静态tab页的切换,可以进行性能优化
在beforeDestory
中可以做什么
- 解绑自定义
$on
、$off
- 清除定时器
- 解绑自定义
dom
事件
什么是作用域插槽
子组件通过slot
传值给父组件
<script setup>
import { ref } from 'vue'
const name = ref('airhua')
</script>
<template>
<div>
<h1>作用域插槽</h1>
<slot :item="name"></slot>
</div>
</template>
父组件接收后只能在slot
作用域内使用
<Scope>
<template #default="slotProps">
<p>内容{{ slotProps.item }}</p>
</template>
</Scope>
vuex
中action
和mutation
有何区别
- action中处理异步,mutation不可以
- mutation做原子操作
- action可以整合多个mutation
用vnode
描述一个dom
结构
dom
结构
<div class="app">
<p style="color: red">test</p>
<span>111</span>
</div>
vnode
结构
const data = {
tag: 'div',
props: {
className: 'app',
},
children: [
{
tag: p,
props: {
style: 'color: red',
},
children: 'test',
},
{
tag: span,
children: '111',
},
],
}
Vue
实现响应式的原理
具体看响应式-原理篇
vue2
实现方式及其弊端vue3
改用Proxy
但是不能被ployfill
简述diff
算法过程
具体看diff算法-原理篇
patch
函数来更新新的vnode
sameVnode
判断同层级节点是否为相同- 不同需要重建,相同则
patchVnode
判断节点文本和children
是否需要更新 - 当新旧节点都含有
children
节点则需要走到下一层级进行updateChildren
- 寻找
children
是否有相同的,具体方式看源码,无相同节点直接添加,有相同节点又回到patchVnode
Vue
为何是异步渲染,$nextTick
- 因为需要异步渲染,将data修改做整合在一起修改,从而提升效率
- 比如如果需要在
data
修改完后拿到最新的渲染dom
,可以使用nextTick