Vue面试题总结

152 阅读4分钟

1.vue的生命周期有哪些?

vue2中有8个,如果使用了keep-active还会多两个。

beforCreate,create,beforeMount,mounted,beforUpdate,update,beforeDestory,destory,actived,deactived

create:有数据,没dom,mounted:有dom,create先执行的。

进入到组件会执行哪些声明周期?

beforCreate ,Created , beforemount ,Mounted:

加入keep-alive 会多两个声明周期: actived 和deactived

如果加入了 keep-alive,第一次进入组件会执行那些生命周期?

beforCreate ,Created , beforemount ,Mounted,actived

第N次进入 只执行一个actived ,因为被缓存起来了

2. Computed , methods , watch 区别

1, Computed 有缓存,methods无缓存

2, Watch 是监听,数据或者路由发生变化才会执行,一对多,computed是计算某一属性的值,值改变就会监听并返回,多对一。

2.v-show 和v-if的区别?

首先二者都是可以对元素进行隐藏和显示的操作。

v-show是通过display:none或者display:black进行显示隐藏的

v-if是通过dom得到创建和销毁进行显示个隐藏的

首次加载用v-if比较好,多次切换建议使用v-show。

3.v-if和v-for的优先级,为什么不建议一起使用?

在vue2中v-for的优先级比较高,vue3中v-if的优先级高,因为v-if每执行一次,都会执行一次v-for,会造成性能浪费,如果想一起使用就在外面包一个盒子。

4.NextTick是做什么的,以及它的原理?(需要后面补充)

在下次 DOM 更新循环结束后执⾏延迟回调,在修改数据之后⽴即使⽤ nextTick 来获取更新后的DOM

原理:将传入的回调函数包装成异步任务,异步任务又分微任务和宏任务,为了尽快执行所以优先选择微任务,延迟它地执行顺序

nextTick 提供了四种异步方法 Promise.then、MutationObserver、setImmediate、setTimeout(fn,0)

5.组件通信

父传子:父组件在子组件上通过v-bind绑定自定义属性,子组件通过props接收

子传父:子组件通过事件,利用$emit 给父组件传值,有两个参数,第一个是父组件自定义的方法,第二个是值,父组件通过事件接收

兄弟传递:创建个公共的bus.js。两个组件都引入,通过emit传递,emit传递,on接收。

跨组件:provide传递,inject接收

还可以使用vuex传值。

加载过程:父 *beforeCreate *-> 父 *create *-> 子 *beforeCreate *-> 子 *created *-> 子 *mounted *-> 父mounted

更新过程:父 *beforeUpdate *->子 *beforeUpdate *->子 *updated *->父updated

销毁过程:父 *beforeDestroy *->子 *beforeDestroy *->子 *destroyed *->父destroyed

6.VueX

是一个数据管理工具,有五个属性

state:类似与data,用来存放数据。

getters:相当于计算属性cumputed.

mutations:相当于方法methods。 actions:里面可以写一些异步的操作,用来提交mutations的

modules:细分属性,管理好仓库。

7.虚拟DOM

虚拟DOM:运行js的速度是很快的,大量的操作DOM就会很慢,时常在更新数据后会重新渲染页面,这样造成在没有改变数据的地方也重新渲染了DOM节点,这样就造成了很大程度上的资源浪费,用内存中生成与真实DOM与之对应的数据结构,这个在内存中生成的结构称为虚拟DOM,当model中数据发生变化时,Vue会将模板编译成虚拟 DOM 渲染函数,并结合响应系统,在应用状态改变时,vuejs能够智能地计算出重新渲染组件,并以最小代价并应用到DOM操作上

8.路由模式,区别,如何实现的,路由懒加载怎么做?

路由懒加载用import还有compoent

常见的路由模式有hash和history

1.url 展示上,hash 模式有 "#",history 模式没有

2.刷新⻚⾯时,hash 模式可以正常加载到 hash 值对应的⻚⾯,⽽ history 没有处理的话,会返回404,⼀般需要后端将所有⻚⾯都配置重定向到⾸⻚路由。

3.兼容性。hash 可以⽀持低版本浏览器和 IE。

