Vue3 面试题

题目
  1. Vue 3和Vue 2有什么区别?
  2. 什么是Composition API??
  3. Vue 3中的Teleport是什么??
  4. Vue 3中的Reactive API是什么?
  5. Vue 3中的Vite是什么?
  6. Vue 3中的Suspense是什么?
  7. Vue 3中的Fragments是什么?
  8. Vue 3中的Emits API是什么?
  9. Vue 3中的Proxy相比于Vue 2中的Object.defineProperty有什么优势?
  10. Vue 3中的TypeScript支持如何?
  11. Vue 3中的V-model是如何工作的?
  12. Vue 3中的setup函数是什么?
  13. Vue 3中的Slots是什么?
  14. Vue 3中的Props是如何声明的?
  15. Vue 3中的Render函数是什么?
  16. Vue 3中的Provide和Inject是什么?
  17. Vue 3中的watchEffect和watch的区别是什么?
  18. Vue 3中的生命周期钩子有哪些变化?
  19. Vue 3中的Suspense和ErrorBoundary有什么区别?
  20. Vue 3中的SSR支持如何?
  21. Vue 3中的Composition API如何重用逻辑?
  22. Vue 3中的Composition API如何处理组件间的通信?
  23. Vue 3中的V-model如何自定义?
  24. Vue 3中的Composition API如何处理生命周期函数?
  25. Vue 3中如何使用全局状态管理?
  26. Vue 3中的Transition是什么?
  27. Vue 3中的KeepAlive是什么?
  28. Vue 3中的v-for和v-if如何一起使用?

1. Vue 3和Vue 2有什么区别?

答案:Vue 3相比Vue 2具有更高的性能更好的扩展性,采用了Composition API,使组件的逻辑更易于组织重用。另外,Vue 3还对TypeScript支持更好,并且引入了更多的编译时优化。

详解:

  1. 性能提升:Vue 3在编译器和运行时方面做了许多优化,包括更快的渲染和更新速度,更小的bundle大小,以及更好的响应性能。

  2. 编译器的重写:Vue 3的编译器与Vue 2的编译器相比进行了全面重写,并引入了新的编译优化,提高了模板的编译速度和生成的渲染函数的效率。

  3. Composition API:Vue 3引入了一种新的组合式API,也称为Composition API,它允许开发者更灵活地组织和重用代码逻辑。相比于Vue 2的Options APIComposition API更加强大,可读性更好,也更容易进行代码的维护和测试。

  4. 响应式系统的改进:Vue 3中的响应式系统进行了重大改进,包括对Proxy的使用,提供了更高效、更可靠的响应式数据绑定。

  5. 更好的TypeScript支持:Vue 3对TypeScript的支持更加完善,并提供了更准确的类型推断和IDE支持。

Vue 3在性能、开发体验和代码组织等方面都有了重大的改进,使得开发者可以更轻松地构建高效、可维护的应用程序。然而,由于Vue 3的一些重大变化,迁移到Vue 3可能需要进行一些代码的调整和更新。

2. 什么是Composition API?

答案:Composition API是Vue 3中新增的一种组织组件逻辑的方式。它与Vue 2的Options API相比,更加灵活和可扩展,可以将相关代码组织在一起,并且更好地支持代码重用。(简单来说,就是一个是选项式编码,一个是函数式编码)

详解:

使用Composition API,可以将一个组件的逻辑拆分成多个可复用的函数,并用这些函数来组合组件的逻辑。这样可以更好地组织组件代码,并使得逻辑复用更加容易和直观。

Composition API的主要特点包括:

  • 功能组合:通过将多个函数组合在一起来完成组件的逻辑。每个函数都可以实现特定的功能,然后可以将这些函数按照需要组合在一起使用。
  • 逻辑复用:通过将逻辑代码拆分成函数的方式来实现逻辑的复用。这样可以更好地组织和复用组件的逻辑代码。
  • 更好的可读性:Composition API的代码更加清晰和易于理解,因为可以根据功能将逻辑代码拆分成多个函数,使得代码的意图更加明确。

3. Vue 3中的Teleport是什么?

答案:Teleport是Vue 3中新增的一种特性,它可以将组件的内容渲染到DOM树中的不同位置,实现更灵活的布局。Teleport可以用于创建弹出框、模态框等。

详解:
在Vue 3中,Teleport是一个新的组件,它允许将组件的内容渲染到DOM结构中的任何位置。以前,我们只能使用将组件内容插入到父组件的特定位置,但是Teleport可以将组件内容渲染到DOM结构中的任何地方,无论它在组件的层次结构中的位置如何。

