当前位置: 首页 > Web前端 > vue.js

Vue面试总结

时间:2023-03-31 16:07:47 vue.js

面试题总结: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})的作用是什么?keep-alive是Vue的内置组件,可以保持被包含的组件状态,或者避免重新渲染。为什么要用钥匙?需要用一个key来唯一标识每个节点,Diff算法才能正确识别这个节点。主要功能是高效更新虚拟DOM。v-show和v-if指令之间的异同是什么?它们的共同点:可以控制元素的显示和隐藏;区别:实现方式不同。v-show的本质是将css中的显示设置为none,控制隐藏,只编译一次;v-if是动态定向在DOM树中添加或删除DOM元素。如果初始值为false,则不会编译。而且,v-if不断的销毁和创建会消耗更多的性能。总结:如果要频繁切换节点,使用v-show(切换开销比较小,初始开销比较大)。如果不需要频繁切换节点,使用v-if(初始渲染开销小,切换开销比较大)。如何让CSS只作用于当前组件?在组件样式前添加scoped如何获取dom?ref="domName"Usage:this.$refs.domNameVue中的几个指令名称及其用法?v-model双向数据绑定;v-for循环;v-ifv-show显示和隐藏;v-on事件;v-once:只绑定一次。v-modal的使用?v-model用于表单数据的双向绑定。其实就是一种语法糖。背后做了两个操作:v-bind绑定一个value属性;v-on命令将输入??事件绑定到当前元素。请告诉我vue.cli项目中src目录下的各个文件夹和文件的用途?assets文件夹是存放静态资源的;components用于组件;router用于定义路由相关的配置;app.vue是一个应用程序主组件;main.js是一个入口文件。资产和静态的区别?相同点:assets和static都存储静态资源文件。项目中需要的资源文件图片、字体图标、样式文件等都可以放在这两个文件下。这个是一样的区别:assets里面存放的静态资源文件是打包在项目中的,也就是运行npmrunbuild的时候会把放在assets里面的静态资源文件打包上传。所谓简单打包,可以理解为压缩体积和代码格式化。压缩后的静态资源文件最终会放在静态文件中,和index.html一起上传到服务器。放在static中的静态资源文件不会经过打包、压缩、格式化等过程,而是直接进入打包后的目录,直接上传到服务器。因为避免了压缩,直接上传,打包的时候会提高效率。但是由于static中的资源文件没有被压缩,并且进行了其他操作,所以文件大小会比assets中的打包文件大。它将占用更多服务器空间。建议:项目中模板需要的所有样式文件、js文件等都可以放在assets中,走打包的流程。降低音量。项目中引入的第三方资源文件,如iconfoont.css,可以放在static中,因为这些导入的第三方文件已经处理过了,我们不再需要处理,直接上传即可。v-on可以监控多个方法吗?是的,例如:。vue的两个核心点:数据驱动,组件系统数据驱动:ViewModel,保证数据和视图的一致性。组件系统:应用类UI可以看成是完全由组件树组成的。vue与jQuery的区别在于jQuery使用选择器($)来选择DOM对象,并进行赋值、取值、事件绑定等操作。事实上,与原生HTML的不同之处在于它更方便地选择和操作DOM对象。并且数据和接口在一起。比如需要获取label标签的内容:$("lable").val();,它还是依赖于DOM元素的值。Vue通过Vue对象将数据和View完全分离。不再需要引用相应的DOM对象来对数据进行操作。可以说数据和View是分离的,通过Vue对象的vm相互绑定。这就是传说中的MVVM。delete和Vue.delete删除数组的区别在于删除的元素变为空/未定义,其他元素的键值保持不变。vue.delete直接删除数组,改变数组的键值。axios有什么特点从浏览器创建XMLHttpRequests;node.js创建http请求;支持PromiseAPI;拦截请求和响应;转换请求数据和响应数据;取消请求;自动更改为json。axios中发送字段的参数是data和params。两者的区别是params是和请求地址一起发送的,而data是作为请求体发送的。Params一般适用于get请求,data一般适用于postput请求。.vue初始化页面闪烁问题在使用vue开发的时候,在vue初始化之前,由于div不是vue管理的,我们写的代码在解析之前容易出现花屏的现象,类似于{{message}},虽然正常情况下这个时间很短,但是我们还是要让这个问题得到解决。首先:添加[v-cloak]{display:none;}到css。如果问题没有完全解决,添加style="display:none;":style="{display:'block'}"到根元素触发视图更新方法push();pop();vue更新数组时shift();取消移位();拼接();种类();reverse()vue常用的修饰符?.stop:相当于JavaScript中的event.stopPropagation(),防止事件冒泡;.prevent:等同于JavaScriptevent.preventDefault(),阻止预设行为的执行(如果事件可以被取消,则在不停止事件进一步传播的情况下取消事件);.capture:与事件冒泡的方向相反,事件捕获是从外到内;.self:只触发自己范围内的事件,不包括子元素;.once:只触发一次。vuex相关问题参考:https://blog.csdn.net/u012967...什么是vuex?如何使用?哪些功能场景使用它?vue框架中的状态管理。在main.js中引入store和inject。新建目录store.js,.....export。场景包括:单页应用程序中组件之间的状态。音乐播放、登录状态、加入购物车关于VueXVueX是一款适合Vue项目开发的状态管理工具。试想一下,如果在项目开发中经常使用组件传参来同步数据中的值,一旦项目变得非常庞大,管理和维护这些值将是一件相当棘手的工作。为此,Vue为这些多个组件经常使用的值提供了一个统一的管理工具——VueX。在一个带有VueX的Vue项目中,我们只需要在VueX中定义这些值就可以在整个Vue项目的组件中使用。使用Vuex的目的是为了实现多组件的状态管理。当多个组件需要共享数据时,Vuex是个好帮手。Vuex的五个核心中,state和mutation是必须的,其他的可以根据需要添加。1.state:负责状态管理,类似于vue中的data,用于初始化数据//状态管理2、mutation:专门修改state中的数据,由commit触发//修改state3、action:可以处理异步,通过dispatch触发,不能直接修改state,先在component中通过dispatch触发action,然后在action函数内部commit触发mutation,通过mutation修改state值//异步操作4、getter:Vuex中的computed属性,相当于vue中的computed,依赖state状态值,一旦state值改变,getter会重新计算,也就是说当一个数据依赖另一个数据改变时,需要使用getter5,module:模块化管理//module//importvueandvueximportVuefrom'vue'importVuexfrom'vuex'//MountvuexVue.use(Vuex)//创建一个vuex对象并暴露exportdefaultnewVuex.Store({//全局属性变量state:{},//Global同步方法,调用方法,this.$store.commit("xxx")mutations:{},//异步方法调用方法,this.$store.dispatch("xxx")actions:{},//Vuex属性计算,在视图中使用getters作为变量:{},//模块化注册模块:{}})action和mutation有什么区别?conststore=newVuex.Store({state:{count:0},mutations:{increment(state){state.count++}},actions:{increment(context){context.commit('增量')}}})1.流程序列“对应视图->修改状态”分为两部分,视图触发Action,Action触发Mutation2。角色定位是根据流程顺序,两者扮演不同的角色。Mutation:专注于修改State,这在理论上是修改State的唯一方法。Action:业务代码,异步请求。3.受限角色不同,两者的限制不同。突变:必须同步执行。Action:可以是异步的,但不能直接操作State。