vue面试题积累

Vue面试题整理

一,对于mvvm的理解?

mvvm是Model-View-ViewModel的缩写

Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑

View表示视图层,代表UI组件,也就是网页呈现给用户的部分,网页有写死的部分不会通过数据动态更新,也有一部分是根据数据更新的。更新的数据就是从model层获取到。它负责将数据模型转化成UI展现出来

ViewModel监听模型数据的改变和控制视图行为,处理用户交互,简单理解就是一个同步View和Model的对象,连接Model和View.

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

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

二,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销毁后:在实例毁掉之后调用,调用后,所有的事件监听器都会被移除,所有的子实例也会被销毁。该狗子在服务器端渲染期间不被调用。

1.什么是生命周期?

Vue实例从挂载到销毁的过程就是生命周期。从开始创建,初始化数据,编译模板,挂载DOM-渲染,更新-渲染。销毁等一系列过程,称之为Vue的生命周期

2.Vue生命周期的作用是什么?

它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。

3.Vue生命周期总共有几个阶段

八个阶段 创建前后 载入前后 更新前后 销毁前后

4.第一次页面加载会触发哪几个钩子

beforeCreate,created,beforeMount,mounted

5.DOM渲染在哪个周期中就已经完成

DOM渲染在mounted中就已经完成

三 Vue实现数据双向绑定的原理:Object.defineProperty()

Vue实现数据双向绑定主要是:用数据劫持结合发布者-订阅者模式,来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。

