一、onmounted的前世今生
1.1、onmounted是什么
onmounted钩子函数在组件实例被成功挂载后调用,此时你可以访问到 dom 元素。它返回一个函数,可以用于在组件卸载时进行清理(比如interval等)。
可以说onmounted钩子函数是最常用的钩子函数了,玩转onmounted钩子函数,是写出优雅的vue前端代码的关键步骤。
1.2、onmounted在vue2中的前身
1.2.1、vue2中的onmounted
在vue 2中,onmounted钩子的前身实际上是mounted生命周期钩子。在vue 2的options api中,生命周期钩子是作为组件的选项来定义的。
在vue 2的组件中,mounted钩子用于执行那些需要在组件实例挂载到dom之后运行的代码,这通常包括dom操作、数据请求等。
比如:
export default { data() { return { // 组件的数据 }; }, mounted() { // 组件挂载完成后的副作用操作 console.log('组件已挂载到dom'); // 可以执行dom操作或数据请求等 }, methods: { // 组件的方法 } };
1.2.2、vue2与vue3的onmounted对比
- vue 2:使用mounted作为组件的一个选项来执行挂载后的代码。
- vue 3:使用onmounted作为composition api的钩子来执行挂载后的代码。
在vue 3中,onmounted是composition api的一部分,它提供了更灵活的方式来组织组件的逻辑。vue 3的onmounted与vue 2的mounted在功能上相似,都是在组件挂载完成后执行,但onmounted作为composition api的一部分,可以更好地与其它composition api一起使用,提供更细粒度的控制和更好的组合性。
1.3、vue3中onmounted的用法
1.3.1、基础用法
这个没什么可说的,和watch、interval语法结构一样。
import { onmounted, ref } from 'vue'; export default { setup() { const count = ref(0); onmounted(() => { // 在这里可以执行dom操作或数据请求 console.log('组件已挂载'); }); // 也可以返回一个函数进行清理 return { count }; } };
1.3.2、顺序执行异步操作
onmounted 也常用于执行顺序异步操作,如发起网络请求。
import { onmounted, ref } from 'vue'; import axios from 'axios'; export default { setup() { const data = ref(null); onmounted(async () => { try { const response = await axios.get('https://api.example.com/data'); data.value = response.data; const response2 = await axios.get('https://api.example.com/data2'); data.value2 = response2.data; const response3 = await axios.get('https://api.example.com/data3'); data.value3 = response3.data; const response4 = await axios.get('https://api.example.com/data4'); data.value4 = response4.data; // ...更多的异步操作 } catch (error) { console.error('请求错误:', error); } }); return { data }; } };
1.3.3、并行执行多个异步操作
onmounted 也常用于执行并行异步操作,也可以发起网络请求。但据我实际使用的经历来看,异步操作能在首屏加载、大量图片等资源加载时发挥不错的作用。
import { ref, onmounted } from 'vue'; import axios from 'axios'; export default { setup() { // 声明响应式数据引用 const data = ref(null); const data2 = ref(null); const data3 = ref(null); const data4 = ref(null); onmounted(async () => { // 使用promise.all来处理并发的axios请求 await promise.all([ axios.get('https://api.example.com/data'), axios.get('https://api.example.com/data2'), axios.get('https://api.example.com/data3'), axios.get('https://api.example.com/data4') ]).then(responses => { // 所有请求成功完成后,更新响应式数据 data.value = responses[0].data; data2.value = responses[1].data; data3.value = responses[2].data; data4.value = responses[3].data; // 这里可以放置所有异步任务完成后的代码... }).catch(error => { // 处理请求中出现的任何错误 console.error('请求错误:', error); }); }); // 返回响应式状态供模板或其他composition api使用 return { data, data2, data3, data4 }; } };
1.3.4、执行一次性副作用
如果你需要执行一次性的副作用(side effect),onmounted 是一个理想的地方。
"副作用"(side effect)是指函数在执行时除了返回值之外对外部环境产生的影响。这些影响可能包括但不限于:
- 修改全局变量:改变在函数外部定义的变量的值。
- 执行i/o操作:如读写文件、网络请求、控制台日志输出等。
- 修改外部对象或数组:影响传入函数的参数对象或数组的状态。
- 触发事件:如点击事件、网络事件等。
- 定时器设置:设置 settimeout 或 setinterval。
这里是利用onmounted钩子函数在组件实例被成功挂载后调用的时序特性,这个组件实例已经挂载,页面首次渲染的时机。在这个阶段可以执行很多操作。
import { onmounted } from 'vue'; export default { setup() { onmounted(() => { // 执行一次性副作用 console.log('这是一个一次性副作用'); }); return {}; } };
1.3.5、清理工作(较少用)
onmounted 提供的函数可以用于注册清理工作,这在处理定时器或监听器时非常有用。不过在onmounted清理的比较少,我见到的在onbeforeunmount钩子函数清理定时器、监听器的比较多。
import { onmounted, ref } from 'vue'; export default { setup() { const count = ref(0); const intervalid = setinterval(() => { count.value++; }, 1000); // 注册清理工作 const cleanup = onmounted(() => { return () => { clearinterval(intervalid); console.log('定时器已清理'); }; }); return { count, cleanup }; } };
1.3.6、组合使用(特定情况用)
onmounted 可以与vue 3的其他composition api一起使用,以实现复杂的逻辑。这里主要是改变了watch的启动时机,本来是在setup阶段启动watch侦听器,但是这样写就变成了在onmounted阶段启动侦听器。
import { onmounted, ref, watch } from 'vue'; export default { setup() { const data = ref(null); onmounted(() => { // 可以组合使用其他composition api watch(data, (newvalue, oldvalue) => { console.log(`数据从 ${oldvalue} 变更为 ${newvalue}`); }); }); // 模拟数据变化 settimeout(() => { data.value = { name: '新数据' }; }, 2000); return { data }; } };
1.3.7、直接将封装好的函数传递给onmounted钩子函数调用
vue3中onmounted可以重复使用,多次使用,并不是像vue2那样要写在某一个对象里面。但一般不推荐多次使用,这相当于多个onmounted异步执行操作,分散地写只会降低long terms的可维护性,降低可读性,哪怕是为了迎合和充分利用composition api的特点,我也觉得弊大于利。
function task1() { // 初始化任务1 } function task2() { // 初始化任务2 } onmounted(task1); onmounted(task2);
二、总结
onmounted作为vue3中最常用的钩子函数之一,能够灵活、随心应手的使用是每个vue开发者的必修课,同时根据其不同写法的特性,来选择最合适最有利于维护的写法。
到此这篇关于如何使用vue3的onmounted钩子函数及vue3中onmounted的用法详解的文章就介绍到这了,更多相关vue3 onmounted钩子函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论