面试题总结:https://segmentfault.com/a/11...那么先说说你对Vue的理解?什么是vue.js?Vue(读作/vju?/,类似于视图)是一个用于构建用户界面的渐进式框架。与其他大型框架不同,Vue被设计为自下而上逐层应用。Vue的核心库只专注于视图层,不仅易于使用,而且易于与第三方库或现有项目集成。另一方面,当与现代工具链和各种支持库相结合时,Vue也完全有能力为复杂的单页应用程序提供支持。Vue是一个渐进式框架,相当于视图层,双向数据绑定,它更轻量,性能更高效,比其他框架更容易上手,学习成本低,Vue需要一个el对象来实例化,Vue和Angular和与React的区别?Angular是一个mvvm框架,而vue是一个渐进式框架,相当于view层,有双向数据绑定,但是angular中的双向数据绑定是基于dirtycheck机制,双向vue中的databinding是基于ES5Getter和setter来实现的,而angular有自己的一套模板编译规则的实现,vue比angular更轻量,性能更高效,比angular更易用,学习成本低,vue需要一个el对象来实例化,Angular是整个html页面下的单页应用,vue可以有一个vue实例1。和AngularJS的区别是一样的:都支持指令:内置指令和自定义指令;都支持过滤器:内置过滤器和自定义过滤器;都支持双向数据绑定;都不支持低端浏览器。区别:AngularJS学习成本高,比如加入了DependencyInjection特性,而Vue.js本身提供的API相对简单直观;在性能方面,AngularJS依赖于对数据的脏检查,所以Watcher越多越慢;Vue.js使用基于观察的依赖跟踪并使用异步队列更新,所有数据都是独立触发的。2、和React的区别是一样的:React使用了特殊的JSX语法,Vue.js也推荐在组件开发中写成.vue特殊文件格式。文件内容有一些约定,都需要编译使用;中心思想相同:一切皆组件,组件实例可以嵌套;它们都提供了合理的钩子函数,允许开发者自定义和处理需求;核心包中不包含AJAX、Route等功能,而是以插件的形式使用Loading;组件开发支持mixin的特性。区别:React使用的VirtualDOM会对渲染结果进行脏检查;Vue.js在模板中提供了指令、过滤器等,可以非常方便快捷的操作VirtualDOM。vue的生命周期?一个实例从创建到销毁的过程就是生命周期。即从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称之为Vue的生命周期。应用场景beforeCreate:新建一个vue实例后,只有一些默认的生命周期钩子和默认事件,其他的还没有创建。beforeCreate生命周期执行时,data和methods中的数据还没有初始化。data中的数据和methods中create的方法在这个阶段是不能使用的:data和methods都已经初始化了。如果想调用methods中的方法或者操作data中的数据,最早可以在这个阶段操作beforeMount:这个hook执行的时候,模板已经编译到内存中,但是还没有挂载到页面上.这个时候页面还是挂载的:当这个钩子执行的时候,就说明Vue实例已经初始化完成了。.此时,组件离开创建阶段,进入运行阶段。如果我们想通过插件来操作页面上的DOM节点,最早可以在这个阶段执行beforeUpdate:执行这个hook时,页面显示的数据还是旧的,更新data中的数据,并且页面还是没有同步最新的数据Updated:页面显示的数据和data中的数据已经同步,都是最新的beforeDestory:Vue实例从运行阶段进入了销毁阶段。这时,所有的数据和方法、指令、过滤器……都处于活动状态。没有真正销毁销毁:此时所有的数据和方法、指令、过滤器……都处于不可用状态。组件已被销毁。vue生命周期的作用是什么?它的生命周期中有多个事件钩子,方便我们在控制整个Vue实例的进程时形成良好的逻辑。vue生命周期有几个阶段?总共可以分为8个阶段:创建前/后、加载前/后、更新前/后、销毁前/后,第一个页面加载会触发哪些hooks?BeforeCreate、created、beforeMount、mountedvue在哪个循环函数中获取数据?一般可以用created/beforeMount/mounted。比如你要操作DOM,就必须挂载。什么是mvvm框架?Vue是一个实现双向数据绑定的mvvm框架。当视图改变时,模型层更新,当模型层改变时,视图层更新。在Vue中,使用了双向绑定技术,即View的改变可以实时改变Model,Model的改变也可以实时更新到View。Vue中如何实现双向数据绑定?Vue双向数据绑定是通过数据劫持结合发布订阅模式实现的,也就是说数据和视图是同步的,数据变了,视图变了,视图变了,数据也变了;核心:关于VUE双向Data绑定,其核心是Object.defineProperty()方法。Vue是如何实现响应式数据的?(响应式数据原理)?参考:https://blog.csdn.net/kzj0916...原理:相信用过vue的都知道,vue中data中定义的数据会随着我们传递方法而改变数据同时,页面上的相关数据也会相应刷新,实现响应式数据。但是你知道它是怎么做到的吗?让我们来看看它是如何发挥这种魔力的。Object.defineProperty监听、修改和读取数据:Object.defineProperty(obj,prop,descriptor)可以传入三个值,它的作用是这个方法会直接在一个对象上定义一个新的属性,或者修改一个对象已有的属性,并返回这个对象。第一个值传递给要修改的对象,第二个值传递给对象中要修改的键,第三个值是一个对象,有set和get两种方法。Set是修改值时完成的操作。get读取和修改值的默认配置如下现在我们来研究一下Vue是如何使用Object.defineProperty来监控和修改读取数据的。我们创建一个对象,使用Object.keys()将对象中的key返回一个数组,遍历数组forEach先得到key对应的值,通过Object.defineProperty修改这个对象中每个不同的key并监听data的变化,当修改key对应的value时,调用set方法打印Monitorxxxxdatachanges并将修改后的值赋值给value。读取key对应的value时,调用get方法打印xxxx对应的value,直接返回当前值。Vue如何检测数组变化?vue.set()vue组件中的数据为什么是一个函数?由于JavaScript的特性,在组件中,数据必须以函数的形式存在,而不是对象。构建中的数据写成一个函数,将数据定义为函数返回值的形式,这样每次组件被复用时,都会返回一个新的数据,也就是说每个组件实例都有自己的私有数据空间,他们只对自己维护的数据负责,不会造成混乱。并且简单的写成一个对象的形式,即所有的组件实例共享同一个数据,换一个就换所有。分别简单描述一下computed和watch的使用场景?答案:computed: 当一个属性被多个属性影响时,需要使用computed 。: 当一条数据影响多条数据时,需要使用watch 栗子:searchdatacreated和mounted的区别?created:在模板渲染成html之前调用,即通常初始化一些属性值,然后渲染到视图中。mounted:模板渲染成html后调用,一般是初始化页面完成后调用,然后在html的dom节点上进行一些需要的操作。vue-router的两种模式?哈希模式:地址栏中URL中的#符号;history模式:打印出window.history对象,可以看到里面提供的方法和记录长度。利用HTML5历史界面中新的pushState()和replaceState()方法。(需要特定的浏览器支持)。参数和查询有什么区别?使用方法:query需要通过path引入,params需要通过name引入。接收参数类似,就是this.$route.query.name和this.$route.params.name。url地址显示:query更类似于我们ajax中的get参数,params类似于post。简单来说,前者在浏览器地址栏显示参数,后者不显示。注意:queryrefresh不会丢失刷新query中的data和params会丢失params中的数据。//查询语法:this.$router.push({path:"address",query:{id:"123"}});//这是传参this.$route.query.id;//这是接受参数//params语法:this.$router.push({name:"address",params:{id:"123"}});//这是传参this.$route.params.id;//这是在接受参数的组件之间传递值吗?父亲传给儿子:道具传给儿子传给父亲:$emit方法$nextTick用法?当修改data的值,立即获取dom元素的值时,无法获取更新后的值,需要使用$nextTick回调,只有将修改后的data值渲染更新到dom元素后,才能获取取回成功。//修改数据vm.msg='Hello'//DOM未更新Vue.nextTick(function(){//DOMupdate})