9.hash 和 history如何让实现的?

# 后⾯ hash 值的变化,不会导致浏览器向服务器发出请求,浏览器不发出请求,就不会刷新⻚⾯。同时通过监听 hashchange 事件可以知道 hash 发⽣了哪些变化,然后根据 hash 变化来实现更新⻚⾯部分内容的操作。

history 模式的实现,主要是 HTML5 标准发布的两个 API, pushStatereplaceState ,这两个 API 可以在改变 url,但是不会发送请求。这样就可以监听 url 变化来实现更新⻚⾯部分内容的操作。

10.路由守卫?

路由守卫有三个值,to:去哪里,form:来自哪里,next:要做什么

全局守卫: beforeEach,beforeResolve,afterEach

路由守卫:beforeEnter:在路由跳转前触发,这个钩子作用主要是用于登录验证

组件守卫: beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave

11.讲⼀讲MVVM吗?

MVVM是 Model-View-ViewModel 缩写,也就是把 MVC 中的 Controller 演变成 ViewModel

Model层代表数据模型,View代表视图层,ViewModel是View和Model层的桥梁,主要是解决了视图层数据层不能连动的问题,数据会绑定到viewModel层并⾃动将数据渲染到⻚⾯中,视图变化的时候会通知viewModel层更新数据

12.双向绑定?

双向绑定是 数据变化更新视图,视图变化更新数据

vue2中的双向绑定是通过object.defineProperty进行数据劫持,监听getter和setter的数据变化,触发update方法,进行更新节点的,但是这样会有个问题,就是如果后面为声明的对象添加一个属性,这个新的属性就会失去响应,通过vue.$set就可以解决这个问题,但是这种方式有点不符合自动响应机制,所以vue3中又引入了一个代理,也就是porxy,这个相应方式根据retive实现的,由于porxy只能实现复杂数据类型,所以又提供了一个ref方法,通过.value,去调用value实现数据响应。

13.vue 中组件 data 为什么是 return ⼀个对象的函数,⽽不是直接是个对象?

如果将data定义为对象,这就表示所有的组件实例共⽤了⼀份data数据,因此,⽆论在哪个组件实例中修改了data,都会影响到所有的组件实例。

组件中的data写成⼀个函数,数据以函数返回值形式定义,这样每复⽤⼀次组件,就会返回⼀份新的data,类似于给每个组件实例创建⼀个私有的数据空间,让各个组件实例维护各⾃的数据。⽽单纯的写成对象形式,就使得所有组件实例共⽤了⼀份data,就会造成⼀个变了全都会变的结果。

14.Vue 框架怎么实现对象和数组的监听?

通过遍历数组 和递归遍历对象,从而达到利用 Object.defineProperty() 也能对对象和数组(部分方法的操作)进行监听。

vue2中 数组就是使用 object.defineProperty 重新定义数组的每一项,能引起数组变化的方法为 pop 、 push 、 shift 、 unshift 、 splice 、 sort 、 reverse 这七种,只要这些方法执行改了数组内容,就更新内容

vue3中 改用 proxy ,可直接监听对象数组的变化。

14.你都做过哪些Vue的性能优化?

1.SPA ⻚⾯采⽤keep-alive缓存组件

2.在更多的情况下,使⽤v-if替代v-show

3.key保证唯⼀

4.使⽤路由懒加载、异步组件

5.第三⽅模块按需导⼊

6.⻓列表滚动到可视区域动态加载

15.打包优化
  • Happypack——将 loader 由单进程转为多进程 (webpack 是单线程的,但是cpu是多线程的,happypack 会充分释放 CPU 在多核并发方面的优势,帮我们把任务分解给多个子进程去并发执行,大大提升打包效率。)
  • 使用 include 或 exclude 优化babel-loder来帮我们避免不必要的转译
  • Tree Shaking:去除冗余代码
  • 插件按需加载
  • 开启gzip压缩:在request headers 加上accept-encoding:gzip 优化方案 ( 原理,是在一个文本文件中找出一些重复出现的字符串、临时替换它们,从而使整个文件变小。文件 中代码的重复率越高,那么压缩的效率就越高,收益也就越大。 )