Uniapp 中 onShow 与 onLoad 的执行时机解析

Vue 中 onShowonLoad 的执行时机解析

在 Vue.js(标准 Vue)和 Uniapp 框架 中,生命周期钩子的执行机制存在差异,特别是你提到的 onShowonLoad

一、标准 Vue.js(浏览器环境)

1. 生命周期钩子

标准 Vue 没有 onShowonLoad 钩子,与之对应的是:

  • created:实例初始化后
  • mounted:DOM 挂载完成后
  • activated:组件被 keep-alive 缓存并激活时
  • updated:数据更新导致 DOM 重新渲染后
2. 执行顺序
复制代码
created -> mounted -> updated -> destroyed

二、Uniapp 框架(小程序环境)

1. 特有的生命周期钩子

Uniapp 为小程序环境扩展了原生生命周期钩子:

  • onLoad:页面加载时触发(初次创建)
  • onShow:页面显示时触发(每次显示)
  • onReady:页面初次渲染完成时触发
  • onHide:页面隐藏时触发
  • onUnload:页面卸载时触发
2. 执行顺序
  1. 首次进入页面

    复制代码
    onLoad -> onShow -> onReady
  2. 从其他页面返回当前页面

    复制代码
    onShow
  3. 页面隐藏(跳转到其他页面)

    复制代码
    onHide
  4. 页面卸载(如使用 uni.navigateBack()

    复制代码
    onUnload

三、关键区别

钩子 标准 Vue.js Uniapp(小程序)
onLoad 页面初次加载时触发
onShow 页面每次显示时触发
mounted DOM 挂载完成后触发 类似 onReady

四、你的问题解答

1. onShow 可能在 onLoad 之后吗?

是的,每次页面加载时onLoad 总是先于 onShow 执行:

javascript 复制代码
export default {
  onLoad(options) {
    console.log('页面加载:onLoad'); // 先执行
  },
  onShow() {
    console.log('页面显示:onShow'); // 后执行
  }
}
2. 常见场景
  • 首次进入页面onLoadonShow
  • 切换 TabBar 页面 :只触发 onShow(页面已缓存,不再触发 onLoad
  • 返回上一页 :只触发 onShow(页面已缓存)

五、使用建议

1. 数据获取
  • 只需要加载一次的数据 :放在 onLoad
  • 每次显示都需要更新的数据 :放在 onShow
javascript 复制代码
export default {
  onLoad() {
    // 初始化数据(只执行一次)
    this.fetchInitialData();
  },
  
  onShow() {
    // 刷新数据(每次页面显示时执行)
    this.refreshData();
  }
}
2. 性能优化

避免在 onShow 中执行大量计算或频繁请求数据,可结合 onLoad 和缓存机制:

javascript 复制代码
export default {
  data() {
    return {
      loaded: false,
      data: null
    }
  },
  
  onLoad() {
    if (!this.loaded) {
      this.fetchData();
      this.loaded = true;
    }
  },
  
  onShow() {
    // 只在需要时刷新
    if (this.needRefresh) {
      this.refreshData();
    }
  }
}

六、验证方法

在页面中添加日志:

javascript 复制代码
export default {
  onLoad(options) {
    console.log('onLoad 执行');
  },
  
  onShow() {
    console.log('onShow 执行');
  }
}

观察控制台输出,验证执行顺序:

  1. 首次进入页面:

    复制代码
    onLoad 执行
    onShow 执行
  2. 从其他页面返回:

    复制代码
    onShow 执行

总结

在 Uniapp 中,onShow 总是在 onLoad 之后执行(首次加载时),但 onShow 会在每次页面显示时触发,而 onLoad 仅在页面初次创建时触发一次。理解这一点对处理页面数据和交互至关重要。

相关推荐
9765033353 天前
iOS 上架 4.3a 被拒【uniapp专讲】
flutter·ios·objective-c·uniapp·swift
海鸥两三5 天前
小程序文档预览 · 进阶面试题
小程序·uni-app·uniapp
晴空蓝天6 天前
uniapp 上传图片别裸传:我给每个上传都加了个 biz 参数
小程序·uniapp·文件上传
RuoyiOffice7 天前
SpringBoot3+Vue3+Flowable 企业审批平台全链路:从表单设计、节点权限到移动审批怎么落地
spring boot·vue3·uniapp·springboot3·flowable·审批系统·ruoyi office
平凡シンプル9 天前
TCP UDP 网络通信插件 SL-Uniplugin-Tcp-Udp
网络·学习·uniapp·记录
qq_3508972115 天前
trea实用工具
vue.js·uniapp
97650333515 天前
iOS 上架/审核 4.3a全面解读-最新
flutter·ios·objective-c·uniapp
上单带刀不带妹16 天前
小程序图片缓存问题:时间戳和版本号解决图片不更新
缓存·小程序·vue·uniapp
爱折腾的编程老炮17 天前
潮玩品牌自建抽盒机小程序——商城 + 抽盒 + 一番赏 + 会员 + 社区,一套代码怎么搭
spring boot·小程序·vue·mybatis·uniapp
蜡台18 天前
ux-camera 跨平台相机组件
数码相机·vue·uniapp·camera·nvue·取景框