Vue面试题

这篇博客详细介绍了Vue的面试常见问题,包括MVVM概念、Vue的优点、组件通信、路由操作、状态管理Vuex的使用以及Vue的生命周期、事件修饰符、优化策略等,深入探讨了Vue开发中的关键技术和最佳实践。

什么是MVVM?

MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。

在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。

ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合?

mvc和mvvm其实区别并不大。都是一种设计思想。主要就是mvc中Controller演变成mvvm中的viewModel。mvvm主要解决了mvc中大量的DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。

区别:vue数据驱动,通过数据来显示视图层而不是节点操作。

场景:数据操作比较多的场景,更加便捷

vue的优点是什么?

低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。

独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。

可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

组件之间的传值?

父组件与子组件传值

父组件通过标签上面定义传值

子组件通过props方法接受数据

子组件向父组件传递数据

子组件通过$emit方法传递参数

路由之间跳转

声明式(标签跳转) 编程式( js跳转)

vue的路由使用步骤?

1.下载vue-router路由模块;

2.创建路由对象;

3.配置路由规则;

4.将路由对象注册为vue实例对象的成员属性;

vue路由的几种模式:

两种:hash(默认) history 可以用model属性切换路由模式

怎么样定义vue-router的动态路由:

比如 path:中拼接参数, this.$route.params.id 获取;

什么是路由懒加载:

路由懒加载是通过异步的方式来加载对应的路由组件,提高页面相应速度

vue.cli中怎样使用自定义的组件?有遇到过哪些问题吗?

第一步:在components目录新建你的组件文件(indexPage.vue),script一定要export default {}

第二步:在需要用的页面(组件)中导入:import indexPage from ‘@/components/indexPage.vue’

第三步:注入到vue的子组件的components属性上面,components:{indexPage}

第四步:在template视图view中使用,

例如有indexPage命名,使用的时候则index-page

vue如何实现按需加载配合webpack设置

webpack中提供了require.ensure()来实现按需加载。以前引入路由是通过import 这样的方式引入,改为const定义的方式进行引入。

不进行页面按需加载引入方式:import home from ‘…/…/common/home.vue’

进行页面按需加载的引入方式:const home = r => require.ensure( [], () => r (require(’…/…/common/home.vue’)))

vue的生命周期:

beforeCreate: 进行数据和方法的初始化;

created: 已经完成数据和方法的初始化;

beforeMount: 开始渲染dom

mounted:可以渲染dom

beforeUpdate: data中的数据即将被更新;

updated: data中的数据更新完毕;

beforeDestroy: 实例即将销毁;

destroyed:实例已被销毁;

vue双向数据绑定原理:

vue是结合数据劫持和发布订阅者模式来实现双向数据绑定的,当要读取数据的时候会自动触发方法,并且会被赋值

vue中的事件修饰符:

.prevent() 阻止默认事件;

.once() 只执行一次;

.stop() 阻止冒泡;

vue如何优化页面加载:

使用cdn,不要打包一些公共的文件和组件库

vue中有哪些内置组件:

component slot transtion fliters

vue创建组件的时候data中为什么会被return出一个对象?

可以保证组件的每一次调用都是创建一个新对象,组件之间不会产生影响;

什么是vuex?在那种场景下使用?

vuex是全局状态管理工具,它有以下几个核心部分组成:

state:存储数据;

mutations:更新数据的方法;

actions:调用mutations方法,更新state数据;

getters:对state中的数据进行预处理

Vuex相关

(1)vuex是什么?怎么使用?哪种功能场景使用它?

vue框架中状态管理。在main.js引入store,注入。新建一个目录store,…… export 。场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车

(2)vuex有哪几种属性?

有五种,分别是 State、 Getter、Mutation 、Action、 Module

vuex的State特性

A、Vuex就是一个仓库,仓库里面放了很多对象。其中state就是数据源存放地,对应于一般Vue对象里面的data

