我的源码学习之路(15)--- vue3(2)

125 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

前言

不甘于平庸又不努力

2023继续!!!


vue3开始了!!!

watch watchEffect 及区别

- watch: 既要指明监视的属性,也要指明监视的回调
- watchEffect: 不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。
  • 相同点
    • 两者都可以监听data属性变化
  • 不同点
watchwatchEffect
需要明确监听哪个属性,默认是惰性执行会根据其中的属性,自动监听其变化

生命周期

v2生命周期:

生命周期名概念
beforeCreate组件实例被创建之初,组件的属性生效之前
created组件实例已经完全创建,属性也绑定,但真实 dom 还没有生成,$el 还不可用
beforeMount在挂载开始之前被调用:相关的 render 函数首次被调用
mountedel 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子
beforeUpdate组件数据更新之前调用,发生在虚拟 DOM 打补丁之前
update组件数据更新之后
activitedkeep-alive 专属,组件被激活时调用
deadctivatedkeep-alive 专属,组件被销毁时调用
beforeDestory组件销毁前调用
destoryed组件销毁后调用

V3生命周期:

生命周期名概念
setup()开始创建组件之前,在beforeCreate和created之前执行。创建的是data和method
onBeforeMount()组件挂载到节点上之前执行的函数。
onMounted()组件挂载完成后执行的函数。
onBeforeUpdate()组件更新之前执行的函数。
onUpdated()组件更新完成之后执行的函数。
onBeforeUnmount()组件卸载之前执行的函数。
onUnmounted()组件卸载完成后执行的函数
onActivated()被包含在中的组件,会多出两个生命周期钩子函数。被激活时执行。
onDeactivated()比如从 A 组件,切换到 B 组件,A 组件消失时执行。
onErrorCaptured()当捕获一个来自子孙组件的异常时激活钩子函数。

对比v2 vs v3

Vue2vue3
beforeCreatesetup()
createdsetup()
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted
activatedonActivated
deactivatedonDeactivated
errorCapturedonErrorCaptured

Composition API如何实现代码逻辑复用

三个步骤:

  • 抽离逻辑代码到一个函数
  • 函数命名为useXxxx
  • 在setup中引用useXxxx 复用函数的组件:useXxxx
function useXxxx(){
    //写逻辑代码
    
}
export default useXxxx

父组件

import useXxxx from "./useXxxx";
    
export default{
   setup() {
        const xx = useXxxx()
        return {xx}
    }
}

v3比v2为啥快

为啥快

  • 换成了proxy响应式

  • PatchFlag(标记)

  • hoistStatic(静态提升)

  • cacheHandler(缓存)

  • SSR优化

  • tree-shaking

    V3优势有 1. 性能更好 2. 体积更小 3. 更好的TS支持 4. 更好的代码组织 5. 更好的逻辑抽离 6. 更好新功能

PatchFlag(标记)

编译模板时,动态节点做标记;diff算法时,可以区分静态节点以及不同类型的动态节点。 diff算法的时候 只比较有标记的节点

hoistStatic(静态提升)

  • 将静态节点的定义,提升到父作用域,缓存起来
  • 多个相邻静态节点,会被合并起来
  • 典型的拿空间换时间的优化策略

Tree-Shaking Support(按需编译)

静态分析并删除未使用的导出相关的代码

Fragment片段

v3中可以支持多个根节点

Vite是什么

前端打包工具;

优势:开发环境下无需打包,启动超快 

语法糖内的defineEmits、defineExpose及defineProps

defineEmits

相当于V2中的this.$emit()

defineExpose
可以将子组件中的方法暴露给父组件

父组件

   <son ref='son'></son> 
     setup(){
        const sonRef = ref(null)
        const handleClick = ()=>{
            sonRef.value.detail() // 使用子组件的方法
        }
    }

子组件

    setup(){
        detail(){}
    defineExpose({detail})
    }
defineProps
相当于V2中的props 子组件接收父组件穿的参数

后记

本文仅作为自己一个阅读记录,具体还是要看大佬们的文章

下一篇:我的源码学习之路(16)--- vue3(3)