vue3 setup 语法糖的一些注意点
这篇文章主要记录一些 setup 语法糖需要注意的地方,之后关于 setup 的小问题就不会新开文章了。
1. vue 中 this.refs 在 setup 语法糖中的使用方法
vue :
1 | <base-input ref="usernameInput"></base-input> |
在 js 代码中可以通过下面的方法访问 usernameInput:
1 | this.$refs.usernameInput |
可以调用里面的方法:
1 | // 假设 base-input 组件内有方法foo |
vue3使用:
父组件调用子组件的时候设置ref值:
1 | <ChildVue ref="childRef" /> |
设置完成后,vue3可以通过ref方法获取:
1 | const childRef = ref(); |
调用:
1 | childRef.value.foo(); // foo |
2. vue2 和vue3的生命周期对比
vue2 的生命周期:
- 创建数据代理、数据检测
beforeCrate()
created() - 挂载
beforeMount()
mounted() - 更新
beforeUpdate()
updated() - 销毁
beforeDestroy()
destroyed() - activated 和 deactivated
activated()
deactivated() - 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中,生命周期有两种写法:
配置项的形式
组合式api的形式
配置项的形式:
1 | //配置项的形式使用生命周期钩子 |
组合式api的形式:
使用组合式api的形式,生命周期的名称发生了一些小变化,如下:
1 | beforeCreate -> 使用 setup() |
在使用生命周期时,需要先引入:
1 | import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted} from 'vue' |
![[Pasted image 20221118162448.png]]