B、state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新

C、它通过mapState把全局的 state 和 getters 映射到当前组件的 computed 计算属性中

vuex的Getter特性

A、getters 可以对State进行计算操作,它就是Store的计算属性

B、 虽然在组件内也可以做计算属性,但是getters 可以在多组件之间复用

C、 如果一个状态只在一个组件内使用,是可以不用getters

vuex的Mutation特性

Action 类似于 mutation,不同在于:Action 提交的是 mutation,而不是直接变更状态;Action 可以包含任意异步操作。

(3)不用Vuex会带来什么问题?

可维护性会下降,想修改数据要维护三个地方;

可读性会下降,因为一个组件里的数据,根本就看不出来是从哪来的;

增加耦合,大量的上传派发,会让耦合性大大增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背。

v-show和v-if指令的共同点和不同点

v-show指令是通过修改元素的display的CSS属性让其显示或者隐藏;

v-if指令是直接销毁和重建DOM达到让元素显示和隐藏的效果;

使用v-show会更加节省性能上的开销;当只需要一次显示或隐藏时,使用v-if更加合理。

你将怎样在模板中渲染原始 HTML?

在模板中输出内容的典型方法是使用 mustache 语法标签从方法、属性或数据变量输出数据。但是 mustache 标记会渲染文本。如果你尝试使用 mustache 标记来渲染 HTML,它将以文本字符串的形式去渲染,并且不会被解析。要将内容渲染和解析为 html,我们可以使用 v-html 指令,如下所示。

什么是vue-loader?

Vue-loader 是 Webpack 的加载器模块,它使我们可以用 .vue 文件格式编写单文件组件。单文件组件文件有三个部分,即模板、脚本和样式。 vue-loader 模块允许 webpack 使用单独的加载器模块(例如 SASS 或 SCSS 加载器)提取和处理每个部分。该设置使我们可以使用 .vue 文件无缝编写程序。

vue-loader 模块还允许把静态资源视为模块依赖性,并允许使用 webpack 加载器进行处理。而且还允许在开发过程中进行热重装。

什么是 mixin?

Mixins 使我们能够为 Vue 组件编写可插拔和可重用的功能。如果你希望在多个组件之间重用一组组件选项,例如生命周期 hook、方法等,则可以将其编写为 mixin,并在组件中简单地引用它。然后将 mixin 的内容合并到组件中。如果你要在 mixin 中定义生命周期 hook,那么它在执行时将优先于组件自己的 hook 。

在开发过程中,如果你的 Vue 程序和后端 API 服务器未在同一主机上运行,该如何代理 API 请求。假设使用 Vue-CLI 3 进行设置?

Let’s say we have a Node.js backend server running on localhost:4040. To ensure it is proxyed in and accessible from the components, we can configure the vue.config.js file and include a devServer section as shown below:

假设我们有一个运行在 localhost:4040 上的 Node.js 后端服务器。为了确保代理并可以从组件中访问它,可以配置 vue.config.js 文件并包含 devServer 部分,如下所示:

在 vue.config.js 文件中:

module.exports: {
 devServer: {
 proxy: {
 '/api': { 
 target: ‘http://localhost:4040/api’, 
 changeOrigin: true 
  }
 }
 }
}

prop 如何指定其类型要求?

通过实现 prop 验证选项,可以为单个 prop 指定类型要求。这对生产没有影响,但是会在开发阶段发出警告,从而帮助开发人员识别传入数据和 prop 的特定类型要求的潜在问题。

配置三个 prop 的例子:

props: {
 accountNumber: {
 type: Number,
 required: true
 },
 name: {
 type: String,
 required: true
 },
 favoriteColors: Array
}

什么是虚拟 DOM?

文档对象模型或 DOM 定义了一个接口,该接口允许 JavaScript 之类的语言访问和操作 HTML 文档。元素由树中的节点表示,并且接口允许我们操纵它们。但是此接口需要付出代价,大量非常频繁的 DOM 操作会使页面速度变慢。

