Vue面试题

1. Vue.js介绍    

Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API;

Vue.js是一个构建数据驱动的Web界面的库。

Vue.js是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和 Vue生态系统支持的库开发的复杂单页应用。数据驱动+组件化的前端开发。

简而言之:Vue.js是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API实现响应的数据绑定和组合的视图组件。核心是一个响应的数据绑定系统。

2、使用Vue的好处

vue两大特点:响应式编程、组件化

vue的优势:轻量级框架、简单易学、双向数据绑定、组件化、视图、数据和结构的分离、虚拟DOM、运行速度快

3、MVVM定义

MVVM是Model-View-ViewModel的简写。即模型-视图-视图模型。【模型】指的是后端传递的数据。【视图】指的是所看到的页面。【视图模型】mvvm模式的核心,它是连接view和model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。总结:在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信,ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且MVVM中的View 和 ViewModel可以互相通信

4、Vue的生命周期

beforeCreate(创建前) 在数据观测和初始化事件还未开始

created(创建后) 完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来

beforeMount(载入前) 在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。

mounted(载入后) 在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。

beforeUpdate(更新前) 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。

updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。

beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。

destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

5、Vue的响应式原理

当一个Vue实例创建时,vue会遍历data选项的属性,用 Object.defineProperty 将它们转为 getter/setter并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的 watcher 程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。

6、第一次页面加载会触发哪几个钩子?

触发 下面这几个beforeCreate, created, beforeMount, mounted ,并在mounted的时候DOM渲染完成

7、vue中data必须是一个函数

对象为引用类型,当重用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object的实例),引用地址不同,则不会出现这个问题。

8、vue中做数据渲染的时候如何保证将数据原样输出?

v-text:将数据输出到元素内部,如果输出的数据有HTML代码,会作为普通文本输出

v-html:将数据输出到元素内部,如果输出的数据有HTML代码,会被渲染

 {{}}:插值表达式,可以直接获取Vue实例中定义的数据或函数,使用插值表达式的时候,值可能闪烁;而使用v-html、v-text不会闪烁,有值就显示,没值就隐藏

9、active-class是哪个组件的属性?

vue-router模块的router-link组件。

10、vue-router有哪几种导航钩子?

三种。

一种是全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截。

第二种:组件内的钩子;

第三种:单独路由独享组件

11、$route和$router的区别

$route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。而$router是“路由实例”对象包括了路由的跳转方法,钩子函数等

12、vue几种常用的指令

v-for 、 v-if 、v-bind、v-on、v-show、v-else

13、v-if 和 v-show 区别

v-if按照条件是否渲染,v-show是display的block或none

14、vue常用的修饰符?

.prevent: 提交事件不再重载页面;.stop: 阻止单击事件冒泡;.self: 当事件发生在该元素本身而不是子元素的时候会触发;.capture: 事件侦听,事件发生的时候会调用

15、vue-loader是什么?使用它的用途有哪些?

解析.vue文件的一个加载器,跟template/js/style转换成js模块。

用途:js可以写es6、style样式可以scss或less、template可以加jade等

16、computed、watch、methods的区别

computed计算属性是用来声明式的描述一个值依赖了其它的值。当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM。这个功能非常强大,它可以让你的代码更加声明式、数据驱动并且易于维护。

watch监听的是你定义的变量,当你定义的变量的值发生变化时,调用对应的方法。就好在div写一个表达式name,data里写入num和lastname,firstname,在watch里当num的值发生变化时,就会调用num的方法,方法里面的形参对应的是num的新值和旧值,而计算属性computed,计算的是Name依赖的值,它不能计算在data中已经定义过的变量。

methods方法,函数,绑定事件调用;不会使用缓存

17、什么是js的冒泡?Vue中如何阻止冒泡事件?

js冒泡概念:当父元素内多级子元素绑定了同一个事件,js会依次从内往外或者从外往内(?)执行每个元素的该事件,从而引发冒泡

 js解决冒泡:event.stopPropagation()

vue解决冒泡:事件.stop,例如:@click.stop="" ,@mouseover.stop=""

