vue面试题整理
一:什么是MVVM
MVVM是是Model-View-ViewModel的缩写,Model代表数据模型,定义数据操作的业务逻辑,View代表视图层,负责将数据模型渲染到页面上,ViewModel通过双向绑定把View和Model进行同步交互,不需要手动操作DOM的一种设计思想。
二:MVVM和MVC区别?和其他框架(jquery)区别?那些场景适用?
MVVM和MVC都是一种设计思想,主要就是MVC中的Controller演变成ViewModel,,MVVM主要通过数据来显示视图层而不是操作节点,解决了MVC中大量的DOM操作使页面渲染性能降低,加载速度慢,影响用户体验问题。主要用于数据操作比较多的场景。
三:Vue的优缺点是什么
优点:低耦合,可重用性,独立开发,可测试,渐进式
缺点:不利于SEO,社区维护力度不强,相比还不够成熟
三:组件之间传值
父向子传值:属性传值,父组件通过给子组件标签上定义属性,子组件通过props方法接收数据;
子向父传值:事件传值,子组件通过$emit(‘自定义事件名’,值),父组件通过子组件上的@自定义事件名=“函数”接收
非父子组件传值:全局定义bus,var bus=new Vue() ; 发送者, bus.$emit(‘自定义名’,值) ;接受者,bus.$on(‘自定义名’,(值)=>{})
四:路由之间传参
路由字典中:routes={path:’/detail/:id’,component:Detail}
标签中:<router-link :to=”‘/detail/’+item.id ”>
Js中:this.$route.params.id
五:axios的特点和使用
特点:基于promise的Http库,支持promise的所有API,用来请求和响应数据的,而且对响应回来的数据自动转化为json类型,安全性较高,客户端支持防御XRSF(跨站请求伪造),默认不携带cookie;
使用:下载包后引入 import axios from ‘axios’ , 让其携带cookie ,axios.defaults.withCredentials=true, 然后添加到prototype中,Vue.prototype.$axios=axios ,组建中不用引入直接使用this.$axios.get(url,{params:{id:1}})。
六:Vuex是什么?怎么使用?用于哪些场景?
Vuex是框架中状态管理;新建目录store...export,然后main.js引入store再注入到vue实例中;用于购物车,登录状态,单页应用等。
七:Vuex有哪几种属性?
五种:state,action,mutation,getter,module
State:数据源存放地,数据是响应式的
Action: 逻辑处理,提交的是mutation,包含任意异步操作
Mutation: 修改state里的公共数据
Getter: 相当于计算属性,可以复用,可缓存
Module: 模块化
八:Vuex取值
This.$store.state.city
This.$store.commit(‘getData’)
this.$store.dispath(‘getData’)
This.$store.getters.getData
九:不使用vuex会带来什么问题?
可维护性下降,可读性下降,增加耦合
十:v-show和v-if指令的共同点和不同点
V-show指令是通过修改元素的display的css样式使其显示隐藏
V-if指令是销毁和重建DOM达到让元素显示隐藏
十一:如何让css只在当前组件中起作用?
将当前组件的<style>修改为<style scoped>
十二:<keep-alive></keep-alive>的作用是什么,如何使用?
包裹动态组件时,会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染;
使用:简单页面时
缓存: <keep-alive include=”组件名”></keep-alive>
不缓存:<keep-alive exclude=”组件名”></keep-alive>
使用:复杂项目时
路由字典中定义{path:’/detail’,meta:{keepAlive:false/true}} 是否缓存
根目录中:
<keep-alive><router-view v-if=”$route.meta.keepAlive”></router-view></keep-alive>
<keep-alive><router-view v-if=” ! $route.meta.keepAlive”></router-view></keep-alive>
十三:Vue数据双向绑定原理
Vue数据双向绑定是通过数据劫持结合发布者-订阅者模式方式来实现的,语法主要有{{}}和v-model。首先用递归方法遍历所有的属性值,再用Object.defineProperty()给属性绑定getter和setter方法添加一个observe(val)监听器对数据进行劫持监听;然后创建一个订阅器来在getter里收集订阅者并创建和绑定watcher,如果数据变化,订阅者就会执行自己对应的更新函数;watcher就是在自身实例化的时候往订阅器里添加自己,自身必须有一个update的数据,是监听器和模板渲染的通信桥梁;最后创建解析模板指令compile,替换数据,初始化视图。最终observer来监听自己的model数据变化通过compile解析编译模板指令,利用watcher搭起observer和compile之间的通信桥梁,达到数据变化->视图更新双向绑定效果。
十四:Vue生命周期
vue生命周期就是从开始创建,初始化数据,编译模板,挂载DOM,渲染->更新->渲染,销毁等一系列过程。生命周期钩子如下:
组件实例周期:
BeforeCreate:实例初始化后,无法访问方法和数据;
Created:实例创建完成,可访问数据和方法,注意,假如有某些数据必须获取才允许进入页面的话,并不适合;
beforeMonut:挂载DOM之前
Mounted :el被新创建的vm.$el替换,可获取dom,改变data,注意,beforeRouterEnter的next的钩子比mountend触发靠后;
beforeUpdate:数据更新时调用,发生在虚拟DOM重新渲染前;
Updated:数据更改后,可以执行依赖于DOM的操作,注意,应该避免在此期间更改状态,可能会导致更新无限循环;
beforeDestroy:实例销毁之前,这一步还可以用this获取实例,一般在这一步做重置操作,比如清定时器监听dom事件;
Destroyed:实例销毁后,会解除绑定,移除监听。
十五:路由钩子
全局路由钩子:
Router.beforeEach((to,from,next)=>{... next()})
注意:一定要调用next(),否则页面卡在那,一般用于对路由跳转前进行拦截,参数:
To:即将要进入的目标路由对象 From:当前导航正要离开的路由
Next():跳转下一个页面 next(‘/path’):跳转指定路由
Next(false):返回原来页面 next((vm)=>{}):且在beforeRouterEnter用
比如根据登录状态跳转页面判断(to.name->name是路由名)
Router.beforeEach(function(to,from,next){if(to.name==’login’){..}next();})
Router.afterEach((to,from)=>{}) 跳转后调用没有next方法
组件路有钩子:
beforeRouteEnter(to,from,next){next(vm=>{...})} 路由跳转时
注意:此钩子在beforeCreate之前执行,但是next在组件mounted周期之后,无法直接调用this访问组件实例,可用next访问vm实例,修改数据;
beforeRouteLeave(to,from,next){...next()} 离开路由时
注意:可以直接访问this,next不可回调
beforeRouteUpdate 路由切换时
十六:指令周期
Bind:一次初始化调用 inserted:被绑定元素插入父节点调用
Update:模板更新调用 unbind:指令与元素解绑时
Vue.nextTick:在dom更新后执行,一般用于dom操作
Vue.$nextTick:一直到真实的dom渲染结束后执行
Ex:created(){this.$nextTick(()=>{...})}
十七:生命周期的作用是什么?
它的生命周期有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。
十八:第一次加载会触发哪几个钩子?
会触发beforeCreate , created ,beforeMount ,mounted
十九:说出至少4种vue当中的指令和用法?
V-if:判断是否隐藏 v-for:数据循环 v-bind:绑定属性
v-model:双向绑定 v-is:动态组件特殊特性 v-on:事件绑定
二十:vue-loader是什么?用途有哪些?
是解析vue文件的一个加载器,用途是js可以写es6,style样式可以scss或less,template可以加jade
二十一:active-class是那个组件属性?
Vue-router模块的router-link组件,设置激活时样式
二十二:vue中使用插件的步骤是什么?
Import ... from ... 引入插件,Vue.use(...)全局注册
二十三:为什么使用key?
当有相同标签名和元素切换时,需要通过key特性设置唯一的值来标记让vue区分它们,否则vue为了效率只会替换相同标签内部的内容
二十三:为什么避免v-if和v-for用在一起?
当vue处理指令时,v-for比v-if具有更高的优先级,通过v-if移动到容器的元素,不会在重复遍历列表中的每个值,取而代之的是,我们只检查它一次,且不会v-if为否的时候运算v-for
二十四:VNode是什么?虚拟DOM是什么?
Vue在页面上渲染的节点,及其子节点称为虚拟节点,简称VNode;虚拟DOM时由组件树建立起来的整个VNode树的称呼
二十五:scss是什么?有哪些特性?怎么使用?
是css的预编译,特新有可以用变量($变量名=值),可以用混合器(),可以嵌套,可以继承,可以运算,安装先装css-loader,node-loader,sass-loader,在webpack.base配置,style标签上加lang=”scss”
二十五:Vue router如何实现跳转
<router-link></router-link> router.push(‘/’) router.go(0)
二十六:vue router跳转和location.href有什么区别?
Router是hash改变;location.href是页面跳转,刷新页面
二十七:v-model原理
<input v-model="sth">
==相当于通过oninput(用户输入时触发)把表单值给到变量
<input v-bind:value="sth" v-on:input="sth=$event.target.value">
二十八:vue的template的理解
通过compile编译template生成AST语法树,AST语法树经过generate转化为render function字符串后返回虚拟DOM节点(Vnode)的过程
二十九:vue和react区别
相同点:
都鼓励组件化,都有’props’的概念,都有自己的构建工具,Reat与Vue只有框架的骨架,其他的功能如路由、状态管理等是框架分离的组件。
不同点:
React:数据流单向,语法—JSX,在React中你需要使用setState()方法去更新状态
Vue:数据双向绑定,语法--HTML,state对象并不是必须的,数据由data属性在Vue对象中进行管理。适用于小型应用,但对于对于大型应用而言不太适合。
三十:单页面和多页面的区别
单页面:
整个项目中只有一个完整的HTML页面,其它"页面"只是一段HTML片断而已
优: 请求少
缺: 不利于搜索引擎优化
页面跳转本质:把当前DOM树中某个DIV删除,下载并挂载另一个div片断
多页面:
项目中有多个独立的完整的HTML页面
缺: 请求次数多,效率低
页面跳转本质:
删除旧的DOM树,重新下载新的DOM树
三十一:Vue的SPA如何优化加载速度
减少入口文件体积,静态资源本地缓存,开启Gzip压缩,使用SSR,nuxt.js
三十二:Axios发送post请求
Import qs from ‘qs’
Var data=qs.stringify({
Number : ’1’
})
Axios.post(url,data).then()
VUE如何自定义属性
全局自定义:
Vue.directive(‘focus’,{
Inserted:function(el){
el.focus() //聚焦函数
}
})
三十三:组件自定义
directive{
inserted:function(el){
el.focus()
}
}
三十四:Vue和vuex 有什么区别
Vue是框架,vuex是插件,vuex是专门为vue应用程序开发的状态管理模式
三十五:.Vuex中actions和mutations的区别
Mutations的更改是同步更改,用于用户执行直接数据更改,this.$store.commit(‘名’)触发
Actions的更改是异步操作,用于需要与后端交互的数据更改,this.$store.dispath(“名”)触发
注意:
1):定义actions方法创建一个更改函数时,这个函数必须携带一个context参数,用于触发mutations方法,context.commit(‘修改函数名’ , ’异步请求值’);
2):mutations第一个参数必须传入state,第二个参数是新值