如何使用Vue3的onMounted钩子函数及vue3中onMounted的用法详解

 更新时间:2024年11月15日 10:27:48   作者:watermelo37  
本文详细介绍了Vue3中的`onMounted`钩子函数的前世今生,包括其在Vue2中的前身`mounted`钩子,以及Vue3中使用Composition API的`onMounted`钩子的用法,文章涵盖了`onMounted`的多种用法,感兴趣的朋友跟随小编一起看看吧

一、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钩子函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue实现验证码登录的方法实例

    Vue实现验证码登录的方法实例

    最近在自己写页面,然后写登录注册UI的时候需要一个验证码组件,去搜一下没找到什么合适的,于是自己写一个,这篇文章主要给大家介绍了关于Vue实现验证码登录的相关资料,需要的朋友可以参考下
    2022-03-03
  • Vue-router 类似Vuex实现组件化开发的示例

    Vue-router 类似Vuex实现组件化开发的示例

    本篇文章主要介绍了Vue-router 类似Vuex实现组件化开发的示例,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • vue-admin-template 动态路由的实现示例

    vue-admin-template 动态路由的实现示例

    本文主要介绍了ue-admin-template动态路由的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • vue2使用element-ui,el-table不显示,用npm安装方式

    vue2使用element-ui,el-table不显示,用npm安装方式

    这篇文章主要介绍了vue2使用element-ui,el-table不显示,用npm安装方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • vue实现鼠标滑动展示tab栏切换

    vue实现鼠标滑动展示tab栏切换

    这篇文章主要为大家详细介绍了vue实现鼠标滑动展示tab栏切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 详解Vue 开发模式下跨域问题

    详解Vue 开发模式下跨域问题

    本篇文章主要介绍了Vue 开发模式下跨域问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue使用element-ui实现菜单导航

    Vue使用element-ui实现菜单导航

    这篇文章主要为大家详细介绍了Vue使用element-ui实现菜单导航,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Vue Router动态路由使用方法总结

    Vue Router动态路由使用方法总结

    这篇文章主要介绍了Vue Router动态路由使用方法总结,需要的朋友可以参考下
    2023-10-10
  • vue3中el-table实现多表头并表格合并行或列代码示例

    vue3中el-table实现多表头并表格合并行或列代码示例

    这篇文章主要给大家介绍了关于vue3中el-table实现多表头并表格合并行或列的相关资料,文中通过代码介绍的非常详细,对大家学习或者使用vue具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-02-02
  • vue2中@hook的解析与妙用实例

    vue2中@hook的解析与妙用实例

    vue-hooks是简化组件定义、复用状态逻辑的一种最新尝试,下面这篇文章主要给大家介绍了关于vue2中@hook的解析与妙用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03

最新评论