当前位置: 首页 > news >正文

vue3和uniapp的生命周期

vue3生命周期:

1. onBeforeMount - 组件挂载之前调用

  • 触发时机:模板编译完成,但未挂载到 DOM 时。
  • 典型用途
    • 初始化无需 DOM 的数据(如预处理数据格式)。
    • 注册临时事件监听(如全局事件总线)。
    • 准备挂载所需的配置参数。
onBeforeMount(() => {// 预处理列表数据格式rawList.value = rawList.value.map(item => ({ ...item, status: 'init' }));// 注册全局事件eventBus.on('refresh', handleRefresh);
});

2. onMounted - 组件挂载完成后调用

  • 触发时机:组件 DOM 已挂载,可访问真实节点。
  • 典型用途
    • 操作 DOM(如获取元素尺寸、初始化 Canvas)。
    • 加载依赖 DOM 的第三方库(如地图、图表)。
    • 发起首次数据请求(非页面级的组件数据)。
onMounted(() => {// 获取元素高度const height = refDom.value?.offsetHeight;// 初始化 ECharts 图表const chart = echarts.init(refDom.value);// 加载组件专属数据fetchComponentData();
});

3. onBeforeUpdate - 组件更新之前调用

  • 触发时机:响应式数据变化,DOM 即将更新时。
  • 典型用途
    • 记录更新前的 DOM 状态(如滚动位置)。
    • 中断不必要的更新(如数据未实际变化时)。
    • 清理更新前的临时数据。
onBeforeUpdate(() => {// 记录滚动位置,更新后恢复scrollTop.value = window.scrollY;// 清理临时标记tempFlag.value = false;
});

4. onUpdated - 组件更新完成后调用

  • 触发时机:DOM 已完成更新后。
  • 典型用途
    • 基于新 DOM 执行操作(如重新计算元素位置)。
    • 同步更新第三方库(如图表数据变化后重绘)。
    • 恢复更新前记录的状态(如滚动位置)。
onUpdated(() => {// 重绘图表chart.setOption({ series: newData });// 恢复滚动位置window.scrollTo(0, scrollTop.value);
});

5. onBeforeUnmount - 组件卸载之前调用

  • 触发时机:组件即将卸载,DOM 尚未移除时。
  • 典型用途
    • 确认是否允许卸载(如表单未保存时提示)。
    • 移除全局事件监听或定时器。
    • 保存组件当前状态(如临时草稿)。
onBeforeUnmount(() => {// 提示未保存的表单if (isDirty.value) confirm('数据未保存,确定离开?');// 清除定时器clearInterval(timer.value);// 移除全局事件eventBus.off('refresh', handleRefresh);
});

6. onUnmounted - 组件卸载完成后调用

  • 触发时机:组件已从 DOM 移除,所有子组件也已卸载。
  • 典型用途
    • 释放大型资源(如销毁图表实例、关闭 WebSocket)。
    • 清理内存泄漏风险的引用(如移除事件总线的所有监听)。
    • 上报组件生命周期结束日志。
onUnmounted(() => {// 销毁图表实例chart.dispose();// 关闭 WebSocket 连接socket.close();// 上报日志reportEvent('component_unmounted', { name: 'UserCard' });
});

vue3特殊生命周期钩子:

1. onActivated - 缓存组件激活时

  • 触发时机:被 <keep-alive> 缓存的组件重新显示时。

  • 典型用途

    • 恢复组件状态(如表单输入值、滚动位置)。
    • 重启定时器或轮询请求。
    • 刷新时效性数据(如实时消息数)。
  • 示例

    onActivated(() => {// 恢复滚动位置listRef.value?.scrollTo({ top: savedScrollTop.value });// 重启消息轮询startMessagePolling();
    });
    

2. onDeactivated - 缓存组件失活时

  • 触发时机:被 <keep-alive> 缓存的组件隐藏时。

  • 典型用途

    • 暂存组件状态(如当前滚动位置、表单草稿)。
    • 暂停定时器或轮询(避免后台无效消耗)。
    • 停止视频 / 音频播放。
  • 示例

    onDeactivated(() => {// 保存滚动位置savedScrollTop.value = listRef.value?.scrollTop || 0;// 暂停轮询stopMessagePolling();// 暂停视频videoRef.value?.pause();
    });
    

