1. 生命周期?那个生命周期可以获取到真实DOM?修改data里面的数据,会触发什么生命周期?
生命周期包括4个阶段:创建前/创建、渲染前/渲染、更新前/更新、销毁前/销毁
可以获取到真实DOM:mounted; 修改data里面的数据,会触发 updated 生命周期
2. 组件data为什么是一个函数?
项目中会有很多个组件,每个组件对应一个data;如果data只是一个对象,很容易造成数据污染,函数返回新的对象
3. vue 组件通信?一般说了vuex,就会问vuex用法?action和mutations区别?实现原理等?
- 父子组件值传递:父组件利用v-bind传值,子组件利用prop属性接受传值;父组件利用ref给子组件设置唯一id标识,进行触发子组件方法响应;子组件$emit触发父组件方法响应;
- 中央事件总线 EventBus:EventBus 通过新建一个 Vue 事件 bus 对象,然后通过 bus.on 监听触发的事件。
- 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.
为什么用:如果对数据频繁操作,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 的生命周期。
16.虚拟 DOM 实现原理
用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象; diff 算法 — 比较两棵虚拟 DOM 树的差异; pach 算法 — 将两个虚拟 DOM 对象的差异应用到真正的 DOM 树。