vue面试题整理

一:什么是MVVMcss

MVVM是是Model-View-ViewModel的缩写,Model表明数据模型,定义数据操做的业务逻辑,View表明视图层,负责将数据模型渲染到页面上,ViewModel经过双向绑定把View和Model进行同步交互,不须要手动操做DOM的一种设计思想。vue

二:MVVM和MVC区别?和其余框架(jquery)区别?那些场景适用?node

MVVM和MVC都是一种设计思想,主要就是MVC中的Controller演变成ViewModel,,MVVM主要经过数据来显示视图层而不是操做节点,解决了MVC中大量的DOM操做使页面渲染性能下降,加载速度慢,影响用户体验问题。主要用于数据操做比较多的场景。react

三:Vue的优缺点是什么jquery

优势:低耦合,可重用性,独立开发,可测试,渐进式webpack

缺点:不利于SEO,社区维护力度不强,相比还不够成熟ios

三:组件之间传值es6

父向子传值:属性传值,父组件经过给子组件标签上定义属性,子组件经过props方法接收数据;web

子向父传值:事件传值,子组件经过$emit(‘自定义事件名’,值),父组件经过子组件上的@自定义事件名=“函数”接收vuex

非父子组件传值:全局定义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,第二个参数是新值

相关文章
相关标签/搜索