今天的学习依旧是经典面试题,先看知识,再看实际业务场景。
Vue3.x生命周期钩子
- beforeCreate: 在实例初始化之后,数据观测 (data observer) 和事件/watcher 事件配置之前被调用。
- created: 在实例创建完成后被立即调用。
- beforeMount: 在挂载之前被调用,即将开始渲染 DOM。
- onBeforeMount: Vue 3 中新增的生命周期钩子,与
beforeMount类似,在挂载之前被调用。 - mounted: 在挂载完成后被调用,实例已经插入到 DOM 中。
- onMounted: Vue 3 中新增的生命周期钩子,与
mounted类似,在挂载完成后被调用。 - beforeUpdate: 在数据更新之前被调用,发生在虚拟 DOM 重新渲染和打补丁之前。
- onBeforeUpdate: Vue 3 中新增的生命周期钩子,与
beforeUpdate类似,在数据更新之前被调用。 - updated: 在数据更新之后被调用,发生在虚拟 DOM 重新渲染和打补丁之后。
- onUpdated: Vue 3 中新增的生命周期钩子,与
updated类似,在数据更新之后被调用。 - beforeUnmount: 在实例销毁之前被调用。
- onBeforeUnmount: Vue 3 中新增的生命周期钩子,与
beforeUnmount类似,在实例销毁之前被调用。 - unmounted: 在实例销毁后被调用。
- onUnmounted: Vue 3 中新增的生命周期钩子,与
unmounted类似,在实例销毁后被调用。
onMounted
addEventListener
在Vue3中,什么时候必须使用addEventListener
- 给整个文档添加监听
onMounted(() => {
document.body.addEventListener('click', handleBodyClick)
})
- 动态添加事件 (但没有太理解,觉得也是可以用@click替代)
onMounted(() => {
if (wrapperRef.value) {
(wrapperRef.value as Element).addEventListener('click', fn)
}
})
发送网络请求
onMounted(async () => {
const res = await getxxList()
tableData.value = res.data as SearchResultModel[]
})
onBeforeUnmount销毁之前
removeEventListener
onBeforeUnmount(() => {
document.body.removeEventListener('click', handleBodyClick)
})
onBeforeUnmount(() => {
if (wrapperRef.value) {
(wrapperRef.value as Element).removeEventListener('click', fn)
}
})
关闭eventBus
if (eventBus) {
eventBus.on('fn', fn)
onBeforeUnmount(() => {
eventBus.off('fn', fn)
})
}
自定义资源,如清理定时器
最早发送网络请求是created还是onMounted
-
请求是否依赖于 DOM 元素
created钩子在组件实例创建后立即调用,此时组件的 DOM 元素还没有被挂载到页面上。如果你的请求不依赖于 DOM 元素,可以在这里发起。onMounted钩子在组件的 DOM 元素已经挂载到页面上后调用,通常用于执行需要访问 DOM 元素的操作。如果你的请求需要获取或操作页面上的元素,可以在这里发起。
-
首次渲染性能优化使用onMounted
- 有时为了提高首次渲染的性能,可以在组件加载前只加载必要的数据,而将其他数据的请求推迟到
onMounted钩子中。 - 这可以减少组件加载时的数据负担,使页面更快地呈现给用户。
- 有时为了提高首次渲染的性能,可以在组件加载前只加载必要的数据,而将其他数据的请求推迟到
keep-alive
keep-alive会对组件进行缓存,这个时候,就不能使用mounted生命周期钩子对数据进行获取,有两种方式:
-
onActivated
keep-alive之后,组件不会重新创建,而onActivated会在组件被激活(从缓存中取出并重新展示)被触发。这是专门用于已经缓存的组件激活时触发,是keep-alive特有的生命周期钩子。
-
onBeforeRouteEnter
keep-alive和路由守卫的onBeforeRouteEnter结合使用,可以在路由切换时,决定是否重新渲染缓存的组件。