uni-app 的 setup 语法糖是平台特定编译规则,非 vue 3 原生:需加 lang="ts" 才自动解包 ref;生命周期必须顶层导入调用;api 如 navigateto 需显式引入;页面传参仅通过 onload 的 query 参数可靠获取。

uni-app 的 setup 语法糖不是 Vue 3 原生那一套,它依赖 @dcloudio/uni-cli 编译器做 AST 转换,所有行为都受平台约束——不导入就报错、不加 lang="ts" 就不自动解包、生命周期不能直接调用,这些不是“没写对”,而是设计如此。
为什么模板里写 count 没反应,非要写 count.value?
因为 uni-app 默认按 JS 处理 <script setup></script>,ref 不会自动解包。只有加了 lang="ts",编译插件才启用类型推导和响应式变量解包逻辑。
- 不加
lang="ts":{{ count }}渲染出来是[object Object],必须写{{ count.value }} - 加了
lang="ts":{{ count }}直接可用,ref、computed都自动解包 - 即使你不用 TypeScript,也得强制加——这不是为了类型检查,是为了让响应式变量在模板里“看起来像活的”
onLoad、onShow 这些生命周期怎么注册?
它们不是普通函数,也不能在 onMounted 里调用,必须在 <script setup></script> 顶层显式导入并调用。
- 正确写法:
import { onLoad, onShow } from '@dcloudio/uni-app'; onLoad((query) => { console.log(query); }); - 错误写法:
const onLoad = () => {}(覆盖全局钩子)、onMounted(() => { onLoad(...) })(根本不会注册) - 多个
onLoad会叠加执行,适合拆分逻辑,但注意参数只传一次 - 页面级生命周期只能在页面组件(如
pages/index/index.vue)里用,子组件里无效
uni.navigateTo 报 ReferenceError: navigateTo is not defined 怎么办?
uni 不是全局对象,API 必须显式导入,否则 H5 可能侥幸跑通,小程序和 App 平台一定失败。
- 推荐写法:
import { navigateTo } from '@dcloudio/uni-app'(uni-app 3.0+ 标准导出) - 不推荐写法:
import { uni } from '@dcloudio/uni-app'; uni.navigateTo(...)或window.uni.navigateTo - 漏掉
import是最常见原因;另一个坑是把 API 放在onMounted外部直接调用——它必须在响应式上下文或生命周期内执行 - 路由跳转参数拼接建议用对象形式:
navigateTo({ url: '/pages/detail/detail?id=' + id }),避免手动拼 URL 出错
页面传参和接参怎么写才可靠?
传参靠 navigateTo 的 url 字符串,接参靠 onLoad 回调的 query 参数——这是 uni-app 唯一稳定支持的方式,不要试图用 getCurrentInstance() 拿 $scope.options。
- 传参示例:
navigateTo({ url: '/pages/detail/detail?id=123&name=test' }) - 接参示例:
onLoad((query) => { const id = query.id; const name = query.name; }) -
query是字符串对象,所有值都是字符串,需要手动转类型:parseInt(query.id) - 如果参数含特殊字符(如
/、?),务必先encodeURIComponent,否则路由解析失败
真正卡住人的地方,从来不是语法记不住,而是把 <script setup></script> 当成纯 Vue 3 写——结果生命周期没注册上、API 找不到、ref 在模板里不更新。uni-app 的 setup 是带平台语义的编译规则,不是语法糖,是转译契约。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