Vue 通过在内存中实现文档结构的虚拟表示来解决此问题,其中虚拟节点(VNode)表示 DOM 树中的节点。当需要操纵时,可以在虚拟 DOM的 内存中执行计算和操作,而不是在真实 DOM 上进行操纵。这自然会更快,并且允许虚拟 DOM 算法计算出最优化的方式来更新实际 DOM 结构。

一旦计算出,就将其应用于实际的 DOM 树,这就提高了性能,这就是为什么基于虚拟 DOM 的框架(例如 Vue 和 React)如此突出的原因。

什么是 Vue 插件?

Vue 插件允许开发人员构建全局级别的功能并将其添加到 Vue。用于向程序添加可以全局访问的方法和属性、资源,选项,mixin 以及其他自定义 API。 VueFire 是 Vue 插件的一个例子,该插件添加了 Firebase 特定的方法并将其绑定到整个程序。之后 firebase 函数可在程序结构中的任何位置的 this 上下文中使用。

什么时候调用 “updated” 生命周期 hook ?

在更新响应性数据并重新渲染虚拟 DOM 之后,将调用更新的 hook。它可以用于执行与 DOM 相关的操作,但是(默认情况下)不能保证子组件会被渲染,尽管也可以通过在更新函数中使用 this.$nextTick 来确保。

在 Vue 实例中编写生命周期 hook 或其他 option/propertie 时,为什么不使用箭头函数?

箭头函数自己没有定义 this 上下文,而是绑定到其父函数的上下文中。当你在 Vue 程序中使用箭头函数(=>)时,this 关键字病不会绑定到 Vue 实例,因此会引发错误。所以强烈建议改用标准函数声明。

什么时候使用keep-alive元素?

当由于数据属性或其他某种响应状态而动态切换组件时,每次将它们切换到渲染状态时,都会被重新渲染。尽管你可能需要这种行为,但在某些情况下重新渲染可能是不合适的。例如在创建时从 API 调用中引入数据的组件。你可能不希望每次动态切换这个组件进行渲染时都调用此 API。这时你可以将组件包含在 keep-alive 元素中。keep-alive 元素缓存该组件并从那里获取它,而不是每次都重新渲染它。

在大型 Vue 程序中管理状态的推荐方法是什么?为什么?

当程序在功能和代码方面不断增长时,状态管理会变得困难,并且使用无穷无尽的下游网络 prop 和上游事件当然不是明智的决定。在这种情况下,有必要将状态管理转移到中央管理系统。 Vue 生态系统中提供了 Vuex,它是官方的状态管理库,也是推荐用于集中存储状态的模式。

Vuex 允许维护中央状态。组件将 Vuex 用作响应性数据存储,并在状态更新时进行更新。多个或者不相关的组件可以依赖于相同的中央存储。

在这种情况下,Vue 充当纯 View 层。要修改状态,视图层(例如按钮或交互式组件)需要发出 Vuex Action,然后执行所需的任务。为了更新或修改状态,Vuex 提供了 Mutations。

这个工作流程的目的是留下可用的操作痕迹。

什么是异步组件?

当大型程序使用大量组件时,从服务器上同时加载所有组件可能是没有意义的。在这种情况下,Vue 允许我们在需要时定义从服务器异步加载的组件。在声明或注册组件时,Vue 接受提供 Promise 的工厂函数。然后可以在调用该组件时对其进行“解析”。

通过仅加载基本组件并把异步组件的加载推迟到未来的调用时间,可以节省带宽和程序加载时间。

这是一个异步组件的简单示例。

new Vue({
 components: {
 ‘tweet-box’: () => import(‘./components/async/TweetBox’)
 }
}); 

当以这种方式使用时,Webpack 的代码拆分将用于提供此功能。

