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 仅在页面初次创建时触发一次。理解这一点对处理页面数据和交互至关重要。

相关推荐
宠友信息2 天前
社交软件源码哪个渠道好
java·微服务·架构·社交电子·springboot·uniapp
Fate_I_C3 天前
uniappx 鸿蒙运行包制作失败
华为·uni-app·uniapp·harmonyos
咸虾米_17 天前
使用uniCloud阿里云服务空间的天塌了,云函数计费规则调整了
阿里云·云计算·uniapp·unicloud
蜡台18 天前
SSE WebSocket Socket.IO 三者使用及区别
websocket·网络协议·uniapp·sse·socket.io·eventsource
路光.1 个月前
uniappVue2升级Vue3内存溢出解决方式
vue·vue3·uniapp
小马_xiaoen1 个月前
常规优化已用尽?小程序体积深层次优化实战!!!
前端·小程序·uniapp
CherishXt1 个月前
修复IM完整版接入小程序后,聊天页面键盘弹起时,页面高度错误问题
vue.js·小程序·uniapp·im
Rysxt_2 个月前
Uniapp全局配置教程
前端·uniapp
嗯嗯**2 个月前
HBuilder学习1:概述、网站快速免费打包成apk
uniapp·apk·hbuilder·url快速打包成apk·网站快速打包成apk
CherishXt2 个月前
对接腾讯IM,实现个人业务系统页面按钮直接跳转到和用户的聊天页面(不需要加好友)
uniapp·即时通讯·im