Teleport的语法如下:

<teleport to="目标元素选择器"></teleport>

其中,to属性指定了要渲染组件内容的目标元素选择器。例如:

<teleport to="#app"></teleport>

这将把组件内容渲染到具有id为”app”的元素上。

Teleport的作用是提供了更大的灵活性,并且可以方便地将组件内容渲染到不同的位置,例如弹出框、模态框等。

4. Vue 3中的Reactive API是什么?

答案:Reactive API是Vue 3中新增的一种响应式编程的方式。通过使用Reactive API,可以将普通对象转换为响应式对象,即当对象的属性发生改变时,相关的依赖会自动更新。

详解:
Reactive API是一组用于创建响应式数据的函数。它主要包括以下几个函数:

  • reactive:将一个普通的JavaScript对象转换为响应式对象。当响应式对象的属性发生变化时,相应的依赖会被自动追踪,并且相关的视图会被重新渲染。
  • ref:将一个普通的JavaScript值转换为响应式对象。ref函数返回的是一个包装过的对象,访问其值需要通过.value属性。
  • readonly:将一个响应式对象转换为只读的对象。只读对象的属性不能被修改。
  • shallowReactive:与reactive函数类似,但是只追踪对象的一层属性的变化,而不会深度追踪嵌套对象的变化。
  • shallowRef:与ref函数类似,但是只追踪值的一层变化,而不会深度追踪嵌套对象的变化。

Reactive API提供了一种声明式的方式来创建响应式数据,使得开发者可以更加方便地管理数据的变化和更新视图。

5. Vue 3中的Vite是什么?

答案:Vite是一个基于ESM的前端构建工具,可以用于快速开发原生ES模块的应用。它在开发环境下使用原生ES模块的方式加载模块,提供更快的冷启动热更新

详解:

  1. Vite借助ES模块的原生动态导入功能,可以在开发过程中以原生模块的方式直接加载代码,而无需将代码打包成一个或多个文件。这种开发模式可以避免了传统打包工具中的繁琐的构建过程,提供了更快的冷启动时间、更快的热更新和更快的代码构建。

  2. Vite还通过使用预打包技术,可以将Vue组件和依赖关系预编译为高度优化的静态资源,以进一步提高加载速度和性能。

6. Vue 3中的Suspense是什么?

答案:Suspense是Vue 3中新增的一种特性,可以在组件的异步内容加载完成之前,显示一个备用的内容。这样可以优化页面的加载体验,避免用户看到加载中的状态。

详解:

使用Suspense,我们可以将异步组件包裹在一个Suspense组件中,并在fallback属性中指定一个占位内容。当异步组件加载完成时,它将替换掉占位内容。

示例代码如下:

<template><Suspense><template #default><AsyncComponent /></template><template #fallback><LoadingSpinner /></template></Suspense></template><script>import { Suspense } from 'vue';import AsyncComponent from './AsyncComponent.vue';import LoadingSpinner from './LoadingSpinner.vue';export default {components: {Suspense,AsyncComponent,LoadingSpinner}}</script>

上述示例中,当AsyncComponent异步加载完成时,它将替换掉fallback中的LoadingSpinner。这样可以在等待异步加载时显示LoadingSpinner,提高用户体验。

需要注意的是,使用Suspense需要配合支持异步组件加载的插件或工具,如Vue Router或Webpack等。
7. Vue 3中的Fragments是什么?

答案:Fragments是Vue 3中新增的一种特性,可以在组件中使用多个根元素。在Vue 2中,组件必须只能包含一个根元素,而Fragments可以解决这个限制。

详解:

在Vue 2及以前的版本中,每个组件只能有一个根元素,因此如果想返回多个根元素,需要将它们包装在一个父元素中。但有时这样做会导致生成的HTML结构不符合预期或引入不必要的样式。

Vue 3中的Fragments解决了这个问题,它允许组件直接返回多个根元素,而无需使用包装元素。使用Fragments,可以在组件的模板中使用标签来包裹多个根元素,或者直接使用类似数组的语法,将多个根元素放在一个数组中返回。

下面是一个使用Fragments的示例:

Hello

World

或者

Hello

World

在上述示例中,

元素不再需要被包裹在一个父元素中,它们可以直接作为组件的根元素返回。

使用Fragments可以更灵活地组织组件的模板,使代码更具可读性和可维护性。

8. Vue 3中的Emits API是什么?

答案:Emits API是Vue 3中新增的一种声明式事件的方式。通过使用Emits API,可以在组件中声明它可以触发的事件,并自动生成事件处理函数。

