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

相关推荐
蜡台5 天前
UniApp WebView 组件宽高设置与动态适配全方案
前端·javascript·uniapp·webview·iframe
路光.12 天前
uniapp中解决webview在app中调用,有过渡空白问题,增加过渡动效
uni-app·vue·app·uniapp
咸虾米_1 个月前
uniCloud服务空间从阿里云搬家迁移至支付宝云
阿里云·uniapp·unicloud·支付宝云·云开发服务空间
RuoyiOffice1 个月前
低代码平台荣耀不再:AI 浪潮下,企业系统为什么重新回到原生代码
人工智能·spring boot·低代码·ai·vue·uniapp·ruoyioffice
蜡台1 个月前
H5入住浙里办App详细步骤
vue·uniapp·h5·浙政钉
77美式1 个月前
手机端键盘弹出导致页面抖动
前端·javascript·uniapp
咸虾米_2 个月前
uni-id-pages解决自动管理token续期,以及token过期客户端自动跳转登录页面的功能
uniapp·unicloud·uni-id
阿凤212 个月前
后端返回文件二进制流
开发语言·前端·javascript·uniapp
阿凤212 个月前
后端返回数据流的格式
开发语言·前端·javascript·uniapp
绝世唐门三哥2 个月前
uniapp系列-uniappp都有哪些生命周期?
vue.js·小程序·uniapp