uniapp vue3 常用的生命周期和作用使用时机

在 uni-app + Vue3 项目中,会接触到三类生命周期,我按重要程度和应用范围排了序,每个都会配上一个简洁的使用示例。

📊 UniApp Vue3 三类生命周期

  • 1. 应用生命周期 (App.vue) :控制应用启动、前后台切换和全局异常。最重要的两个钩子是从 @dcloudio/uni-app 中导入的 onLaunchonShow

  • 2. 页面生命周期 (pages目录下的vue文件) :核心生命周期,控制页面加载、渲染、显示隐藏等。最重要的钩子是从 @dcloudio/uni-app 中导入的 onLoad, onShow, onReady

  • 3. 组件生命周期 (components目录下的vue文件) :原生 Vue3 组件生命周期,控制组件挂载、更新和销毁。最重要的钩子是从 vue 中导入的 onMounted, onBeforeUnmount, onUpdated


1. 应用生命周期(核心,必须在 App.vue 中使用)

控制应用的启动、前后台切换和异常捕获。

  • onLaunch :应用初始化完成时触发,全局只触发一次

    • 作用:进行全局性的、只需执行一次的任务。

    • 时机最早,适合做全局初始化、获取系统信息、检查登录状态、全局变量定义等。

    • 示例

      javascript 复制代码
      javascript
      
      // App.vue
      <script setup>
      import { onLaunch, onShow, onHide, onError } from '@dcloudio/uni-app';
      
      onLaunch(() => {
        console.log('App Launch');
        // 检查登录状态、获取系统信息等
        uni.getSystemInfo({
          success: (res) => {
            console.log('设备信息:', res);
          }
        });
      });
      
      onShow(() => {
        console.log('App Show');
        // 应用从后台切换到前台时,刷新数据或状态
      });
      
      onHide(() => {
        console.log('App Hide');
        // 应用切换到后台时,暂停某些操作(如轮询、音视频播放)
      });
      
      onError((err) => {
        console.error('App Error:', err);
        // 全局错误监控与上报
      });
      </script>

2. 页面生命周期(核心,用于 pages/ 下的页面组件)

从打开一个新页面到关闭它的完整过程,用于处理页面内的数据、网络请求和交互。

  • onLoad:页面加载时触发。

    • 作用:接收上个页面传递的参数,进行页面初始化操作、发起网络请求。

    • 时机 :页面加载时调用一次,有参数(上一个页面传递的数据)。

    • 示例

      javascript 复制代码
      javascript
      
      // pages/user/profile.vue
      <script setup>
      import { ref } from 'vue';
      import { onLoad, onShow } from '@dcloudio/uni-app';
      
      const userId = ref('');
      
      onLoad((option) => {
        console.log('接收到的参数:', option);
        userId.value = option.id;
        // 根据ID请求用户详情数据
        fetchUserDetail(option.id);
      });
      
      const fetchUserDetail = (id) => {
        // 模拟API请求
        console.log(`请求用户ID为 ${id} 的详情`);
      };
      </script>
  • onShow:页面显示/切入前台时触发。

    • 作用:页面每次显示都需要刷新的逻辑。

    • 时机频繁触发(从子页面返回、应用从后台切回等)。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { onShow } from '@dcloudio/uni-app';
      
      onShow(() => {
        console.log('页面显示');
        // 每次回到这个页面都刷新列表数据
        refreshList();
      });
      
      const refreshList = () => {
        console.log('刷新列表');
      };
      </script>
  • onReady:页面初次渲染完成时触发。

    • 作用:执行需要等待页面渲染完成的逻辑。

    • 时机:页面渲染完成后调用一次,此时可以操作页面元素。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { onReady } from '@dcloudio/uni-app';
      
      onReady(() => {
        console.log('页面渲染完成');
        // 可以在这里初始化图表、地图等需要DOM就绪的库
        initChart();
      });
      
      const initChart = () => {
        console.log('初始化图表');
      };
      </script>
  • onHide:页面隐藏/切入后台时触发。

    • 作用:页面隐藏时需要暂停或清理的工作。

    • 时机:页面不再可见时触发。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { onHide } from '@dcloudio/uni-app';
      
      onHide(() => {
        console.log('页面隐藏');
        // 暂停音视频播放、停止轮询等
        pauseVideo();
      });
      
      const pauseVideo = () => {
        console.log('暂停视频');
      };
      </script>
  • onUnload:页面卸载时触发。

    • 作用:清理页面产生的全局事件、定时器等资源。

    • 时机:页面被销毁时调用一次。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { onUnload } from '@dcloudio/uni-app';
      
      let timer = null;
      
      // 假设在某个地方启动了定时器
      timer = setInterval(() => {
        console.log('定时任务执行');
      }, 1000);
      
      onUnload(() => {
        console.log('页面卸载,清理资源');
        // 清除定时器,避免内存泄漏
        if (timer) clearInterval(timer);
      });
      </script>
  • onPullDownRefresh:下拉刷新时触发。

    • 作用:监听用户下拉刷新动作,加载最新数据。

    • 时机:用户主动下拉。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { onPullDownRefresh } from '@dcloudio/uni-app';
      
      onPullDownRefresh(() => {
        console.log('下拉刷新');
        // 请求新数据
        fetchNewData().then(() => {
          // 数据加载完成后停止下拉刷新动画
          uni.stopPullDownRefresh();
        });
      });
      
      const fetchNewData = async () => {
        return new Promise(resolve => {
          setTimeout(() => {
            console.log('数据已更新');
            resolve();
          }, 1000);
        });
      };
      </script>
  • onReachBottom:滚动到底部时触发。

    • 作用:实现列表的分页加载、上拉加载更多。

    • 时机:页面滚动到底部。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { ref } from 'vue';
      import { onReachBottom } from '@dcloudio/uni-app';
      
      const page = ref(1);
      
      onReachBottom(() => {
        console.log('触底加载更多');
        page.value++;
        loadMoreData(page.value);
      });
      
      const loadMoreData = (pageNum) => {
        console.log(`加载第 ${pageNum} 页数据`);
      };
      </script>
  • 其他页面生命周期onPageScroll(滚动监听)、onTabItemTap(点击tab)、onResize(窗口尺寸变化) 等。

