onload不执行的根本原因是未通过@ dcloudio/uni-app导入并注册。必须import { onload }后在setup内调用,不可在组件中或setup外定义,且仅页面级有效。

直接说结论:onLoad 不执行,基本是因为你把它写成了普通函数,或者用在了错误的位置(比如组件里),而不是通过 @dcloudio/uni-app 提供的组合式 API 正确注册。
为什么 onLoad 在 <script setup></script> 里不执行
在 <script setup></script> 中直接声明 function onLoad() { ... },UniApp 运行时根本不会识别——它不是 Vue 的钩子,也不是自动挂载的全局函数,必须显式导入并调用注册。
- 错误写法:
function onLoad(query) { console.log(query) }→ 完全静默,不触发 - 正确路径:必须从
@dcloudio/uni-app导入onLoad,并在setup内调用它传入回调 - 注意:不能在
setup外部定义,也不能放在methods或const变量里
onLoad 必须用 import { onLoad } from '@dcloudio/uni-app'
这是唯一可靠的方式。Vue 3 的组合式 API 下,所有 UniApp 页面生命周期都得走这个包导出的函数注册,否则一律失效。
- 示例代码:
import { onLoad, onReady } from '@dcloudio/uni-app' import { ref } from 'vue' export default { setup() { const data = ref(null) onLoad((query) => { console.log('收到页面参数', query) // 这里可以发起请求、赋值等 data.value = query.id }) onReady(() => { console.log('DOM 已就绪,可操作节点') }) return { data } } } - 如果你用的是 TypeScript,确保
@dcloudio/uni-app已安装且类型声明可用(npm install -D @types/uni-app) - 不要混用
export default { onLoad() { ... } }(Options API 风格)和<script setup></script>,会冲突
组件里写 onLoad 肯定不生效
这是高频误踩点:onLoad 是页面级生命周期,只对 pages.json 里注册的页面有效。你在自定义组件(哪怕嵌在页面里)中写 onLoad,UniApp 直接忽略。
- 现象:组件内
onLoad函数存在,但完全不打印、不执行 - 替代方案:组件内用
onMounted(Vue 3)或mounted(Vue 2),它们始终有效 - 如果组件需要页面参数,让父页面通过 props 传入,别试图在组件里“抢”
onLoad
页面跳转后 onLoad 没触发?先查路由配置
跳转路径不对、没走 uni.navigateTo、或用了 redirect 而非 navigateTo,都会导致目标页根本没加载,自然没有 onLoad。
- 检查
pages.json是否已注册该页面路径,拼写是否完全一致(包括大小写) - 确认跳转代码是
uni.navigateTo({ url: '/pages/user/detail' }),不是/user/detail缺少前缀 - 小程序真机调试时,
onLoad参数来自 URL query,如果跳转没带参数,query是空对象,不是undefined
最常被忽略的一点:onLoad 的回调函数必须在 setup() 执行期间注册,延迟注册(比如包裹在 setTimeout 或异步链里)会导致错过生命周期时机,永远不执行。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










