本人工做两年,工做跳槽。javascript
今天面试遇到笔试题,发现一道题也没有答上来,特在此对Vue的面试题进行一个汇总,资料来源:网络收集 , 本人面试收集。css
感谢如下连接的做者:html
连接:https://www.jianshu.com/p/c2da05a708b2
连接:https://blog.csdn.net/snshl9db69ccu1aikl9r/article/details/90652219
连接:https://segmentfault.com/a/1190000016434836?utm_source=tag-newest#articleHeader1
连接:https://blog.csdn.net/weixin_39068791/article/details/81363670
连接:https://www.jianshu.com/p/b1dd80f4d542
连接:https://www.cnblogs.com/fozero/p/10863667.html
连接:https://segmentfault.com/a/1190000016344599?utm_source=tag-newestvue
MVVM 是 Model-View-ViewModel 的缩写。MVVM 是一种设计思想。Model 层表明数据模型,也能够在 Model 中定义数据修改和操做的业务逻辑;View 表明 UI 组件,它负责将数据模型转化成 UI 展示出来,ViewModel 是一个同步 View 和 Model 的对象。java
在 MVVM 架构下,View 和 Model 之间并无直接的联系,而是经过 ViewModel 进行交互。面试
我的理解:ajax
MVC和 MVVM 都是一种设计思想。主要就是 MVC 中 Controller 演变成 MVVM 中的 ViewModel。MVVM 主要解决了 MVC 中大量的 DOM 操做使页面渲染性能下降,加载速度变慢,影响用户体验。和当 Model 频繁发生变化,开发者须要主动更新到 View 。vue-router
低耦合、可重用性、独立开发、可组件化。vuex
el: 最外层元素选择器 : '#app'
props: 声明接收父组件哪些属性。
data: 状态数据 (){return{}}
computed: 计算属性:{}
methods: 事件回调函数{}
watch: 监视属性变化{fun}
directives: 注册局部指令Vue.directive('my-directive', function(el, binding){
el.innerHTML = binding.value.toupperCase()
})
filters: 注册局部过滤器 vue.filter()
components: 局部注册组件segmentfault
directives : {
'my-directive' : function (el, binding) {
el.innerHTML = binding.value.toupperCase()
}
}
详情:http://www.javashuo.com/article/p-wkvksxjl-hm.html。
总共分为 8 个阶段建立前/后,载入前/后,更新前/后,销毁前/后。
第一次页面加载会触发哪几个钩子
beforeCreate, created, beforeMount, mounted 这四个钩子。
经常使用的生命周期函数。
beforecreate : 能够在这加个loading事件,在加载实例时触发。
created : 初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用
实际上,Vue的修改数据是到更新视图是异步的。Vue 在修改数据后,视图不会马上更新,而是等同一事件循环中的全部数据变化完成以后,再统一进行视图更新。这时候就要用nextTick监听视图已经更新了,能够对更新好的视图进行操做。
使用场景:
一、点击按钮显示本来以 v-show = false 隐藏起来的输入框,并获取焦点。
showsou(){ this.showit = true //修改 v-show document.getElementById("keywords").focus() //在第一个 tick 里,获取不到输入框,天然也获取不到焦点 }
showsou(){ this.showit = true this.$nextTick(function () { // DOM 更新了 document.getElementById("keywords").focus() }) }
二、使用 swiper 插件经过 ajax 请求图片后的滑动问题。
共同点:
1.二者都是用来控制 DOM元素在View层的显示/隐藏。
不一样点 :
当 Vue 处理指令时,v-for 比 v-if 具备更高的优先级,经过v-if 移动到容器元素,不会再重复遍历列表中的每一个值。取而代之的是,咱们只检查它一次,且不会在 v-if 为否的时候运算 v-for。
全局定义指令:在 vue 对象的 directive 方法里面有两个参数, 一个是指令名称, 另外一个是函数。
组件内定义指令:directives钩子函数: bind(绑定事件出发)、inserted(节点插入时候触发)、update(组件内相关更新)
钩子函数参数: el、binding
方式一:
方式二:
<router-link :to="{ path: '/home' }">Home</router-link>
<router-link :to="{ name: 'Home'}">User</router-link>
component: resolve => require(['@/components/home/home'],resolve)
Vue 框架中状态管理。
步骤:
使用场景:
单页应用中,组件之间的状态。如:音乐播放、登陆状态、加入购物车。
三种
全局导航钩子
router.beforeEach(to, from, next),
router.beforeResolve(to, from, next),
router.afterEach(to, from ,next)
组件内钩子
beforeRouteEnter,
beforeRouteUpdate,
beforeRouteLeave
单独路由独享组件
beforeEnter
v-if(判断是否隐藏)、v-for(把数据遍历出来)、v-bind(绑定属性)、v-model(实现双向绑定)
有 5 种,分别是 state、getter、mutation、action、module
Vuex 就是一个仓库,仓库里放了不少对象。其中 state 就是数据源存放地, Vue 组件从 store 读取数据,如果 store 中的数据发生改变,依赖这项数据的组件也会发生更新它经过 mapState 把全局的 state 和 getters 映射到当前组件的 computed 计算属性。
action 相似于 muation, 不一样在于 : action 提交的是 mutation,而不是直接变动状态action 能够包含任意异步操做。
若是请求来的数据不是要被其余组件公用,仅仅在请求的组件内使用,就不须要放入 vuex 的 action 里。
若是被其余地方复用,请将请求放入 action 里,方便复用,并包装成 promise 返回。
vuex 仅仅是做为 vue 的一个插件而存在,不像 Redux,MobX 等库能够应用于全部框架,vuex 只能使用在 vue 上,很大的程度是由于其高度依赖于 vue 的 computed 依赖检测系统以及其插件系统,vuex 总体思想诞生于 flux,可其的实现方式完彻底全的使用了 vue 自身的响应式设计,依赖监听、依赖收集都属于 vue 对对象 Property set get 方法的代理劫持。
最后一句话结束 vuex 工做原理,vuex 中的 store 本质就是没有 template 的隐藏着的 vue 组件。
在style标签中写入scoped便可 例如:<style scoped></style>
v-if按照条件是否渲染/销毁DOM,v-show用display的block或none控制显示/隐藏。
$route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。而$router是“路由实例”对象包括了路由的跳转方法,钩子函数等。
数据驱动、组件系统。
v-for 、 v-if 、v-bind、v-on、v-show、v-else
prevent: 提交事件再也不重载页面;.stop: 阻止单击事件冒泡;.self: 当事件发生在该元素自己而不是子元素的时候会触发;.capture: 事件侦听,事件发生的时候会调用。
能够。
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。若是数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每一个元素,而且确保它在特定索引下显示已被渲染过的每一个元素。key的做用主要是为了高效的更新虚拟DOM。
在模板中放入太多的逻辑会让模板太重且难以维护,在须要对数据进行复杂处理,且可能屡次使用的状况下,尽可能采起计算属性的方式。好处:①使得数据处理结构清晰;②依赖于数据,数据更新,处理结果自动更新;③计算属性内部this指向vm实例;④在template调用时,直接写计算属性名便可;⑤经常使用的是getter方法,获取数据,也可使用set方法改变数据;⑥相较于methods,无论依赖的数据变不变,methods都会从新计算,可是依赖数据不变的时候computed从缓存中获取,不会从新计算。
优势:Vue 的目标是经过尽量简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好。
在 router 目录下的 index.js 文件中,对 path 属性加上 /:id,使用 router 对象的 params.id 获取。
Vue.use(Vuex) 方法执行的是 install 方法。它实现了 Vue 实例对象的 init 方法封装和注入,使传入的 store 对象被设置到 Vue 上下文环境的store中。所以在VueComponent任意地方都可以经过this.$store 访问到该 store。
在 store 构造方法中有 makeLocalContext 方法,全部 module 都会有一个 local context,根据配置时的 path 进行匹配。
因此执行如 dispatch('submitOrder', payload)这类 action 时,默认的拿到都是 module 的 local state,若是要访问最外层或者是其余 module 的 state,只能从 rootState 按照 path 路径逐步进行访问。
store 初始化时,全部配置的 action 和 mutation 以及 getters 均被封装过。在执行如 dispatch('submitOrder', payload)的时候,actions 中 type 为 submitOrder 的全部处理方法都是被封装后的,其第一个参数为当前的 store 对象,因此可以获取到 { dispatch, commit, state, rootState } 等数据。
Vuex 中修改 state 的惟一渠道就是执行 commit('xx', payload) 方法,其底层经过执行 this._withCommit(fn) 设置_committing 标志变量为 true,而后才能修改 state,修改完毕还须要还原_committing 变量。外部修改虽然可以直接修改 state,可是并无修改_committing 标志位,因此只要 watch 一下 state,state change 时判断是否_committing 值为 true,便可判断修改的合法性。
devtoolPlugin 中提供了此功能。由于 dev 模式下全部的 state change 都会被记录下来,'时空穿梭' 功能其实就是将当前的 state 替换为记录中某个时刻的 state 状态,利用 store.replaceState(targetState) 方法将执行 this._vm.state = state 实现。