3. 组件生命周期(核心,用于 components/ 下的组件)

控制组件的创建、挂载、更新和销毁过程。

  • setup():组合式 API 的入口。

    • 作用 :定义响应式数据、函数,替代 beforeCreatecreated

    • 时机最早,组件实例初始化之前。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { ref } from 'vue';
      
      // 定义响应式数据
      const count = ref(0);
      
      // 定义函数
      const increment = () => {
        count.value++;
      };
      </script>
  • onMounted:组件挂载完成时触发。

    • 作用:执行需要 DOM 就绪的操作,如操作 DOM 元素、初始化第三方库。

    • 时机:组件渲染完成后。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { onMounted } from 'vue';
      
      onMounted(() => {
        console.log('组件已挂载');
        // 可以安全地操作DOM
        // 初始化第三方库,如ECharts、Swiper等
      });
      </script>
  • onBeforeUnmount:组件销毁前触发。

    • 作用:清理副作用,如清除定时器、取消事件监听等,防止内存泄漏。

    • 时机:组件卸载之前。

    • 示例

      javascript 复制代码
      javascript
      
      <script setup>
      import { onBeforeUnmount } from 'vue';
      
      let timer = null;
      
      timer = setInterval(() => {
        console.log('定时任务');
      }, 1000);
      
      onBeforeUnmount(() => {
        console.log('组件即将销毁,清理定时器');
        if (timer) clearInterval(timer);
      });
      </script>
  • 其他组件生命周期onBeforeMount(挂载前)、onBeforeUpdate(更新前)、onUpdated(更新后)、onUnmounted(已销毁)、onActivated/onDeactivated(keep-alive专用)。

⏱️ 关键执行顺序

当 uni-app 页面加载时,各类生命周期的典型触发顺序如下:

页面首次加载

onLoad (页面加载) -> onShow (页面显示) -> onBeforeMount (组件挂载前) -> onReady (页面初次渲染完成) -> onMounted (组件挂载完成)

页面关闭/返回

onBeforeUnmount (组件销毁前) -> onUnload (页面卸载)

相关推荐
2501_916007471 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
Revolution611 小时前
一段 JavaScript 代码执行时,到底发生了什么
前端·javascript
会周易的程序员2 小时前
Mermaid Renderer:一款的图表可视化小工具
前端·vue.js·流程图·mermaid
To_OC10 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
To_OC12 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn12 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
এ慕ོ冬℘゜13 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
随心点儿14 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
kyriewen15 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
慧一居士17 小时前
Element Plus 按需引入的配置使用说明和完整示例
前端·vue.js