-

Vue.js前端工程师常见的面试题

WEB前端

上半年换工作求职前端开发工程师(主要还是偏Vue.js)的时候,有一些互联网公司给了面试邀请,发现很多公司面试的知识点都大同小异。但是很多求职者平时开发都是没问题,能力也不错,可是再答一些面试题总是知道却说不清或者写不出来,往往面试发挥的不好。包括自己也是,在刚几次面试后就不断总结一些面试题,如今已经入职了心仪的公司。下面雷雪松给大家分享总结的Vue前端工程师常见的面试题。

对于MVVM的理解?
MVVM 是 Model-View-ViewModel 的缩写。
Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。
View 代表视图,它负责将数据模型转化成视图展现出来。
ViewModel 虚拟模型,监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和 Model的对象,连接Model和View。
在MVVM架构下,View 和 Model都是通过ViewModel进行交互,iewModel 通过双向数据绑定把 View 层和 Model 层连接了起来。View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。View 和 Model之间的同步是程序自动处理的,因此开发者只需关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

Vue实现数据双向绑定的原理?
Object.defineProperty()。Vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
具体步骤:
第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter和getter
这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化

第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图

第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:
1、在自身实例化时往属性订阅器(dep)里面添加自己
2、自身必须有一个update()方法
3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。

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

Vue的生命周期?
beforeCreate(创建前) 在数据观测和初始化事件还未开始
created(创建后) 完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来
beforeMount(载入前) 在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。
mounted(载入后) 在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染。一般在这里进行数据的处理,接口请求。
beforeUpdate(更新前) 在数据更新之前调用,可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。
updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染之后调用。在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。
beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。
destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

Vue.js 的优点是什么?
Vue.js性能好,非常容易优化。
Vue.js体积小,包含了 Vuex + Vue Router 的 Vue 项目 (gzip 之后 30kB) 。
Vue.js更加灵活,Vue 官方提供了构建工具来协助你构建项目,但它并不限制你去如何组织你的应用代码。
Vue.js容易上手。要学习 Vue,你只需要有良好的 HTML 和 JavaScript 基础,API也比较少。
Vue.js生态系统丰富,很多开源组件和UI框架。

Vue.js的template模板编译的理解?
简而言之,就是先转化成AST树,再得到的render函数返回VNode(Vue的虚拟DOM节点)
首先,通过compile编译器把template编译成AST语法树(abstract syntax tree 即 源代码的抽象语法结构的树状表现形式),compile是createCompiler的返回值,createCompiler是用以创建编译器的。另外compile还负责合并option。
然后,AST会经过generate(将AST语法树转化成render funtion字符串的过程)得到render函数,render的返回值是VNode,VNode是Vue的虚拟DOM节点,里面有(标签名、子节点、文本等等)

Vue.js常用指令?
v-model、v-class、v-for、v-if、v-show、v-on。

Vue.js常用修饰符有哪几类?
事件修饰符、按键修饰符、系统修饰符和鼠标按钮修饰符。

Vue.js常用事件修饰符有那些?
.stop: 阻止单击事件继续传播
.prevent:提交事件不再重载页面
.capture :即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理
.self:只当在 event.target 是当前元素自身时触发处理函数
.once:点击事件将只会触发一次

Vue组件间的参数传递
1.父组件与子组件传值
父组件传给子组件:子组件通过props方法接受数据;
子组件传给父组件:$emit方法传递参数
2.非父子组件间的数据传递,兄弟组件传值
eventBus或者使用store来做状态管理,eventBus项目比较小比较合适。

如何让Vue组件中css只在当前组件起作用?
在style标签中写入scoped即可
[cc lang=”html” escaped=”true”]
<style scoped></style>
[/cc]

v-if 和 v-show 区别?
v-if按照条件是否渲染,v-show是display的block或none;

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

keep-alive的作用是什么?
keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。include和exclude都支持”,”分割字符串、数组或正则表达式,include表示只有名称匹配的组件会被缓存。

router-view组件的作用?
router-view可以实现嵌套路由。如果不想跳转到新页面,只在当前页面切换着显示,router-view组件就非常适合。可以配合 和 使用。如果两个结合一起用,要确保在内层使用 :

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

vue-router路由之间跳转?
1、使用 创建 a 标签来定义导航链接
2、编程式导航 router.push(‘index’)等等

vue路由的钩子函数有哪些?
beforeEach,afterEach等,一般用于页面title标题的修改或者登陆的全局验证。
beforeEach主要有3个参数to,from,next:
to:route即将进入的目标路由对象,
from:route当前导航正要离开的路由
next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。

vuex是什么?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。状态改变使用同步的mutations提交,异步操作请使用actionti,Action 提交的是mutation,而不是直接变更状态。
state
Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。
mutations
mutations定义的方法动态修改Vuex 的 store 中的状态或数据。
getters
类似vue的计算属性,主要用来过滤一些数据。
action
actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。

Vue.js UI组件库用过哪些?
这个结合自己的个人情况。比如ElementUI、IView、Vant等UI组件库。可以看一下雷雪松的博客这篇文章《强烈推荐优秀的Vue UI组件库》

来源:Vue.js前端工程师常见的面试题

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注