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

相关推荐
我有一个object8 小时前
uniapp上传文件报错:targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!
前端·javascript·vue.js·uniapp
奇风4 天前
uni-app + DevEco 鸿蒙跨平台应用开发实战1-环境安装分享
uniapp·harmonyos·鸿蒙应用开发·鸿蒙跨平台应用开发
IT教程资源C8 天前
(N_144)基于微信小程序在线订餐系统
mysql·vue·uniapp·前后端分离·订餐小程序·springboot订餐
IT教程资源D11 天前
[N_144]基于微信小程序在线订餐系统
mysql·vue·uniapp·前后端分离·订餐小程序·springboot订餐
二当家的素材网13 天前
【无标题】
vue·uniapp
IT教程资源D14 天前
[N_148]基于微信小程序网上书城系统
mysql·vue·uniapp·前后端分离·网上书城小程序·springboot书城
星光一影20 天前
打车/网约车、代驾、顺风车/拼车、货运、租车等多种出行服务的一站式解决方案
mysql·微信小程序·php·uniapp·html5·web app
星光一影20 天前
悬赏任务平台/拉新地推系统源码
redis·mysql·小程序·php·uniapp·html5
小禾青青20 天前
uniapp开发ai对话app,使用百度语音识别用户输入内容并展示到页面上
人工智能·百度·uni-app·uniapp
IT教程资源24 天前
N-158基于微信小程序学生社团管理系统
vue3·uniapp·前后端分离·springboot社团·社团小程序