开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第16天,点击查看活动详情
vue3生命周期
vue3中的生命周期和vue2的生命周期不一样。主要差异就是多了一个setup钩子,取代了之前的creat相关的钩子。而且不再有destroy相关的生命周期了,取而代之的是unmount相关的生命周期。具体流程如下:
生命周期如图所示:
setup
setup是vue3新出来的概念,是组合函数里面的一个生命周期钩子,这个钩子函数中的代码是最先执行的,而且是在create阶段之前执行的。在这个阶段创建data和method。相当于是vue2的create阶段。
<script setup>
import { onBeforeMount } from 'vue';
import { updateData } from '../hooks/updateData';
const { fullname, person, updateInfo } = updateData();
console.log('setup');
</script>
效果如下:
此时在setup中定义的所有内容都会在这个阶段执行。
beforeMount
注册一个钩子,在组件被挂载之前被调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。
<template>
<div class="hello">
<div>姓名:{{fullname}}</div>
<div>年龄:{{person.age}}</div>
<div>朋友:{{person.friend.name}}-{{person.friend.age}}</div>
<div v-for="(item, index) in person.hobbies" :key="index">爱好列表
<div>{{item}}</div>
</div>
<button @click="updateInfo">修改信息</button>
</div>
</template>
<script setup>
import { onBeforeMount } from 'vue';
import { updateData } from '../hooks/updateData';
const { fullname, person, updateInfo } = updateData();
console.log('setup');
onBeforeMount(() => {
const dom = document.querySelector('.hello');
console.log('beforeMount', dom);
})
</script>
效果如下:
mounted
注册一个回调函数,在组件挂载完成后执行。 组件在以下情况下被视为已挂载:
- 其所有同步子组件都已经被挂载 (不包含异步组件或
<Suspense>树内的组件)。 - 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。
<template>
<div class="hello">
<div>姓名:{{fullname}}</div>
<div>年龄:{{person.age}}</div>
<div>朋友:{{person.friend.name}}-{{person.friend.age}}</div>
<div v-for="(item, index) in person.hobbies" :key="index">爱好列表
<div>{{item}}</div>
</div>
<button @click="updateInfo">修改信息</button>
</div>
</template>
<script setup>
import { onBeforeMount, onMounted } from 'vue';
import { updateData } from '../hooks/updateData';
const { fullname, person, updateInfo } = updateData();
console.log('setup');
onBeforeMount(() => {
const dom = document.querySelector('.hello');
console.log('beforeMount', dom);
});
onMounted(() => {
const dom = document.querySelector('.hello');
console.log('mounted', dom);
})
</script>
效果如下:
beforeUpdate
注册一个钩子,在组件即将因为响应式状态变更而更新其 DOM 树之前调用。 这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。
<template>
<div class="hello" :class="className">
<div>姓名:{{fullname}}</div>
<div>年龄:{{person.age}}</div>
<div>朋友:{{person.friend.name}}-{{person.friend.age}}</div>
<div v-for="(item, index) in person.hobbies" :key="index">爱好列表
<div>{{item}}</div>
</div>
<button @click="updateName">修改信息</button>
</div>
</template>
<script setup>
import { ref, onBeforeMount, onMounted, onBeforeUpdate } from 'vue';
import { updateData } from '../hooks/updateData';
const { fullname, person } = updateData();
console.log('setup');
const className = ref('');
const updateName = () => {
className.value = 'test';
}
onBeforeMount(() => {
const dom = document.querySelector('.hello');
console.log('beforeMount', dom);
});
onMounted(() => {
const dom = document.querySelector('.hello');
console.log('mounted', dom);
});
onBeforeUpdate(() => {
const dom = document.querySelector('.test');
console.log('beforeUpdate', dom);
})
</script>
效果如下:
updated
注册一个回调函数,在组件因为响应式状态变更而更新其 DOM 树之后调用。 父组件的更新钩子将在其子组件的更新钩子之后调用。
这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。如果你需要在某个特定的状态更改后访问更新后的 DOM,请使用 nextTick() 作为替代。
<template>
<div class="hello" :class="className">
<div>姓名:{{fullname}}</div>
<div>年龄:{{person.age}}</div>
<div>朋友:{{person.friend.name}}-{{person.friend.age}}</div>
<div v-for="(item, index) in person.hobbies" :key="index">爱好列表
<div>{{item}}</div>
</div>
<button @click="updateName">修改信息</button>
</div>
</template>
<script setup>
import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, nextTick } from 'vue';
import { updateData } from '../hooks/updateData';
const { fullname, person } = updateData();
console.log('setup');
const className = ref('');
const updateName = () => {
className.value = 'test';
}
onBeforeMount(() => {
const dom = document.querySelector('.hello');
console.log('beforeMount', dom);
});
onMounted(() => {
const dom = document.querySelector('.hello');
console.log('mounted', dom);
});
onBeforeUpdate(() => {
const dom = document.querySelector('.test');
console.log('beforeUpdate', dom);
});
onUpdated(() => {
nextTick(() => {
const dom = document.querySelector('.test');
console.log('Updated', dom);
})
})
</script>
效果如下:
beforeUnmount
注册一个钩子,在组件实例被卸载之前调用。当这个钩子被调用时,组件实例依然还保有全部的功能。
import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, nextTick, onBeforeUnmount } from 'vue'
onBeforeUnmount(() => {
const dom = document.querySelector('.hello');
console.log('beforeUnmount', dom);
})
unmounted
onUnmounted(() => {
console.log('unmount');
});