vue组件通讯方式(全面)
props和$emit- 自定义事件(
event.$on()/event.emit())。 注意: vue2:new Vue() 就是 event。 vue3 引入第三方的自定义事件event-emitter $attr$parent$refsprovide/injectVuex
自定义事件(Vue)
可以先引入一个地方法 event-mitter,抽出一个公共文件使用
1
2
3
4
5
6
// event.js
import ee from 'event-emitter'
const event = ee()
export default event
组件中监听发布使用自定事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// vue组件监听自定事件使用
<script>
import event from 'event.js'
export default {
mounted() {
event.on('showMsg', this.showMsg)
}
methods: {
showMsg(text) {
console.log(text)
}
}
// vue2.x beforeDestroy
beforeUnmount() {
// 组件销毁是取消 监听
event.off('showMsg', this.showMsg)
}
}
</script>
// 自定事件发布使用示例
<template>
<button @click="trigger">自定义事件触发</button>
</template>
<script>
import event from 'event.js'
export default {
methods: {
trigger() {
event.emit('showMsg', 'hello')
}
}
}
</script>
Vuex mutation action 区别
mutation:原子操作,必须是同步代码action:可以包含多个mutation,可以写异步代码
vue 性能优化
- 自定义事件、
DOM事件及时销毁 - 合理使用异步组件
- 合理使用
keep-alive data层级不要太深- 使用
vue-loader在开发环境做模板编译(预编译)
双向数据绑定 v-model 的实现原理
- input 元素的 value = this.name
- 绑定input事件 this.name = $event.target.value
- data 更新触发 re-render
$nextTick 与 update 区别
update先执行,数据更新后就会先调用钩子生命周期。$nextTick是在下一次 DOM 更新循环后之后执行。顺序执行微任务update执行完后会立即执行$nextTick
Vue3 为何比 Vue2 快
Proxy响应PatchFlag- 编译模板时,动态节点做标记
- 标记,分为不同的类型,如
TEXTPROPS diff算法时,可以区分静态节点,以及不同类型的动态节点
hoistStatic- 将静态节点的定义,提升到父作用域,缓存起来
- 多个相邻的静态节点,会被合并起来
- 典型的拿空间换时间的优化策略
cachHandler- 缓存事件
SSR优化- 静态节点直接输出,绕过了 vdom
- 动态节点还是需要动态渲染
three-shaking- 编译时,根据不同的情况,引入不同的API
vue3 新功能
createAppemits属性- 多事件处理
Fragment- 移除
.sync改为v-model参数 - 异步组件的引用方式
- 移除
filter TeleportSuspenseComposition APIreactivereftoReftoRefsreadonlycomputedwatchwatchEffect- 钩子生命周期
Vue 和 React 函数组件的区别
vue函数组件没有实例和生命周期,比较简单VueComposition API不能用于Vue函数组件React函数组件 +Hooks可以实现完备的功能
函数式组件的签名与 setup() 钩子相同:
1
2
3
function MyComponent(props, { slots, emit, attrs }) {
// ...
}
对比 Vue3 Composition API 和 React Hooks
vue Composition API:依赖组件实例的,组件只会执行一次React Hooks没有组件实例,纯函数(它底层是通过列表封装的,不能通过if、for等语法去使用,必须放到顶层使用),每次数据更新组件都会重新执行。