vue面试题 太过爱你忘了你带给我的痛 2021-12-08 16:03 362阅读 0赞 vue面试题 **1.Vue和react的相同与不同** 相同点: * 都支持服务器端渲染 * 都有virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范 * 数据驱动视图 * 都有支持native的方案,react native,Vue的weex * 都有管理状态,react有redux,vue有自己的VueX 不同点: * react严格上只针对MVC的view层,Vue则是MVVM模式 * virtual DOM不一样,Vue会跟踪每一个组建的依赖关系,不需要重新渲染整个组件树。而对于react而言,每当应用的状态被改变时,全部组件都会重新渲染,所以react中会需要shouldcomponentUpdate这个生命周期函数方法来进行控制 * 组件写法不一样, React推荐的做法是 JSX + inline style, 也就是把HTML和CSS全都写进JavaScript了,即’all in js’; Vue推荐的做法是webpack+vue-loader的单文件组件格式,即html,css,jd写在同一个文件; * .数据绑定: vue实现了数据的双向绑定,react数据流动是单向的 * .state对象在react应用中不可变的,需要使用setState方法更新状态; 在vue中,state对象不是必须的,数据由data属性在vue对象中管理; **2.对于MVVM的理解** MVVM是Model-view-View Model的缩写 model代表数据模型,也可以在model中定义数据修改和操作的业务逻辑 view代表UI组件,它负责数据模型转化成ui展现出来 ViewModel 监听模型数据的改变和控制视图行为、处理数据交互,简单理解就是一个同步View和Model的对象,连接Model和View 在MVVM架构下,view和model之间并没有直接的联系,而是通过view Model进行交互,model和view Model之间的交互是双向的,因此view数据的变化会同步到model中,而Model数据的变化也会立即反应到view上 view Model通过双向数据绑定把view层和model层连接了起来,而view和Model之间的同步工作完全是自动的,无需人为干涉,因此开发者只需要关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由MVVM来统一管理 **3.Vue的生命周期** beforeCreate(创建前)在数据观测和初始化事件还未开始 created(创建后)完成数据观测,属性和方法的运算,初始化事件, e l 属 性 还 没 有 显 示 出 来 b e f o r e M o u n t ( 载 入 前 ) 在 挂 载 开 始 之 前 被 调 用 , 相 关 的 r e n d e r 汉 书 首 次 调 用 , 实 例 已 完 成 以 下 的 配 置 : 编 译 模 版 , 把 d a t a 里 面 的 数 据 和 模 版 生 成 h t m l 注 意 此 时 还 没 有 挂 载 h t m l 到 页 面 上 。 m o u n t e d ( 载 入 后 ) 在 e l 被 新 创 建 的 v m . el属性还没有显示出来 beforeMount(载入前)在挂载开始之前被调用,相关的render汉书首次调用,实例已完成以下的配置:编译模版,把data里面的数据和模版生成html注意此时还没有挂载html到页面上。 mounted(载入后) 在el 被新创建的 vm. el属性还没有显示出来beforeMount(载入前)在挂载开始之前被调用,相关的render汉书首次调用,实例已完成以下的配置:编译模版,把data里面的数据和模版生成html注意此时还没有挂载html到页面上。mounted(载入后)在el被新创建的vm.el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。 beforeUpdate(更新前) 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。 updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。 beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。 destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。 a. 什么是生命周期? vue实例从创建到销毁的过程,就是生命周期,从开始创建、初始化数据、编译模版、挂在DOm→渲染、更新→渲染、销毁等一系列过程,称之为vue的生命周期 b. vue生命周期的作用是什么? vue的生命周期中有很多个事件钩子,让我们在控制整个vue实例的过程时更容易形成好的逻辑 c. vue生命周期总共有几个阶段? 分为8个阶段,创建前/创建后、载入前/载入后、更新前/更新后、销毁前/销毁后 d. 第一次页面加载会触发哪几个钩子 会触发beforeCreate、created、beforeMount、mounted e、DOM渲染在哪个周期中就已经完成? DOM渲染在mounted中就已经完成了 **4.Vue实现数据双向绑定的原理:Object.defineProperty()** vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过object.defineProperty()来劫持各个属性的setter、getter、在数据变动时发布消息给订阅者,触发相应监听回调,当把一个普通javascript对象传给Vue实例来作为它的data选项时,vue将遍历它的属性,用object.defineProperty将他们转为getter/setter。用户看不到getter/setter,但是在内部它们让vue追踪依赖,在属性被访问和修改时通知变化。 vue的数据双向绑定将MVVM作为数据绑定的入口,整合observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模版指令(vue中用来解析\{ \{\}\}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化—>视图更新;视图交互变化(input)—>数据model变更双向绑定效果 js实现简单的双向绑定: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk1OTAyNA_size_16_color_FFFFFF_t_70] **5.Vue组件间的参数传递** * 父组件与子组件传值 父组件传给子组件:子组件通过props方法接受数据 子组件传给父组件:$emit方法传递参数 * 非父子组件间的数据传递,兄弟组件传值 eventBus,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。项目比较小时,用这个比较合适、 **6. vue的路由vue-router** vue-router是vue.js官方的路由管理器 vue-router的使用: 1.安装并引入vue-router 安装:npm i vue-router --save-dev 引入:import VueRouter from ‘vue-router’ 执行vuerouter:Vue.use(VueRouter) 2.定义路由组件 const Foo = { template: '<div>foo</div>' } const Bar = { template: '<div>bar</div>'} 3.定义路由 const routes = [ {path: '/foo', component: Foo} {path: '/bar', component: Bar} ] 4.创建路由实例,然后传routes配置 const router = new VueRouter({ routes //相当于routes:routes }) 5.创建和挂载根实例 const app = new Vue({ router }).$mount('#app') 通过注入路由器,我们可以在任何组件内通过this. r o u t e r 访 问 路 由 器 , 也 可 以 通 过 t h i s . router访问路由器,也可以通过this. router访问路由器,也可以通过this.route访问当前路由 **7.vue-cli如何新增自定义指令** ① 创建局部指令: var app = new Vue({ el: '#app', data: {}, //创建指令 directives: { // 指令名称 dir1: { inserted(el) { // 指令中第一个参数是当前使用指令的DOM console.log(el) // 对DOM进行操作 el.style.width = '200px' } } } }) ② 创建全局指令 Vue.directive('dir2', { inserted(el) { console.log(el) } }) ③ 指令的使用 <div> <div v-dir1></div> <div v-dir2></div> </div> **8.vue路由的钩子函数** 首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改。一些需要登录才能调整页面的重定向功能。 beforeEach主要有3个参数to,from,next: to:route即将进入的目标路由对象, from:route当前导航正要离开的路由 next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。 **9.vue如何定义一个过滤器** html代码: <div id="app"> <input type="text" v-model="msg" /> { {msg | capitalize }} </div> js代码 var vm=new Vue({ el:"#app", data:{ msg:'' }, filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } }) 全局定义过滤器 Vue.filter('capitalize', function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) }) **10、一句话就能回答的面试题** 1.如何让css只在当前组件起作用 在style标签中写入scoped即可,例如<style scoped></style> 2.vi-if 和v-show的区别 v-if按照条件是否渲染,v-show是display的block和none 3.$route和$router的区别 $route是路由信息对象,包含path,params,hash,query,fullPath,matched,name等路由信息参数。而$router是路由实例,对象包含了路由的跳转方法,钩子函数等 4.vue.js的两个核心是什么 数据驱动和组件系统 5.什么是vue的计算属性 在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。好处:①使得数据处理结构清晰;②依赖于数据,数据更新,处理结果自动更新;③ 计算属性内部的this执行VM实例;④ 在template调用时,直接写计算属性名即可;⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算 6. vue等单页面应用及其优缺点 优点:vue的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好 缺点:不支持低版本浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务器来进行渲染组件);第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退 11、怎么定义vue-router的动态路由,怎么获取传过来的值 在router目录下的index.js文件中,对path属性加上/:id,使用router对象的params.id获取 **11.VUX** vueX:专门为vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证以一种可预测的方式发生变化 state Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。 mutations mutations定义的方法动态修改Vuex 的 store 中的状态或数据。 getters 类似vue的计算属性,主要用来过滤一些数据。 action actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk1OTAyNA_size_16_color_FFFFFF_t_70 1] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk1OTAyNA_size_16_color_FFFFFF_t_70]: /images/20211208/bce2607af8614952a4992213bd8e15c8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk1OTAyNA_size_16_color_FFFFFF_t_70 1]: /images/20211208/5697abc35dc6416e8900f404f2cd7a7a.png
相关 面试题——vue面试题总结 vue面试题总结 1.vue的特点是什么 1.国人开发的轻量级框架 2.双向数据绑定,在数据操作方面更为简单 3.视图,数据,结构分析,不需要进行逻辑代码的修改 た 入场券/ 2023年01月18日 11:29/ 0 赞/ 412 阅读
相关 Vue面试题 > 1.对MVVM的理解 M:model层,在model层对数据进行操作和修改数据 V:视图层 VM:监听模型数据的改变和控制视图行为。相当于模型层和视图层 女爷i/ 2022年12月22日 11:17/ 0 赞/ 200 阅读
相关 vue面试题 为什么props是单向绑定的? > 所有prop都使得其父子prop之间形成了一个单向下行绑定:父级prop的更新会向下流动到子组件中,但是反过来则不行。每次父级组件发生变更 た 入场券/ 2022年11月17日 10:18/ 0 赞/ 199 阅读
相关 vue面试题 vue.js是什么? 是一套构建用户界面的 渐进式框架 vuex是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用 曾经终败给现在/ 2022年05月10日 01:03/ 0 赞/ 148 阅读
相关 Vue面试题 1. Vue中的MVVM模式 ![在这里插入图片描述][70] 即 Model-View-ViewModel Model是数据层,View是视图层,ViewMod 水深无声/ 2022年05月07日 05:56/ 0 赞/ 380 阅读
相关 Vue 面试题 Vue面试题 1、Vue总结: vue的使用方式有两种 方式一:像jQuery一样引入使用--vue的特性都可以使用,双向数据绑定 妖狐艹你老母/ 2022年04月13日 15:15/ 0 赞/ 272 阅读
相关 Vue面试题 VUE 面试题 一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写。 Model代表数据模型,也可以在Model中定义数据修改 超、凢脫俗/ 2022年02月28日 06:18/ 0 赞/ 321 阅读
相关 VUE面试题 VUE 1. MVVM如何实现模板绑定,依赖是如何收集的? 2. vue2中的diff算法是怎样实现的? 3. 请详细说出vue生命周期的执行过程 4 ╰半橙微兮°/ 2022年01月30日 15:34/ 0 赞/ 258 阅读
相关 vue面试题 vue面试题 1.Vue和react的相同与不同 相同点: 都支持服务器端渲染 都有virtual DOM,组件化开发,通过props参数进行父子组件数据的 太过爱你忘了你带给我的痛/ 2021年12月08日 16:03/ 0 赞/ 363 阅读
相关 vue面试题 1.vuex中异步在哪里写,可以在mutation里面吗,为什么? Mutation 必须是同步函数 一条重要的原则就是要记住 mutation 必须是同步函数。为什么 ゞ 浴缸里的玫瑰/ 2021年12月05日 02:31/ 0 赞/ 343 阅读
还没有评论,来说两句吧...