### Vue 面试题及答案 #### 1. Vue.js 的响应式原理是什么? Vue.js 利用 **Object.defineProperty**(Vue 2.x)或 **Proxy**(Vue 3.x)来劫持据对象的读写操作。当据发生变化时,Vue 能够检测到这些变化,并通知相关的视图进行更新。这种机制使得据和视图保持同步,而无需手动操作 DOM。 具体来说,Vue 会递归地将据对象的所有属性转换为 getter 和 setter,从而实现对据的监听。在 Vue 3.x 中,使用 Proxy 替代了 Object.defineProperty,提供了更强大的功能和更好的性能[^1]。 #### 2. Vue 组件之间的通信方式有哪些? - **props / $emit**:父组件通过 props子组件据,子组件通过 $emit 向父组件发送事件。 - **v-model**:本质上是 props 和 $emit 的语法糖,用于双向绑定据。 - **provide / inject**:祖先组件向后代组件提供据,不需要逐级递。 - **Event Bus**:通过一个全局的 Vue 实例作为事件总线,实现任意组件间的通信。 - **Vuex**:适用于复杂应用的状态管理工具,集中管理应用的状态。 #### 3. Vue 生命周期钩子函有哪些?分别在什么时候触发? Vue 组件的生命周期可以分为以下几个阶段: - **beforeCreate**:实例初始化之后,据观测 (data observer) 和 event/watcher 事件配置之前被调用。 - **created**:实例已经创建完成,属性已绑定,但 DOM 还未生成。 - **beforeMount**:挂载开始之前被调用。 - **mounted**:DOM 已经渲染完毕,可以访问真实的 DOM 元素。 - **beforeUpdate**:据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 - **updated**:据更新后调用,虚拟 DOM 重新渲染并应用补丁。 - **beforeUnmount**:实例销毁之前调用。 - **unmounted**:实例销毁后调用。 #### 4. Vue 3 相比 Vue 2 有哪些改进? - **更快的运行速度**:Vue 3 使用 Proxy 来实现响应式系统,相比 Vue 2 的 Object.defineProperty 更加高效。 - **更小的体积**:Vue 3 通过模块化设计和 Tree-shaking 技术,显著减少了框架的体积。 - **更好的 TypeScript 支持**:Vue 3 原生支持 TypeScript,提供了更好的类型推导和开发体验。 - **Composition API**:引入了类似于 React Hook 的 Composition API,使代码组织更加灵活和可复用。 - **更好的可维护性和扩展性**:Vue 3 的架构更加模块化,便于长期维护和扩展。 #### 5. Vue 中的 computed 和 watch 有什么区别? - **computed**:计算属性基于它们的依赖进行缓存,只有在其依赖的据发生变化时才会重新计算。适合处理复杂的逻辑和模板中的表达式。 - **watch**:观察某个据的变化,并执行相应的回调函。适用于异步操作或需要执行开销较大的任务。 #### 6. Vue 中的 key 属性有什么作用? `key` 属性主要用于标识列表中每个元素的唯一性。当 Vue 渲染列表时,它会尽可能高效地复用现有的元素,而不是重新创建新的元素。通过设置唯一的 `key`,可以帮助 Vue 更准确地判断哪些元素发生了变化,从而提高渲染效率。 #### 7. Vue 中的 v-if 和 v-show 有什么区别? - **v-if**:根据条件决定是否渲染元素。如果条件为假,则元素不会出现在 DOM 中。 - **v-show**:通过 CSS 的 `display` 属性控制元素的显示与隐藏。无论条件如何,元素始终存在于 DOM 中。 #### 8. Vue 中的 nextTick 是什么?有什么用途? `nextTick` 是 Vue 提供的一个方法,用于在下次 DOM 更新循环结束后执行回调函。由于 Vue 的响应式系统是异步更新的,因此在某些情况下,直接访问或操作 DOM 可能无法获取最新的状态。通过 `nextTick`,可以确保在 DOM 更新完成后执行相关操作。 #### 9. Vue 中的 mixin 是什么?有什么优缺点? - **mixin**:是一种分发 Vue 组件中可复用功能的方式。可以通过定义 mixin 对象,包含组件的(如 data、methods、生命周期钩子等),然后将其混入到多个组件中。 - **优点**:提高代码的复用性和可维护性。 - **缺点**:可能导致命名冲突和逻辑混乱,特别是在大型目中使用过多的 mixin 时。 #### 10. Vue 中的插槽(slot)是什么?如何使用? 插槽是 Vue 提供的一种内容分发机制,允许父组件子组件递 HTML 内容。通过 `<slot>` 标签,可以在子组件中预留一个位置,供父组件填充内容。 - **默认插槽**:父组件直接递内容给子组件。 - **具名插槽**:通过 `name` 属性指定不同的插槽位置。 - **作用域插槽**:子组件可以向父组件据,父组件可以根据这些据自定义内容。 ```html <!-- 子组件 --> <template> <div> <slot name="header"></slot> <p>主要内容</p> <slot name="footer"></slot> </div> </template> <!-- 父组件 --> <template> <child-component> <template #header> <h1>头部内容</h1> </template> <template #footer> <p>底部内容</p> </template> </child-component> </template> ``` #### 11. Vue 中的 keep-alive 是什么?有什么用途? `keep-alive` 是 Vue 提供的一个内置组件,用于缓存动态组件的状态。当组件被切换时,`keep-alive` 可以保留组件的状态,避免重复渲染和初始化。这对于提升用户体验和性能非常有帮助。 ```html <keep-alive> <component :is="currentComponent"></component> </keep-alive> ``` #### 12. Vue 中的 directive 是什么?如何自定义指令? 指令是 Vue 提供的一种特殊的属性,用于直接操作 DOM。常见的内置指令包括 `v-model`、`v-show`、`v-if` 等。 要自定义指令,可以通过 `directives` 定义一个对象,包含 `bind`、`inserted`、`update`、`componentUpdated` 和 `unbind` 等钩子函。 ```javascript // 自定义指令 directives: { focus: { inserted(el) { el.focus(); } } } ``` #### 13. Vue 中的 Vuex 是什么?有什么作用? Vuex 是 Vue 官方提供的状态管理模式和库,用于管理应用中的共享状态。它采用集中式存储管理所有组件的状态,并提供了一套规则来保证状态的变化是可以预测的。 - **State**:存储应用的状态。 - **Getters**:从 state 中派生出一些状态。 - **Mutations**:修改 state 的唯一方式,必须是同步函。 - **Actions**:提交 mutations,可以包含异步操作。 - **Modules**:将 store 分割成模块,每个模块拥有自己的 state、getters、mutations、actions。 #### 14. Vue 中的 router 是什么?如何实现路由导航? Vue Router 是 Vue 官方的路由管理器,用于构建单页应用(SPA)。它提供了声明式的路由配置、嵌套路由、动态路由等功能。 要实现路由导航,可以通过 `<router-link>` 组件或编程式导航(`$router.push`、`$router.replace` 等)。 ```html <router-link to="/home">首页</router-link> ``` ```javascript this.$router.push('/about'); ``` #### 15. Vue 中的 Composition API 是什么?有什么优势? Composition API 是 Vue 3 引入的新特性,类似于 React Hook,允许开发者在不使用类组件的情况下,更好地组织和复用逻辑代码。它提供了一系列函(如 `ref`、`reactive`、`watch`、`computed` 等),帮助开发者更灵活地管理组件的状态和逻辑。 - **优势**: - 提高代码的可读性和可维护性。 - 更好的类型推导和支持 TypeScript。 - 更容易复用逻辑代码。 ```javascript import { ref, onMounted } from 'vue'; export default { setup() { const count = ref(0); function increment() { count.value++; } onMounted(() => { console.log('组件已挂载'); }); return { count, increment }; } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涔溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值