【面试】在Vue3中,beforeCreate和created钩子函数有什么区别?
在 Vue 3 里,
beforeCreate
和created
这两个钩子函数在选项式 API 中依然存在,不过在组合式 API
里有了不同的体现方式。下面为你详细介绍它们的区别:
选项式 API 中的区别
1. 触发时机
beforeCreate
:在实例初始化之后,数据观测(data
)和event/watcher
事件配置之前被调用。这意味着在beforeCreate
钩子函数中,组件实例还未完成数据和方法的初始化,this
虽然已经存在,但无法访问data
中的数据和methods
里的方法。created
:实例已经创建完成之后被调用。此时,实例已经完成了数据观测、property
和method
的计算、watch/event
事件回调的配置等。可以通过this
访问data
中的数据和methods
里的方法,但挂载阶段还没有开始,$el
属性目前不可用。
2. 可用资源
beforeCreate
:由于数据和方法还未初始化,所以这个阶段可操作的资源非常有限。不过可以进行一些全局配置或者初始化日志记录等操作,因为在这个阶段还未涉及到组件的具体数据和业务逻辑。例如:
export default {
beforeCreate() {
// 初始化日志记录器
const logger = new Logger();
this.$logger = logger;
logger.log('Component initialization started');
}
}
created
:可以访问和操作data
中的数据以及methods
里的方法,因此适合进行数据的初始化和异步请求。比如从后端获取初始数据,为组件渲染做准备:
export default {
data() {
return {
userData: null
};
},
async created() {
try {
const response = await fetch('https://api.example.com/user');
this.userData = await response.json();
} catch (error) {
console.error('Failed to fetch user data:', error);
}
}
}
组合式 API 中的体现
在组合式 API 中,没有直接对应的 beforeCreate
和 created
钩子函数。setup
函数在组件初始化时执行,其执行时机相当于 beforeCreate
和 created
之间,并且 setup
函数内部的代码逻辑涵盖了这两个钩子的部分功能。
setup
函数开始部分类似beforeCreate
:在setup
函数刚开始执行时,组件的数据和方法还未完全初始化,和beforeCreate
一样,此时无法访问this
。setup
函数后续代码类似created
:在setup
函数中可以创建响应式数据、定义方法,这些操作类似于在created
钩子中对数据和方法的初始化。例如:
<template>
<div>{{ userData }}</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
// 初始化响应式数据,类似 created 中对 data 的初始化
const userData = ref(null);
// 模拟异步请求获取数据
onMounted(async () => {
try {
const response = await fetch('https://api.example.com/user');
userData.value = await response.json();
} catch (error) {
console.error('Failed to fetch user data:', error);
}
});
</script>
综上所述,beforeCreate
和 created
在触发时机和可用资源上存在明显区别,可以根据具体需求在不同的钩子函数中执行相应的操作。在组合式 API 中,使用 setup
函数来实现类似的功能。