2024年前端面试题Vue篇

本文探讨了Vue2与Vue3之间的区别,包括响应式系统升级、diff算法优化、打包体积减小、新API如ref和reactive,以及组件管理和生命周期管理工具如pinia、nextTick、异步组件和keep-alive的使用。
摘要由CSDN通过智能技术生成

2024年前端面试题Vue篇

希望我的解释和答案能起到辅助理解作用

vue2和vue3的区别

  1. 写法
  2. 响应式
    • vue2的响应式基于object.defineProperty,而vue3则基于proxy对象 ,相比于vue2,vue3的更有优势,有更好的性能,同时还集成了ts,提供了ref,reactive这种响应式api
  3. diff算法
    • vue2的diff算法基于虚拟dom采用双指针的算法以及同级比较,vue3基于proxy和pach flag,引用pach flag判断更新节点,采用proxy跟踪节点变化,提高diff算法的效率
  4. 打包体积
    • vue2的打包体积通常比较大,因为它有很多内置功能和组件,vue3则采用了tree-shaking,有更好的组件化支持,更好的模版编译来优化打包体积,使打包体积更小

ref、torefs、toref

  1. 作用:将变量声明或者转变成响应式
  2. 原理:基于proxy和reflect API实现的,使用proxy在对象属性上设置拦截器,实现对属性的访问以及修改的监听和拦截

reactive

  1. 作用:将一个普通的js对象转换成响应式数据对象
  2. 原理:基于proxy和reflect API实现的,使用proxy在对象属性上设置拦截器,实现对属性的访问以及修改的监听和拦截

wacth和computed

  1. wacth是一个监听器,用来监视一个属性的变化,每次变化的时候执行一个回调函数,有deep属性来决定是否开启深度监听,immediate来决定是否立即执行
  2. computed是一个计算属性,适用于那些需要计算值,并且储存值的场景,比如商品计算总价

effect

也是一个响应式api,用于追踪响应式依赖项

用法:

import { reactive, effect } from 'vue';

const state = reactive({
  count: 0,
});

// 创建一个 effect 函数
const countEffect = effect(() => {
  console.log(`Count is: ${state.count}`);
});

// 修改状态
state.count++; // 触发 countEffect 函数重新执行
// 输出:Count is: 1

nextTick

  1. 作用:确保在下一次dom更新周期之前,所有的数据都更新完成
  2. 原理:基于event loop机制。当执行nexttick函数的时候,vue.js会将回调函数加入到一个队列中,并使用promise在下一次event loop来执行该函数
  3. 理解:就是在数据发生变化的时候,vue不会立刻去更新dom,而是把这些要修改的数据放在一个异步队列里,一直修改一直进行异步操作,所以我们直接去拿值拿的不是最新的值,所以这里我们可以使用NextTick,它有一个更新机制,可以让我们更快的读取最新的dom结构

异步组件

1.使用defineAsynccomponents函数:

import { defineAsyncComponent } from 'vue'

const AsyncComponent = defineAsyncComponent(() =>
  import('./AsyncComponent.vue')
)

export default {
  components: {
    AsyncComponent
  }
}

2.使用组件:

<template>
  <div>
    <Suspense>
      <template #default>
        <AsyncComponent />
      </template>
      <template #fallback>
        <div>Loading...</div>
      </template>
    </Suspense>
  </div>
</template>

<script>
import { defineAsyncComponent } from 'vue'

const AsyncComponent = defineAsyncComponent(() =>
  import('./AsyncComponent.vue')
)

export default {
  components: {
    AsyncComponent
  }
}
</script>

pinia

  1. pinia和vuex一样是一个全局状态管理库
  2. 有三个核心:
    • state
    • getters
    • actions

.use()

作用:安装插件,在应用程序启动的时候添加全局的功能,并为插件提供一个统一
的安装入口

h()函数

  1. 作用:用来创建虚拟dom节点
  2. 使用:接受三个参数:标签名、属性对象和子节点数组,然后返回一个描述了对应虚拟 DOM 节点的 JavaScript 对象。
import { h } from 'vue'

const vnode = h('div', { id: 'app' }, [
  h('h1', null, 'Hello, Vue 3!'),
  h('p', null, 'This is a paragraph.')
])

render()函数

  1. 作用:将虚拟dom节点变成真实dom节点
  2. 使用:
import { h } from 'vue'

export default {
  props: {
    message: {
      type: String,
      required: true
    }
  },
  render() {
    return h('div', [
      h('h1', this.message),
      h('p', 'This is a paragraph.')
    ])
  }
}

keep-alive

  1. 概念:是一个抽象组件,将动态组件缓存起来,避免销毁和重复渲染
  2. 原理:基于vue的虚拟dom和生命周期,当一个动态组件被keep-alive包裹的时候,keep-alive会将这个组件的vnode也就是虚拟dom节点缓存起来,并在组件的deactiveted中销毁缓存的组件,当组件再次渲染的时候,keep-alive会从name属性拿到对应的vnode,把它渲染到页面上,这样就避免了重复渲染和销毁,提高了应用性能

插槽

插槽就是一个传递内容的机制,它允许自定义组件内的内容,提高了组件灵活性

  1. 默认插槽
  2. 具名插槽

欢迎提出问题和反馈问题补充文章~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值