Vue连环追问篇

100 阅读2分钟

Vue高频面试题分析

v-showv-if的区别

  • v-show是通过控制display: hidden来控制显示和隐藏
  • v-if是通过组件的创建和销毁实现显示和隐藏

为何需要在v-for中用key

  • 讲讲diff算法概述

  • 必须使用key,且不能是indexrandom,判断是否为sameNode

  • 目的:减少渲染次数、提升渲染性能

描述Vue组件生命周期

结合官网这张图理解。

vue3

Vue组件如何通讯

  • 父子组件通过propsemits
  • 也可以自定义事件$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>

vuexactionmutation有何区别

  • 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

Vue常见性能优化

  • 合理使用v-showv-if
  • v-forkey的值、避免和v-if同时使用
  • 自定义事件、dom事件及时在用后销毁
  • 合理使用异步组件
  • 合理使用keep-alive
  • 使用SSR
  • webpack相关
  • 前端通用性能优化