3. onErrorCaptured - 捕获子组件错误

  • 触发时机:子组件抛出错误时(包括生命周期、事件回调等)。

  • 典型用途

    • 捕获并处理子组件错误(避免页面崩溃)。
    • 记录错误日志(如错误堆栈、发生时间)。
    • 显示友好的错误提示(替代白屏)。
  • 示例

    onErrorCaptured((err, instance, info) => {// 记录错误日志logError({ message: err.message, stack: err.stack, info });// 显示错误提示showErrorToast('组件加载失败,请重试');// 返回 true 阻止错误继续向上传播return true;
    });
    

4. onRenderTracked - 跟踪响应式依赖(调试用)

  • 触发时机:组件渲染过程中,跟踪到响应式数据被使用时。

  • 典型用途

    • 调试响应式依赖(如查看哪些数据影响了渲染)。
    • 分析不必要的依赖(优化性能)。
  • 示例

    onRenderTracked((event) => {// 打印跟踪到的依赖(开发环境用)console.log('跟踪到依赖:', event.target, '依赖属性:', event.key);
    });
    

5. onRenderTriggered - 响应式依赖触发更新(调试用)

  • 触发时机:响应式数据变化导致组件重新渲染时。

  • 典型用途

    • 调试意外的重渲染(如找到不合理的依赖导致的频繁更新)。
    • 分析更新原因(哪个数据变化触发了渲染)。
  • 示例

    onRenderTriggered((event) => {// 打印触发更新的原因(开发环境用)console.log('触发更新:', event.target, '变化的数据:', event.key);
    });
    

uniapp生命周期:

  • onLaunch - 应用启动时触发(在 App.vue 中使用)
    • 触发时机:被 <keep-alive> 缓存的组件重新显示时。
    • 典型用途
      • 恢复组件状态(如表单输入值、滚动位置)。
      • 重启定时器或轮询请求。
      • 刷新时效性数据(如实时消息数)。
  • onShow - 应用/页面显示时触发
  • onHide - 应用/页面隐藏时触发
  • onLoad - 页面加载时触发
  • onReady - 页面初次渲染完成时触发
  • onUnload - 页面卸载时触发
  • onPullDownRefresh - 下拉刷新时触发
  • onReachBottom - 页面滚动到底部时触发

1. onLaunch - 应用启动时(仅 App.vue)

  • 触发时机:小程序 / 应用首次启动时(全局只触发一次)。

  • 典型用途

    • 初始化全局数据(如用户信息、配置参数)。
    • 检查登录状态(如 token 有效性)。
    • 加载全局资源(如字体、主题配置)。
  • 示例

    // App.vue 中
    onLaunch(() => {// 检查本地存储的 tokenconst token = uni.getStorageSync('token');if (token) {initUserInfo(); // 初始化用户信息} else {uni.navigateTo({ url: '/pages/login' }); // 跳转登录页}
    });
    

2. onShow - 应用 / 页面显示时

  • 触发时机:应用从后台切前台、页面从隐藏到显示时(包括首次加载)。

  • 典型用途

    • 刷新页面数据(如首页商家列表、消息通知数)。
    • 启动定时器(如倒计时、实时刷新)。
    • 恢复播放音频 / 视频。
  • 示例

    onShow(() => {// 刷新首页数据fetchHomeData();// 启动倒计时countDownTimer.value = setInterval(updateCountDown, 1000);// 恢复视频播放uni.createVideoContext('video').play();
    });
    

3. onHide - 应用 / 页面隐藏时

  • 触发时机:应用切后台、页面跳转至其他页面时。

  • 典型用途

    • 暂停定时器 / 轮询(减少资源消耗)。
    • 保存临时状态(如表单未提交内容)。
    • 暂停媒体播放。
  • 示例

    onHide(() => {// 清除倒计时clearInterval(countDownTimer.value);// 保存表单草稿uni.setStorageSync('formDraft', formData.value);// 暂停音频uni.createInnerAudioContext().pause();
    });
    

4. onLoad - 页面加载时

  • 触发时机:页面首次创建并加载到页面栈时(仅一次)。

  • 典型用途

    • 接收页面跳转参数(如 options.id)。
    • 初始化页面基础数据(不依赖显示状态的数据)。
    • 注册页面级事件(如监听全局状态变化)。
  • 示例

    onLoad((options) => {// 获取路由参数(如商品 ID)goodsId.value = options.id as string;// 初始化基础配置initPageConfig();// 监听全局主题变化store.watch((state) => state.theme, updateTheme);
    });
    

