这篇文章主要记录一些 setup 语法糖需要注意的地方,之后关于 setup 的小问题就不会新开文章了。

1. vue 中 this.refs 在 setup 语法糖中的使用方法

vue :

1
<base-input ref="usernameInput"></base-input>

在 js 代码中可以通过下面的方法访问 usernameInput:

1
this.$refs.usernameInput

可以调用里面的方法:

1
2
3
// 假设 base-input 组件内有方法foo
 
this.$refs.usernameInput.foo();

vue3使用:

父组件调用子组件的时候设置ref值:

1
<ChildVue ref="childRef" />

设置完成后,vue3可以通过ref方法获取:

1
const childRef = ref();

调用:

1
childRef.value.foo(); // foo

2. vue2 和vue3的生命周期对比

vue2 的生命周期:

  1. 创建数据代理、数据检测
    beforeCrate()
    created()
  2. 挂载
    beforeMount()
    mounted()
  3. 更新
    beforeUpdate()
    updated()
  4. 销毁
    beforeDestroy()
    destroyed()
  5. activated 和 deactivated
    activated()
    deactivated()
  6. errorCaptured

    beforeCreate()

在实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用。
此时还没有进行数据代理,数据监测,所有vm身上并没有_data的属性

Create()

实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。vm身上也存在_data属性

beforeMount()

在挂载开始之前被调用,这时页面中的插值语法都未被解析。**该钩子在服务器端渲染期间不被调用。

mounted()

实例被挂载后调用,页面中的插值语法已经被解析了。该钩子在服务器端渲染期间不被调用。

注意 mounted 不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕再执行某些操作,可以在 mounted 内部使用 vm.$nextTick

beforeUpdate()

在数据发生改变后,DOM 被更新之前被调用。 该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务器端进行。

updated()

在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。

Updated 不会保证所有的子组件也都被重新渲染完毕。如果你希望等到整个视图都渲染完毕,可以在 updated 里使用 vm.$nextTick.

beforeDestroy()

实例销毁之前调用。在这一步,实例仍然完全可用。

该钩子在服务器端渲染期间不被调用。

destroyed()

实例销毁后调用。 该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。

该钩子在服务器端渲染期间不被调用。

activated()

被 keep-alive 缓存的组件激活时调用。该钩子在服务器端渲染期间不被调用

deactivated()

被 keep-alive 缓存的组件失活时调用。 该钩子在服务器端渲染期间不被调用

errorCaptured

2.5.0+ 新增,在捕获一个来自后代组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

完整生命周期图

![[Pasted image 20221118161919.png]]

vue3的生命周期:

在vue3的生命周期中没有了销毁之前(beforeDestroy )以及销毁完毕(destroyed )这两个生命周期。

取而代之的是卸载,卸载之前(beforeUnmount )以及卸载完毕(unmounted )

Vue3中,生命周期有两种写法:

  1. 配置项的形式

  2. 组合式api的形式

配置项的形式:

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
//配置项的形式使用生命周期钩子
beforeCreate(){
console.log('beforeCreate');
},
created(){
console.log('created');
},
beforeMount(){
console.log('beforeMount');
},
mounted(){
console.log('mounted');
},
beforeUpdate(){
console.log('beforeUpdate');
},
updated(){
console.log('updated');
},
beforeUnmount(){
console.log('beforeUnmount');
},
unmounted(){
console.log('unmounted');
}

组合式api的形式:
使用组合式api的形式,生命周期的名称发生了一些小变化,如下:

1
2
3
4
5
6
7
8
beforeCreate -> 使用 setup()
created -> 使用 setup()
beforeMount -> onBeforeMount
mounted -> onMounted
beforeUpdate -> onBeforeUpdate
updated -> onUpdated
beforeUnmount-> onBeforeUnmount
unmounted-> onUnmounted

在使用生命周期时,需要先引入:

1
import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted} from  'vue'

![[Pasted image 20221118162448.png]]