持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
源码
-
1、代码使用monorepo管理
-
2、同一个仓库中,同时各个包又是相互独立的,有自己的逻辑、单元测试等
-
3、模块化划分更加清晰,可维护性、可扩展性强
-
4、源码使用typescript来进行重写
- 1、vue2.x中 使用flow来进行类型检测。
- 2、vue3.x中,vue的源码全部使用typescrit进行重构,并且vue本身对typesript支持更好。
性能
-
1、使用Proxy进行数据劫持
- 1、vue2.x 中,使用Object.DefineProperty来进行数据劫持,劫持getter 和 setter这种方式有存在一个问题,在给对象添加属性的时候,无法进行数据劫持,需要使用delete,这种方式本身就是hack
- 2、vue3.x 中,使用Proxy进行数据拦截
-
2、删除了无用的api,比如:移除了once
-
3、移除了一些特性:如filter、内联模板等
-
4、编译方法的优化、生成 block tree、slot编译优化、diff算法
API
- 1、vue2.x 使用options api
- 2、vue3.x 使用 composition api
- 3、Hooks函数增加代码的复用性
生命周期的变化
在生命周期钩子前面加上 “on” 来访问组件的生命周期钩子。
vue2-optionsApi | vue3-compositionApi |
---|---|
beforeCreate | Not needed* |
created | Not needed* |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeUnmount | onBeforeUnmount |
unmounted | onUnmounted |
errorCaptured | onErrorCaptured |
renderTracked | onRenderTracked |
renderTriggered | onRenderTriggered |
activated | onActivated |
deactivated | onDeactivated |
关于errorCaptured
生命周期,你可以在此钩子中修改组件的状态。因此在捕获错误时,在模板或渲染函数中有一个条件判断来绕过其它内容就很重要;不然该组件可能会进入一个无限的渲染循环。
renderTracked
,跟踪虚拟 DOM 重新渲染时调用,此事件告诉你哪个操作跟踪了组件以及该操作的目标对象和键。
renderTriggered
,当虚拟 DOM 重新渲染被触发时调用。和renderTracked
类似,此事件告诉你是什么操作触发了重新渲染,以及该操作的目标对象和键。
Vue3中setup函数
setup新增api
defineProps
和 defineEmits
在 <script setup>
中必须使用 defineProps
和 defineEmits
API 来声明 props
和 emits
,它们具备完整的类型推断并且在 <script setup>
中是直接可用的:
<script setup>
const props = defineProps({
foo: String
})
const emit = defineEmits(['change', 'delete'])
// setup code
</script>
复制代码
defineExpose
组件暴露出自己的属性,当父组件通过模板 ref 的方式获取到当前组件的实例,获取到的实例会像这样 { a: number, b: number }
(ref 会和在普通实例中一样被自动解包)
<script setup>
import { ref } from 'vue'
const a = 1
const b = ref(2)
defineExpose({
a,
b
})
</script>
总结
从源码角度,使用monorepo管理代码,模块化划分更加清晰,可维护性、可扩展性强。使用typescript来进行类型检测。
从性能角度,使用Proxy进行数据劫持,删除了无用的api,移除了一些特性:如filter、内联模板等,编译方法的优化、生成 block tree、slot编译优化、diff算法。
从API角度,vue2.x 使用options api,vue3.x 使用 composition api。尤其是setup函数。