18、vue 组件通信

1.父组件与子组件传值

父组件传给子组件:子组件通过props方法接受数据;

子组件传给父组件:$emit方法传递参数

2.非父子组件间的数据传递,兄弟组件传值

eventBus,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。也可使用vuex

19、<keep-alive></keep-alive>的作用是什么?

<keep-alive></keep-alive>包裹动态组件时,会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染。大白话: 比如有一个列表和一个详情,那么用户就会经常执行打开详情=>返回列表=>打开详情…这样的话列表和详情都是一个频率很高的页面,那么就可以对列表组件使用<keep-alive></keep-alive>进行缓存,这样用户每次返回列表的时候,都能从缓存中快速渲染,而不是重新渲染

20、$nextTick是什么?

vue实现响应式并不是数据发生变化后dom立即变化,而是按照一定的策略来进行dom更新。

$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM

21、Vue子组件调用父组件的方法

第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法

第二种方法是在子组件里用$emit向父组件触发一个事件,父组件监听这个事件就行了。

22、Promise对象是什么?

1.Promise是异步编程的一种解决方案,它是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。promise对象是一个构造函数,用来生成Promise实例;

2.promise的两个特点 对象状态不受外界影响 && 一旦状态改变,就不会再变,任何时候都可以得到结果(pending状态-->fulfilled || pending-->rejected)

23、axios的特点有哪些?

1、axios是一个基于promise的HTTP库,支持promise的所有API;

2、它可以拦截请求和响应;

3、它可以转换请求数据和响应数据,并对响应回来的内容自动转换为json类型的数据;

4、它安全性更高,客户端支持防御XSRF;

24、vue中的 ref 是什么?

ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例。

25、vue如何兼容ie

babel-polyfill插件

26、页面刷新vuex被清空解决办法?

1.localStorage 存储到本地再回去

2.重新获取接口获取数据

27、Vue与Angular以及React的区别?

1.与AngularJS的区别

相同点:

都支持指令:内置指令和自定义指令;都支持过滤器:内置过滤器和自定义过滤器;都支持双向数据绑定;都不支持低端浏览器。

不同点:

AngularJS的学习成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比较简单、直观;在性能上,AngularJS依赖对数据做脏检查,所以Watcher越多越慢;Vue.js使用基于依赖追踪的观察并且使用异步队列更新,所有的数据都是独立触发的。

2.与React的区别

相同点:

React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用;中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;都不内置列数AJAX,Route等功能到核心包,而是以插件的方式加载;在组件开发中都支持mixins的特性。

不同点:

React采用的Virtual DOM会对渲染出来的结果做脏检查;Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作Virtual DOM。

28、localstorage和sessionstorage是什么?区别是什么?

localstorage和sessionstorage一样都是用来存储客户端临时信息的对象,他们均只能存储字符串类型对象

localstorage生命周期是永久的,这意味着除非用户在浏览器提供的UI上清除localstorage信息,否则这些信息将永远存在。

sessionstorage生命周期为当前窗口或标签,一旦窗口或标签被永久关闭了,那么所有通过sessionstorage存储的数据也将被清空。

不同浏览器无法共享localstorage或sessionstorage中的信息。相同浏览器的不同页面可以共享相同的localstorage(页面属于相同的域名和端口),但是不同页面或标签间无法共享sessionstorage。这里需要注意的是,页面及标签仅指顶级窗口,如果一个标签页包含多个iframe标签他们属于同源页面,那么他们之间是可以共享sessionstorage的。

29、为什么要进行前后端分离?前后端分离的优势在哪里?劣势在哪里?

优点:前端专门负责前端页面和特效的编写,后端专门负责后端业务逻辑的处理,前端追求的是页面美观、页面流畅、页面兼容等。后端追求的是三高(高并发、高可用、高性能)让他们各自负责各自的领域,让专业的人负责处理专业的事情,提高开发效率

缺点:1 、当接口发生改变的时候,前后端都需要改变

           2、 当发生异常的时候,前后端需要联调--联调是非常浪费时间的

### 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 }; } }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值