详解:

通过Emits API,您可以在组件的选项中声明组件所能够触发的事件。这样做的好处是,可以提供一种类型安全的方式来定义事件,并且使得组件的使用者能够更清楚地知道该组件可以触发哪些事件。

Emits API的使用方式如下:

import { defineComponent } from 'vue';export default defineComponent({emits: ['click', 'update:modelValue'],// ...})

在上面的例子中,我们在组件的选项中使用emits属性声明了两个事件:clickupdate:modelValue。这意味着该组件可以触发这两个事件。

当组件需要触发一个事件时,可以使用新的emit函数来触发。与Vue 2中的$emit方法不同,新的emit函数会进行类型检查和代码提示,以确保只触发了组件可以触发的事件。

import { defineComponent } from 'vue';export default defineComponent({emits: ['click'],methods: {handleClick() {// 触发click事件this.emit('click');},},});

上面的代码演示了如何在组件中使用新的emit函数触发一个事件。

9. Vue 3中的Proxy相比于Vue 2中的Object.defineProperty有什么优势?

答案:Proxy相比于Object.defineProperty具有更强大的拦截和代理能力,并且可以拦截更多的操作,比如数组的操作。另外,Proxy还可以对嵌套对象进行拦截。

详解:

  1. 更强大的拦截能力:Proxy提供了丰富的拦截方法,可以拦截对象的各种操作,包括读取、写入、删除、迭代等。而Object.defineProperty只能拦截属性的读取和写入操作。

  2. 更好的性能:Proxy的拦截操作是在底层进行的,比Object.defineProperty更高效。它可以对整个对象进行代理,并且只有当真正需要拦截时才会触发拦截函数,而Object.defineProperty需要对每个属性单独设置。

  3. 更直观的语法:Proxy使用更直观的语法来定义代理行为,比Object.defineProperty更易于理解和使用。它可以通过一个拦截器对象来定义拦截操作,而不需要像Object.defineProperty一样手动设置属性。

  4. 可拦截数组操作:Proxy可以拦截数组的操作,包括对数组的修改、迭代等操作。而Object.defineProperty只能监听到数组的长度变化。

Vue 3中的Proxy相比于Vue 2中的Object.defineProperty拥有更强大的拦截能力、更好的性能和更直观的语法,能更好地解决数据变更的问题。

10. Vue 3中的TypeScript支持如何?

答案:Vue 3对TypeScript的支持更好,可以直接使用TypeScript进行开发,包括类型推断、接口定义、泛型等特性。

详解:

Vue 3对TypeScript的支持非常好。Vue 3的代码库中已经完全使用了TypeScript来编写。在Vue 3中,你可以使用TypeScript来编写组件,指令,插件等。

  1. 类型推断:Vue 3使用了更强大的类型系统,可以更准确地推断变量的类型。

  2. 组件类型:你可以使用TypeScript来定义组件的props、data、computed、methods等属性的类型。

  3. 组件选项类型:Vue 3提供了一个defineComponent函数,用于定义组件选项的类型。这样可以确保在编写组件时,所有的选项都符合typescript的类型检查。

  4. 装饰器:Vue 3支持使用装饰器语法来编写组件和其他Vue相关的代码。

  5. 类型推导:Vue 3的响应式系统会通过类型推导来推断变量的类型,这样可以更方便地使用响应式数据。

Vue 3的TypeScript支持非常强大,它可以帮助开发者更轻松地编写可维护和可扩展的Vue应用程序。

11. Vue 3中的V-model是如何工作的?

答案:Vue 3中的V-model使用v-bindv-on指令实现。v-bind用于将属性与组件的data中的变量绑定,v-on用于监听组件的事件,并将事件的值传递给data中的变量。

详解:

Vue 3中的v-model与Vue 2中的v-model有一些不同之处。在Vue 3中,v-model通过使用modelValueonUpdate:modelValue属性来实现双向绑定。

例如,假设我们有一个自定义的Input组件,我们想要在父组件中使用v-model来绑定数据。首先,我们需要在Input组件中定义modelValueonUpdate:modelValue属性:

export default {props: {modelValue: {type: String,required: true}}}

然后,在父组件中,我们可以使用v-model来绑定数据:

import Input from './Input.vue';export default {components: {Input},data() {return {message: ''}}}

在这个例子中,当Input组件的输入值发生变化时,会触发$emit('update:modelValue', $event.target.value)事件,将新的值传递给父组件。父组件会更新message的值,从而实现双向绑定。

总结来说,Vue 3中的v-model通过使用modelValueonUpdate:modelValue属性,以及自定义组件的$emit方法来实现双向绑定。

12. Vue 3中的setup函数是什么?

答案:setup函数是Vue 3中新增的一个钩子函数,用于组件的初始化。在setup函数中可以使用Composition API来组织组件的逻辑。

详解:

在Vue 3中,setup函数是一个新的组件选项,用于替代Vue 2中的beforeCreatecreated钩子函数。setup函数是一个接受props参数和上下文对象的函数,用于在组件实例创建之前执行一些初始化操作。

setup函数有两个参数:propscontextprops包含了组件的属性,可以在setup函数内部访问和操作。context是一个包含了与组件实例相关的属性和方法的对象,例如attrsslotsemit等。

setup函数内部,可以通过返回一个对象来提供组件的状态、计算属性、方法等。这个返回的对象将会被注入到组件实例中,可以在模板中进行访问。

举个例子,下面是一个使用setup函数的简单组件:

import { ref } from 'vue';export default {props: ['name'],setup(props) {const count = ref(0);function increment() {count.value++;}return {count,increment};}}

在这个例子中,setup函数接收到props参数,然后使用ref函数创建了一个响应式的数据count和一个方法increment。最后,将这些数据和方法返回,使它们能够在组件中使用。

需要注意的是,在setup函数内部是不能访问this的,因为组件实例还没有创建。如果需要访问this,可以使用context参数。

13. Vue 3中的Slots是什么?

答案:Slots是Vue 3中用于实现组件内容的分发的一种机制。通过使用Slots,可以在组件中插入任意的内容,并且可以通过插槽名称进行分发。

详解:

在Vue 3中,Slots(插槽)是一种用于进行组件内容分发的机制。插槽允许我们在组件的模板中定义一些可重用的内容,并在组件的实例中进行分发。这样可以使得组件可以接受来自父组件的任意内容,并将其插入到指定的位置。

在Vue 3中,插槽的使用方式与Vue 2中的插槽使用方式有所不同。在Vue 3中,我们可以使用标签来创建一个插槽,并使用v-slot指令来指定插槽的名称。然后,我们可以将内容封装在包含标签的组件中,并在父组件中使用标签来指定要分发到插槽中的内容。

例如,下面是一个使用插槽的简单示例:

<template><div><slot></slot></div></template><template><div><ChildComponent><template v-slot>这是要分发到插槽中的内容</template></ChildComponent></div></template>

在这个示例中,子组件中的标签定义了一个插槽,而父组件中的标签使用了v-slot指令来指定要分发到该插槽的内容。在实际渲染过程中,标签会被替换为父组件中指定的内容。

通过使用插槽,我们可以使组件具有更大的灵活性,允许父组件自定义组件的一些内容。

14. Vue 3中的Props是如何声明的?

答案:在Vue 3中,可以使用PropTypes或者TypeScript来声明组件的Props。PropTypes是Vue 3中兼容Vue 2的一种方式,而TypeScript是一种类型声明的方式。

详解:

在Vue 3中,Props是通过在组件的setup函数中使用defineProps函数来声明的。

import { defineProps } from 'vue';export default {props: {name: {type: String,required: true},age: {type: Number,default: 18}},setup(props) {// 使用defineProps声明PropsdefineProps({name: {type: String,required: true},age: {type: Number,default: 18}});// 访问Propsconsole.log(props.name); // 输出传入的name值console.log(props.age); // 输出传入的age值或默认值return {// 组件其他逻辑};}};

setup函数中,我们需要先使用defineProps函数声明Props。可以直接传入一个对象,对象的键为Props的名称,值为Props的配置选项,例如类型、是否必需、默认值等。

然后,在setup函数中,可以通过props参数来访问Props的值,并使用它们进行组件内的逻辑处理。

需要注意的是,defineProps函数仅在setup函数中调用一次,并且在return之前调用,否则会报错。

15. Vue 3中的Render函数是什么?

答案:在Vue 3中,可以使用Render函数来定义组件的渲染逻辑。Render函数接收一个参数h,可以通过调用h函数来创建DOM元素。

详解:

在Vue 3中,render函数是一种用来描述组件渲染输出的函数式编程方法。它接收一个上下文对象作为参数,该对象包含了组件的状态和属性等信息,并返回一个渲染结果。

render函数可以用来代替Vue 2中的模板语法,它可以直接在组件选项中定义,也可以作为一个独立的模块导出并在组件中引用。

使用render函数,可以将组件的视图逻辑用JavaScript代码的形式来描述,可以使用语法糖JSX,也可以使用h函数来创建虚拟DOM节点。通过编写render函数,可以更灵活地控制组件的渲染逻辑,实现更复杂的界面效果。

以下是一个使用render函数的例子:

import { h } from 'vue';export default {render() {return h('div', { class: 'container' }, [h('h1', 'Hello, Vue 3!'),h('p', 'This is a component rendered by render function.'),]);},};

在上面的例子中,render函数返回了一个包含一个div容器、一个h1标题和一个p段落的虚拟DOM节点。这个虚拟DOM节点最终会被渲染为真实的DOM节点,并显示在页面上。

16. Vue 3中的Provide和Inject是什么?

答案:ProvideInject是Vue 3中一对用于组件之间传递数据的API。通过在父组件中提供数据,并在子组件中注入数据,可以实现跨组件的数据传递。

详解:

在Vue 3中,provideinject是一对用于在父组件和子组件之间进行数据传递的选项。

provide选项允许一个父组件向其所有子组件提供数据。可以将provide选项配置在父组件的组件选项中,并且可以提供一个对象,对象中的属性可以作为数据进行共享。例如:

// ParentComponent.vueexport default {provide: {message: 'Hello from parent'}}

然后,在子组件中可以使用inject选项来接收父组件提供的数据。inject选项的值可以是一个数组,数组中的元素为要接收的属性名,也可以是一个对象,对象的属性名为要接收的属性名,属性值为默认值。例如:

// ChildComponent.vueexport default {inject: ['message'],mounted() {console.log(this.message); // 输出 'Hello from parent'}}

需要注意的是,子组件通过inject选项接收到的数据是响应式的,即当父组件的数据发生变化时,子组件也会相应地更新。

除了使用provideinject选项外,还可以使用createApp函数的第二个参数来提供和注入数据,如下所示:

const app = createApp({// ...}, {message: 'Hello from parent'});

然后,在子组件中可以使用inject选项来接收数据。

总之,provideinject允许在父组件和子组件之间进行数据的共享和传递,可以实现跨层级组件之间的通信。

17. Vue 3中的watchEffect和watch的区别是什么?

答案:watchEffect和watch都可以用于监听数据的变化,但是watchEffect会在组件的渲染时立即执行,而watch是延迟执行的。

详解:

  1. watchEffect是一个立即执行的副作用函数,它会立即执行一次,并且会在所依赖的响应式属性发生变化时被再次调用。watchEffect没有显式地声明依赖关系,它会自动追踪响应式数据的变化并触发更新。watchEffect不返回一个清理函数。
import { watchEffect } from 'vue';watchEffect(() => {// 副作用函数console.log('watchEffect');});
  1. watch是一个侦听特定的响应式数据变化的函数,它需要明确声明依赖关系。当所依赖的响应式属性发生变化时,watch会执行副作用函数。watch函数接收两个参数:要监听的响应式数据和副作用函数。它还可以接收第三个参数options,用于配置更多的选项,例如立即执行标志immediate。watch函数返回一个清理函数,用于停止监听。
import { watch } from 'vue';watch(() => {// 要监听的响应式数据return state.count;}, (newValue, oldValue) => {// 副作用函数console.log('watch', newValue, oldValue);});

watchEffect在功能上更加灵活和简洁,而watch给你更多的控制权和配置选项,可以更精确地控制副作用函数的执行。根据具体的需求,可以选择使用其中之一。

18. Vue 3中的生命周期钩子有哪些变化?

答案:在Vue 3中,生命周期钩子的名称和Vue 2基本保持一致,但是新增了一些钩子函数,比如beforeUnmountonActivated等。

详解:

  1. beforeCreatecreated钩子没有变化,仍然在实例创建之前和之后被调用。

  2. onBeforeMountonMounted 是 Vue 3 中的生命周期钩子,它们分别在组件挂载之前和之后运行。

  3. onBeforeUpdateonUpdated 是 Vue 3 中的生命周期钩子函数,它们分别在组件更新之前和之后运行。

  4. beforeUnmount(之前称为beforeDestroy)和unmounted(之前称为destroyed)是新的生命周期钩子,用于在实例从DOM中卸载之前和之后进行操作。

Vue 3还引入了一些新的组合式API,用于替代传统的生命周期钩子。这些帮助函数包括onBeforeMount、onMounted、onBeforeUpdate、onUpdated、onBeforeUnmount等,可以更灵活地进行组合式开发。

19. Vue 3中的Suspense和ErrorBoundary有什么区别?

答案:Suspense用于组件异步内容的加载,而ErrorBoundary用于捕获组件渲染错误。它们的目的和用途不同,但都可以用于优化页面的加载和错误处理。

详解:

  1. SuspenseErrorBoundary都是用来处理组件异步加载或错误处理的新特性,但它们有不同的用途和工作方式。

  2. Suspense是用于处理组件的异步加载。在Vue3中,你可以使用Suspense组件将异步加载的组件包裹起来,然后在组件加载完成之前显示一个加载中的状态。这样可以避免在组件加载过程中出现闪烁的情况,并提供了更好的用户体验。

  3. ErrorBoundary是用于处理组件的错误。当一个错误发生在ErrorBoundary的子组件中时,ErrorBoundary将捕获这个错误并显示一个指定的错误UI。这样可以防止错误的扩散并提供更好的错误处理和用户体验。

总之,Suspense用于处理组件的异步加载过程,而ErrorBoundary用于处理组件的错误。它们的主要区别在于处理的场景和目的不同。

20. Vue 3中的SSR支持如何?

答案:Vue 3对SSR的支持更好,可以使用Vite进行SSR的开发。Vite提供了一个简单的SSR解决方案,并且与Vue 3的开发体验更加一致。

详解:

在Vue 3中,服务器端渲染(SSR)的支持与Vue 2相比略有变化。Vue 3引入了一个全新的服务器端渲染框架,称为“Vue 3 SSR”。它是在Vue 3的基础上重新设计和优化的框架,旨在提供更好的性能和开发体验。

Vue 3 SSR相对于Vue 2 SSR的一些改进包括:

  1. 更好的性能:Vue 3 SSR引入了一些优化措施,如渲染器的“懒编译”和“片段缓存”,以提高渲染速度和减少内存占用。

  2. 更直观的API:Vue 3 SSR引入了一套全新的API,使开发者能够更直观地编写和组织服务器端渲染逻辑。

  3. 更好的TypeScript支持:Vue 3 SSR对TypeScript的支持更好,提供了更准确的类型推断和更丰富的接口定义。

值得一提的是,Vue 3 SSR仍然处于实验阶段,并且正在积极开发中。目前,官方文档中提供了一些关于Vue 3 SSR的初步指南和示例代码,但在生产环境中使用时还需要注意其稳定性和兼容性。

如果想要了解更多有关Vue 3 SSR的信息,我建议你查阅Vue 3官方文档中的相关章节,或者参考社区中的一些开源项目和教程。

21. Vue 3中的Composition API如何重用逻辑?

答案:Composition API可以通过函数进行逻辑的封装和复用。将相关逻辑封装为一个函数,然后在不同的组件中调用该函数来重用逻辑。

详解:

在Vue 3中,您可以使用Composition API来重用逻辑。Composition API使您可以根据功能将逻辑组织成可重用的逻辑块,称为”composition”。以下是一些在Vue 3中重用逻辑的方法:

  1. 函数提取:在Composition API中,您可以将逻辑封装在一个函数中,并在需要时调用该函数。这使您能够将相同的逻辑用于不同的组件中。

例如:

function useLogic() {// 在这里定义逻辑return {// 返回逻辑相关的数据和方法}}// 在组件中使用export default {setup() {const { data, methods } = useLogic();// 在组件中使用逻辑}}
  1. 自定义Hooks:您可以通过创建自定义Hooks来重用逻辑。自定义Hooks是一个函数,该函数在内部使用Composition API来定义逻辑。然后,您可以在需要的组件中使用自定义Hooks。

例如:

// useLogic.jsimport { ref } from "vue";export function useLogic() {const data = ref(null);// 在这里定义逻辑return { data };}// 在组件中使用import { useLogic } from "./useLogic.js";export default {setup() {const { data } = useLogic();// 在组件中使用逻辑}}
  1. Composition Functions:您还可以使用Composition API中的Composition Functions来重用逻辑。Composition Function是一个接受参数的函数,该参数是可配置的逻辑块。您可以根据需要更改配置,以实现逻辑的重用。

例如:

import { computed } from "vue";export function useLogic(config = {}) {const data = computed(() => {// 根据config配置计算数据return /* 计算的数据 */});// ...其他逻辑return {data,// ...其他返回的数据和方法};}// 在组件中使用import { useLogic } from "./useLogic.js";export default {setup() {const { data } = useLogic({ /* 可配置的逻辑块 */ });// 在组件中使用逻辑}}

通过这些方法,您可以在Vue 3中重用逻辑并使代码更加模块化和可维护。

22. Vue 3中的Composition API如何处理组件间的通信?

答案:Composition API提供了reactive和toRefs等函数来处理组件间的通信。通过将数据转换为响应式对象,并使用toRefs函数将对象的属性转换为ref对象,可以实现组件之间的通信。

详解:

在Vue 3的Composition API中,可以使用provideinject来实现组件间的通信。

provide函数用于向其子组件提供数据,它接受两个参数:一个键(key)用于标识数据,和一个值(value)提供给子组件使用。在父组件中,使用provide来提供数据:

import { provide } from 'vue';export default {setup() {const data = 'Hello from parent';provide('dataKey', data);// ...}}

在子组件中,可以使用inject来获取提供的数据。inject接受一个参数,即要获取的数据的键。它会返回提供的值,如果没有找到提供的值,则返回默认值(可选):

import { inject } from 'vue';export default {setup() {const data = inject('dataKey', 'Default value');console.log(data); // Output: Hello from parent// ...}}

通过使用provideinject,我们可以在父组件中向子组件提供数据,并在子组件中访问该数据,实现了组件间的通信。

需要注意的是,provideinject不适用于跨越多层嵌套的组件通信。如果需要在跨越多层嵌套的组件中通信,可以考虑使用$attrs$listeners属性、事件总线或状态管理库(如Vuex)。

23. Vue 3中的V-model如何自定义?

答案:在Vue 3中,可以通过使用v-bind和v-on指令来自定义V-model。通过在组件中使用v-bind绑定值,并在组件中使用v-on监听值的变化,可以自定义V-model的行为。

详解:

我之前的博客有一篇有详细的分享vue2 以及 vue3 自定义组件使用 v-model使用默认值以及自定义事件

24. Vue 3中的Composition API如何处理生命周期函数?

答案:Composition API中的生命周期函数可以通过onBeforeMount、onMounted等钩子函数来处理。这些钩子函数与Vue 2中的生命周期钩子函数具有相似的名称和用途。

详解:
在Vue 3的Composition API中,生命周期函数的处理方式有所改变。在以前的Options API中,生命周期函数是通过声明在Vue实例中的特定方法来定义和处理的。而在Composition API中,我们可以使用特定的钩子函数来处理生命周期。

以下是Vue 3中Composition API中使用的生命周期钩子函数:

  • onBeforeMount:在组件挂载之前调用,类似于以前的beforeMount钩子。
  • onMounted:在组件挂载后调用,类似于以前的mounted钩子。
  • onBeforeUpdate:在组件更新之前调用,类似于以前的beforeUpdate钩子。
  • onUpdated:在组件更新后调用,类似于以前的updated钩子。
  • onBeforeUnmount:在组件卸载之前调用,类似于以前的beforeUnmount钩子。
  • onUnmounted:在组件卸载后调用,类似于以前的unmounted钩子。
  • onErrorCaptured:在子组件触发错误时调用,类似于以前的errorCaptured钩子。

这些钩子函数可以通过使用import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, onErrorCaptured } from 'vue'来引入,并在组件内部使用。

除了以上的钩子函数,Composition API还提供了其他一些用于处理生命周期的函数,如watchEffectonRenderTriggered等。这些函数可以更灵活地处理组件的生命周期和更新逻辑。

需要注意的是,在Composition API中,我们不必再将生命周期钩子函数声明为组件实例的方法,而是将它们直接定义在组件内部即可。这样可以更好地组织和管理组件的逻辑。

25. Vue 3中如何使用全局状态管理?

答案:在Vue 3中可以使用Vuex来进行全局状态管理。Vuex是一个专门为Vue.js应用程序开发的状态管理模式。当然(Pinia是官方推荐的不依赖于 Vue Router,并且可以更好地与 TypeScript 结合使用。它借鉴了 Vuex 的一些概念,但也提供了一些新的概念,如 actions 的类型安全、插件的扩展能力等。)

详解:

vuex推荐一篇很好的博客 vuex
pinia推荐一篇很好的博客 pinia

26. Vue 3中的Transition是什么?

答案:Transition是Vue 3中用于实现过渡效果的一种组件。通过使用Transition组件,可以在组件的进入离开时添加过渡效果。

详解:

Vue 3中的Transition是一种用于在元素进入和离开DOM过程中应用过渡效果的组件。它可以让你通过添加过渡类名来定义元素的进入和离开过渡动画,比如淡入淡出、滑动等效果。

在Vue 3中,Transition组件被重命名为,并且可以使用v-slot来定义各个过渡阶段的动画效果。它包含以下几个属性和事件:

  • name:指定过渡类名的前缀,用于定义过渡的CSS类名,默认为”v”。
  • appear:指定是否在初始渲染时应用过渡,默认为false。
  • css:指定是否使用CSS过渡效果,默认为true。
  • type:指定过渡类型,可选值有’transition’(默认)和’animation’。
  • duration:指定过渡动画的持续时间,默认为”0.3s”。
  • enter-class:指定进入过渡的CSS类名,默认为${name}-enter
  • enter-active-class:指定进入过渡的活动CSS类名,默认为${name}-enter-active
  • enter-to-class:指定进入过渡的目标CSS类名,默认为${name}-enter-to
  • leave-class:指定离开过渡的CSS类名,默认为${name}-leave
  • leave-active-class:指定离开过渡的活动CSS类名,默认为${name}-leave-active
  • leave-to-class:指定离开过渡的目标CSS类名,默认为${name}-leave-to

除了属性之外,Transition组件还提供了以下几个过渡事件:

  • before-enter:在进入过渡开始之前触发。
  • enter:在进入过渡开始之后,元素被插入DOM之前触发。
  • after-enter:在进入过渡完成之后触发。
  • before-leave:在离开过渡开始之前触发。
  • leave:在离开过渡开始之后触发。
  • after-leave:在离开过渡完成之后触发。

通过使用Transition组件,你可以轻松地为元素添加各种过渡效果,提升用户体验。

27. Vue 3中的KeepAlive是什么?

答案:KeepAlive是Vue 3中用于缓存组件的一种组件。通过使用KeepAlive组件,可以将组件的状态保存在缓存中,避免每次重新创建组件。

详解:

在Vue 3中, 是一个内置组件,用于缓存动态组件,以减少组件的销毁和重新创建次数,从而提高性能。

在使用动态组件时,当组件切换时,原来的组件会被销毁,然后重新创建一个新的组件。这样频繁的销毁和创建组件可能会导致一些性能问题,特别是在组件比较复杂或者渲染代价较高的情况下。

通过使用 组件,我们可以将动态组件缓存起来,当组件切换时,只会通过隐藏和显示的方式来管理组件的状态,而不会销毁和重新创建组件。这样可以大大减少组件的初始化和销毁开销,提高页面的性能。

例如:

<template><div><button @click="switchComponent">切换组件</button><keep-alive><component :is="currentComponent" /></keep-alive></div></template><script>export default {data() {return {currentComponent: 'ComponentA',};},methods: {switchComponent() {this.currentComponent = this.currentComponent === 'ComponentA' ? 'ComponentB' : 'ComponentA';},},};</script>

上面的代码中, 组件将动态组件缓存起来。当切换组件时,只是通过隐藏和显示的方式来切换组件的状态,而不会销毁和重新创建组件。

注意: 组件需要与 配合使用,且 :is 属性的值为动态组件的名称或者组件的引用。

28. Vue 3中的v-for和v-if如何一起使用?

答案:在Vue 3中,v-for和v-if可以一起使用,但是需要注意它们的顺序。v-for具有更高的优先级。这意味着如果一个元素同时具有v-for和v-if指令,则v-for会先被执行,然后v-if会被应用在每个循环中的元素上。

详解:

在Vue 3中,v-for和v-if可以一起使用并且没有任何限制。你可以像在之前的版本中一样使用它们。

例如,假设你有一个包含一组学生的数组,并且你希望只显示年龄大于18岁的学生。你可以使用v-for遍历数组,并在每个学生元素上使用v-if条件来过滤它们。

<div><div v-for="student in students" v-if="student.age > 18">{{ student.name }}</div></div>

上面的代码将只显示年龄大于18岁的学生。

需要注意的是,当v-for和v-if同时使用时,v-for具有更高的优先级。这意味着v-for将首先遍历整个数组,并在每个元素上应用v-if条件。因此,如果你的数组中存在不满足v-if条件的元素,它们仍然会被遍历,但不会显示在页面上。

<div><div v-for="student in students" v-if="student.age > 18">{{ student.name }}</div><div v-if="students.length === 0">没有学生满足条件。</div></div>

在上面的代码中,即使没有学生满足条件,也会显示一个提示消息。

总结一下,Vue 3中的v-for和v-if可以一起使用,你可以在v-for循环中使用v-if条件来过滤和显示特定的元素。

更新中…

以上面试题只是度娘推荐题目,并非真实面试收录。欢迎各位同学留下自己的面试经历以及心得。谢谢!