vue的数据双向绑定 将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 { {}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。

四。Vue组件间的参数传递。

1.父子组件之间的相互传值

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

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

2.兄弟组件传值。

eventBus 就是创建一个事件中心,相当于中转站,可以用它来传递事件和接受事件,项目比较小时候合适。

五.Vue的路由实现,hash模式和history模式

hash模式在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash读取;

特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,hash不会重加载页面。

hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 ,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。

history模式:history采用HTML5的新特性;且提供了两个新方法:pushState(),replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如 :http://www.xxx.com/items/id。后端如果缺少对 /items/id 的路由处理,将返回 404 错误。Vue-Router 官网里如此描述:“不过这种模式要玩好,还需要后台配置支持……所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。”

六.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。

七.Vue路由的钩子函数

首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改。一些需要登录才能调整页面的重定向功能。

beforeEach 主要有三个参数to from,next

to:route即将进入的目标路由对象。

from:route当前导航正要离开的路由

next:function一定要调用该方法resolve这个钩子 执行效果依赖于next方法的调用参数。可以控制网页的跳转。

八.Vuex是什么?怎么使用?那种功能场景使用它?

Vuex是为Vue.js应用程序提供的一套状态管理工具,使用了集中式管理的模式,对应用内所有组件的状态进行管理。

应用场景:音乐播放,登录状态,加入购物车

Vuex中store的核心属性

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特性
改变store中state状态的唯一方法就是提交mutation,就很类似事件。
每个mutation都有一个字符串类型的事件类型和一个回调函数,我们需要改变state的值就要在回调函数中改变。
我们要执行这个回调函数,那么我们需要执行一个相应的调用方法:store.commit。

Action 类似于 mutation,不同在于:Action 提交的是 mutation,而不是直接变更状态;
Action 可以包含任意异步操作,Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,
因此你可以调用 context.commit 提交一个 mutation,
或者通过 context.state 和 context.getters 来获取 state 和 getters。
Action 通过 store.dispatch 方法触发:eg。
store.dispatch('increment')

vuex的module特性
Module其实只是解决了当state中很复杂臃肿的时候,module可以将store分割成模块,
每个模块中拥有自己的state、mutation、action和getter

九。对keep-alive的了解

keep-alive是vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

在Vue2.1.0版本以后,keep-alive新加入了两个属性,include(包含的组件缓存)与exclude(排除的组件不缓存,优先级大于include)。

参数解释:

include-字符串或正则表达式,只有名称匹配的组件会被缓存

exclude-字符串或正则表达式,任何名称匹配的组件都不会被缓存

include和exclude的属性允许组件有条件的缓存。二者都可以用“,”分割字符串,正则表达式,数组。当使用正则或者是数组时,要记得使用v-bind

十。一句话面试

css只在当前组件起作用。

​ 在style标签中写入scoped

v-if和v-show的区别

v-if按照条件是否渲染DOM元素,v-show十display的block或者none

r o u t e 和 route和 routerouter的区别

$route十路由信息对象 包括path,params,hash,query fullPath matched name等路由信息参数,

$router十路由实例,对象包括了路由的跳转方法,钩子函数

vue.js的两个核心是什么?

数据驱动组件系统。

vue常用指令

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

vue常用的修饰符?

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

v-on可以绑定多个方法
vue中的key值的作用?

当Vue.js用v-for正在更新已渲染过的元素列表时,它默认用“就地复用策略。如果数据项的顺序被改变,Vue将不会移动DOM元素来匹配数据项的顺序,而是简单服用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。

什么是vue的计算属性

答:在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。好处:①使得数据处理结构清晰;②依赖于数据,数据更新,处理结果自动更新;③计算属性内部this指向vm实例;④在template调用时,直接写计算属性名即可;⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算。

vue等单页面应用及其优缺点

优点:Vue的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统,MVVM,数据驱动,组件化,轻量,简介高效快速模块友好

缺点:不支持低版本的浏览器,最低只支持IE9 不利于SEO的优化(如果要支持SEO建议通过服务器端来进行渲染组件)第一次加载首页耗时相对长一些;不可能使用浏览器的导航按钮需要自行实现前进,后退。

怎么定义vue-router的动态路由?怎么获取传过来的值

在router目录下的index.js文件中,对path属性加上:/id 使用router中的params.id获取

十一 路由跳转方式

1.router-link标签会渲染为标签,或者通过js跳转比如router.push

十二.Computed和watch有什么区别

computed

computed是计算属性,也就是计算值,它更多用于计算值的场景

computed具有缓存性,computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变以后下次获取computed的值时重新调用的getter来计算。

computed适用于计算比较消耗性能的计算场景。

watch

watch更多的是观察的作用,类似于某些数据的监听回调,用于观察props $emit或者本组件的值,当数据变化时来执行回调进行后续操作

无缓存行,页面重新渲染时值不变化也会执行

怎么选择:

当我们要进行数值计算,而且依赖于其他数据,那么把这个数据设计为computed。

如果你需要在某个数据变化时做一些事情,使用watch来观察这个数据变化。

十三.Vue组件中scoped属性的作用

表示样式只能作用于当下的模块,很好的实现了样式私有化的目的

但是也得慎用,样式不易修改,而很多时候我们是需要对公众组件的样式进行微调

解决方式

①:使用混合型的css样式:(混合使用全局跟本地的样式)

十五:渐进式框架的理解:主张最少没有多做职责以外的事

主张最少指的是对使用者的要求比较低,没有多做职责之外的事。是不是相当于你写代码就按照需求写好代码部分,不用过多操作代码之外的事情。
自底向上:就是按照字面意思,先写好底层,然后逐层向上写,就像盖楼一样,打好地基,然后再开始向上盖楼,Vue自底向上也是一样,对高层的样式等进行渲染,编写。

十六:v-on可以监听多个方法吗

可以

一个元素绑定多个事件的两种写法,一个事件绑定多个函数的两种写法,修饰符的使用。

<a style="cursor:default" v-on='{click:DoSomething,mouseleave:MouseLeave}'>doSomething</a>

十七:vue组件中的data为什么必须是函数

vue组件中data的值不能为对象,因为对象是引用类型,组件可能会被多个实例同时引用。如果data值为对象,将导致多个实例共享一个对象,其中一个组件改变data属性值,其他实例也会受到影响。

十八:webpack的编译原理

webpack的作用:

依赖管理:方便引用第三方模块,让模块更容易复用,避免全局注入导致的冲突,避免重复加载或加载不需要的模块。会一层一层的读取依赖的模块,添加不同的入口同时不会重复打包依赖的模块。

合并代码:把各个分散的模块集中打包成大文件减少http的请求连接数,配合UglifyJS

**一句话总结:**webpack 的作用就是处理依赖,模块化,打包压缩文件,管理插件。
一切皆为模块,由于webpack只支持js文件,所以需要用loader 转换为webpack支持的模块,其中plugin 用于扩张webpack 的功能,在webpack构建生命周期的过程中,在合适的时机做了合适的事情。

webpack怎么工作的过程

①解析配置参数,合并从shell(npm install 类似的命令)和webpack.config.js文件的配置信息,输出最终的配置信息;
②注册配置中的插件,让插件监听webpack构建生命周期中的事件节点,做出对应的反应;
③解析配置文件中的entry入口文件,并找出每个文件依赖的文件,递归下去;
④在递归每个文件的过程中,根据文件类型和配置文件中的loader找出对应的loader对文件进行转换;
⑤递归结束后得到每个文件最终的结果,根据entry 配置生成代码chunk(打包之后的名字);
⑥输出所以chunk 到文件系统。

十九 完整的vue-router导航解析流程

1.导航被触发;
2.在失活的组件里调用beforeRouteLeave守卫;
3.调用全局beforeEach守卫;
4.在复用组件里调用beforeRouteUpdate守卫;
5.调用路由配置里的beforeEnter守卫;
6.解析异步路由组件;
7.在被激活的组件里调用beforeRouteEnter守卫;
8.调用全局beforeResolve守卫;
9.导航被确认;
10…调用全局的afterEach钩子;
11.DOM更新;
12.用创建好的实例调用beforeRouteEnter守卫中传给next的回调函数。

二十:params和query的区别

用法:query要用path引入,params要用name来引入,接受参数都是类似的,分别是

this. r o u t e . q u e r y , n a m e 和 t h i s . route.query,name和this. route.query,namethis.route.params.name

url地址:query类似于get,params类似于post 前者刷新后不会丢失 后者会丢失

二十一 vue更新数组时触发视图更新的方法

push() pop() shift() unshift() splice() sort() reverse()

猜你喜欢

转载自blog.csdn.net/qq_40629046/article/details/109703569