Vue知识点

516 阅读4分钟

1. 生命周期?那个生命周期可以获取到真实DOM?修改data里面的数据,会触发什么生命周期?

生命周期包括4个阶段:创建前/创建、渲染前/渲染、更新前/更新、销毁前/销毁

可以获取到真实DOM:mounted; 修改data里面的数据,会触发 updated 生命周期

2. 组件data为什么是一个函数?

项目中会有很多个组件,每个组件对应一个data;如果data只是一个对象,很容易造成数据污染,函数返回新的对象

3. vue 组件通信?一般说了vuex,就会问vuex用法?action和mutations区别?实现原理等?

  1. 父子组件值传递:父组件利用v-bind传值,子组件利用prop属性接受传值;父组件利用ref给子组件设置唯一id标识,进行触发子组件方法响应;子组件$emit触发父组件方法响应;
  2. 中央事件总线 EventBus:EventBus 通过新建一个 Vue 事件 bus 对象,然后通过 bus.emit触发事件,bus.emit 触发事件,bus.on 监听触发的事件。
  3. Vuex设置全局变量: state:用于数据的存储,是store中的唯一数据源;(this.$store.state.allProducts)

getters:如vue中的计算属性一样,基于state数据的二次包装,常用于数据的筛选和多个数据的相关性计算;(this.$store.getters.cartProducts)

mutations:类似函数,改变state数据的唯一途径,且不能用于处理异步事件(重点!!!)(this.$store.commit('setProducts', {//..options}))

actions:类似于mutation,用于提交mutation来改变状态,而不直接变更状态,可以包含任意异步操作;(this.$store.dispatch('getAllProducts', {//..payload}))

modules:类似于命名空间,用于项目中将各个模块的状态分开定义和操作,便于维护

store.state.a // -> moduleA 的状态;

store.state.b // -> moduleB 的状态

4. vue 导航守卫,分全局和组件的,一般用于权限控制,这个就可能扯到项目中的一些鉴权问题。

5. $nextTick 作用?实现原理?微任务向宏任务的降级处理,经常被问到说出几种宏任务,微任务。

nextTick是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后使用nextTick是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后使用nextTick;则可以在回调中获取更新后的DOM.

为什么用:如果对数据频繁操作,dom立即更新,会造成很大的性能问题;

原理:利用事件循环机制,将需要更新的数据不是立即执行run方法,而是缓存放在异步更新队列中,同时为这个执行队列创建一个微任务来执行等待里面的更新。等待主函数执行完成后,执行队列中的程序,执行完成后,执行回调函数。

在setTimeout代码执行之前会穿插一次无效的视图渲染,因此我们尽量使用Promise创建微任务实现异步更新

6. vue响应式原理?基本都会问

数据劫持:在vue初始化的时候会遍历data中的属性,利用object.difineProperty给每个属性添加getter/setter方法;

收集依赖:每个组件实例对应一个watcher,get代理方法我们可以收集到依赖该数据的Watcher对象,并且保存到Dep中作为该数据的依赖;

数据更新:当数据更新时,触发setter方法,进而执行Dep的notify方法通知对应的watcher更新数据,渲染到页面上;

vue3.0使用proxy实现数据响应式,接受的为对象;

7. vue scoped属性作用?实现原理?

样式只在当前组件中使用,其他组件不会用到该样式,防止组件污染; 实现原理:添加 data-v-xxx 唯一属性

8. vue router有几种模式?实现方式?

三种 "hash" | "history" | "abstract"

hash: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器。

history: 依赖 HTML5 History API 和服务器配置。查看 HTML5 History 模式。

abstract: 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式.

9. key的作用?没有key的情况,vue会怎么做?会引出diff的问题

key的作用:保证数据渲染的唯一性;

没有key,object.key=undefined;undefined===undefined, vue里会对比key继续利用diff算法,对比更新;

问题:更新没有达到我们想到的效果

10. vue diff过程,和react diff区别?

数据变化后的vnode和oldnode进行对比,

11. vue 2.x defineProperty缺陷?业务代码里面怎么处理?$set原理?vue是怎么重写数组方法的?考察

set原理: 调用 splice 函数触发派发更新,手动派发更新, ob.dep.notify()

12. 你是不是真的看过源码

13. vue 3.0 proxy优缺点?怎么处理vue3不支持IE?

14. computed 和 watch 的区别和运用的场景?除了基本的,看你能不能说出三种watcher的区别

computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值;

watch: 更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作;

computed :当一个属性受多个属性影响的时候就需要用到computed,购物车商品结算的时候

watch:当一条数据影响多条数据的时候就需要用watch;搜索数据

15. vue生命周期

从开始创建、初始化数据、编译模版、挂载 Dom -> 渲染、更新 -> 渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。

image.png

16.虚拟 DOM 实现原理

用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象; diff 算法 — 比较两棵虚拟 DOM 树的差异; pach 算法 — 将两个虚拟 DOM 对象的差异应用到真正的 DOM 树。