Vue
v-show和v-if有什么区别
- v-show 通过 CSS display 控制显示和隐藏
- v-if 组件真正的渲染和销毁,而不是显示和隐藏
为何在v-for使用key
- 必须用 key , 且不能是 index 和 random
- diff 算法中通过 tag 和 key 来判断,是否是 sameNode
- 减少渲染次数,提升渲染性能
Vue 组件生命周期(包括父子组件)
参考:Vue生命周期
Vue 组件如何通信(常见)
- 父子组件 props 和 this.$emit
- 自定义事件 event.$no event.$off event.$emit
- vuex
描述组件渲染和更新的过程
![3bb1ff402e0ab8f8cde784185b4da7c4.png](https://i-blog.csdnimg.cn/blog_migrate/60d5718fa4f9d235c07f833f9f6c6b5b.jpeg)
如上图所示,vue原理三大模块:响应式、模板渲染、vdom
初次渲染过程
- 解析模板为 render 函数 (或在开发环境已完成,vue-loader)
- 触发响应式,监听 data 属性 getter、 setter
- 执行 render 函数,生成 vnode ,patch(elem,vnode)
更新过程
- 修改 data,触发 setter(此前在 getter 中已被监听)
- 重新执行 render 函数,生成 newVnode
- patch(vnode,newVnode)
with 语法
![e7dd92cb78e924763772b5e3623688e6.png](https://i-blog.csdnimg.cn/blog_migrate/48c630129082b867d4a4bfb72b25b418.jpeg)
vue为何是异步渲染
- 减少 DOM 操作次数,提高性能
$nextTick 待 DOM 渲染完后再回调,页面渲染时会将 data 的修改做整合,多次 data 修改只会渲染一次。
![3422e29dd8d3319a3f2a27e8de6d1831.png](https://i-blog.csdnimg.cn/blog_migrate/3a192a9c3cb7cc37f4d8e44dd7317b71.jpeg)
双向数据绑定 v-model 的实现原理
- input 元素的 value = this.name
- 绑定 input 事件 this.name = $event.target.value
- data 更新触发 re-render
对 MVVM 的理解
![6051a561a28b6bb45006054d08c57623.png](https://i-blog.csdnimg.cn/blog_migrate/19ab74970c61877c133aec62b88c0f15.jpeg)
computed 有何特点
- 缓存,data 不变不会重新计算
- 提高性能
为何组件 data 必须是一个函数
![fbc34fe5d466014b381c9240a317447b.png](https://i-blog.csdnimg.cn/blog_migrate/8c1e925513064871df17e0a2ca06c91d.jpeg)
如上图所示,这个不是 vue 相关问题,而是关于 js 方面问题。vue 文件编译之后实际上是 class ,是一个类。而对组件使用的时候,相当于对组件进行了实例化。如果 data 不是一个函数的话,那每一个组件实例就共享了,就会造成数据污染问题。而函数的话,就会形成闭包,保护变量,不会造成影响。
ajax 请求应该放在哪个生命周期
- mounted
- JS 是单线程的,ajax 异步获取数据
- 放在 mounted 之前没有用,只会让逻辑更加混乱
如何将组件所有 props 传递给子组件
- $pros
- 用法:
如何自己实现 v-model
如何自己实现 v-model
![6afb6a9c178571c1500b4ce7011d0e8f.png](https://i-blog.csdnimg.cn/blog_migrate/5d944a8c8a1b2c3cfb37cbbe15ff0ac0.jpeg)
多个组件有相同的逻辑,如何抽离
- mixin
何时要使用异步组件
- 加载大文件
- 路由异步加载
- 优化性能
何时使用 keep-alive
- 缓存组件,不需要重复渲染
- 如多个静态 tab 页的切换
- 优化性能
何时需要使用 beforeDestory
- 解绑自定义事件 event.$off
- 清除定时器
- 解绑自定义的 DOM 事件,如window scroll 等
什么是作用域插槽
![fc3ff9e81f0e56d23513b330a2987cf6.png](https://i-blog.csdnimg.cn/blog_migrate/06a021664aeebda91c66c4a922562261.jpeg)
请用 vnode 描述一个 DOM 结构
场景:
![5fd5f4edee61989e569a6842edffd614.png](https://i-blog.csdnimg.cn/blog_migrate/6edd8384f934e5867fb3e29e22731b14.jpeg)
vnode:
![c9352a6c5359ad58405ab204f341e021.png](https://i-blog.csdnimg.cn/blog_migrate/ad8a5b404d32054e11b6b6ba1cb00839.jpeg)
diff 算法的时间复杂度
- O(n)
- 在O(n^3)上做了优化
简述 diff 算法过程
- patch ( elem , vnode ) 和 patch ( vnode , newVnode )
- patchVnode 和 addVnodes 和 removeVnodes
- updateChildren (key的重要性)
vue 常见性能优化方式
- 合理使用 v-show 和 v-if
- 合理使用 computed
- v-for 时加 key,以及避免和 v-if 同时使用
- 自定义事件、DOM事件及时销毁
- 合理使用异步组件
- 合理使用 keep-alive
- data 层级不要太深
- 使用 vue-loader 在开发环境做模板编译(预编译)
- webpack层面的优化(传送门)
- 使用SSR
![ab7857b11bef891ebc5fa3d21a05f995.png](https://i-blog.csdnimg.cn/blog_migrate/568f691f594f6e74206765f9165989d5.jpeg)