5. onReady - 页面初次渲染完成

  • 触发时机:页面首次渲染完成(类似 Vue 的 onMounted,但针对页面)。

  • 典型用途

    • 执行依赖页面渲染的操作(如获取页面元素尺寸)。
    • 初始化页面级第三方库(如地图组件)。
    • 调整页面布局(如动态设置导航栏样式)。
  • 示例

    onReady(() => {// 获取滚动容器高度uni.createSelectorQuery().select('#scroll-view').boundingClientRect((rect) => {scrollHeight.value = rect.height;}).exec();// 初始化地图initMap();
    });
    

6. onUnload - 页面卸载时

  • 触发时机:页面从页面栈中移除(如 uni.redirectTo/uni.navigateBack 导致销毁)。

  • 典型用途

    • 清理页面级资源(如关闭页面专属的 WebSocket)。
    • 移除全局事件监听(避免内存泄漏)。
    • 提交页面最终状态(如保存用户操作记录)。
  • 示例

    onUnload(() => {// 关闭页面 WebSocket 连接pageSocket.close();// 移除全局事件uni.off('globalEvent', handleGlobalEvent);// 上报页面停留时长reportStayTime(pageId.value, stayTime.value);
    });
    

7. onPullDownRefresh - 下拉刷新时

  • 触发时机:用户下拉页面触发刷新(需在 pages.json 中配置允许下拉)。

  • 典型用途

    • 强制刷新页面数据(如列表重置为第一页)。
    • 重置页面状态(如清空筛选条件)。
  • 示例

    onPullDownRefresh(() => {// 重置页码并重新请求数据currentPage.value = 1;fetchListData().then(() => {uni.stopPullDownRefresh(); // 停止下拉刷新动画});
    });
    

8. onReachBottom - 页面滚动到底部

  • 触发时机:页面滚动至底部(可在 pages.json 中配置距离底部的阈值)。

  • 典型用途

    • 实现分页加载(如加载下一页数据)。
    • 显示 “回到顶部” 按钮。
  • 示例

    onReachBottom(() => {// 加载下一页数据(避免重复请求)if (!isLoading.value && hasMore.value) {currentPage.value++;fetchListData();}// 显示回到顶部按钮showBackToTop.value = true;
    });
    
http://www.dtcms.com/a/461801.html

相关文章:

  • uniapp 防止长表单数据丢失方案,缓存表单填写内容,放置卡退或误操作返回。
  • uniapp | 图片上传的两种实现方式(传统VS组件)
  • Android NDK 命令规范
  • C语言 分支结构(2)
  • 哪个做app的网站好排版设计技巧
  • 如何鉴赏网站论文wordpress静态nginx规则
  • 数据库存储中的哈希表和B+树
  • 绵阳网站推广优化和田知名网站建设企业
  • MQTT 协议应用指导
  • 蘑菇采摘公司:Mycionics
  • billfish本地资源库占内存吗
  • 深度残差网络(ResNet)
  • 专题五:位运算~
  • C++语言编程规范-资源分配和释放
  • 影视广告网站重庆网站建设制作
  • Hadess入门到实战(9) - 如何管理Composer(PHP)制品
  • 如何设计公司官网站苏宁易购网站风格
  • wx小程序扫码入口方式
  • Agent 开发设计模式(Agentic Design Patterns )第 1 章:提示词链
  • asp美食网站源码天津网站推广
  • 图像处理踩坑:浮点数误差导致的缩放尺寸异常与解决办法
  • Android Studio Meerkat 打开flutter项目没有自动选中main.dart configuration
  • OpenTiny TinyEngine 基础知识
  • 大模型-旋转位置编码(Rotary Positional Embedding)
  • 如何减小ES和mysql的同步时间差
  • this.$router.push 与 this.$router.replace 跳转的区别
  • 网站域名到期时间查询网站建设蛋蛋28
  • 建设网站选题应遵循的规则网站网页打开的速度什么决定的
  • 【Servlet】使用idea2023创建Servlet JavaWeb
  • 异步串口通信和逻辑分析仪