极米投影仪
149.20M · 2026-03-22
作为一名熟悉 Vue 的开发者,当你第一次接触 uni-app 时,好消息是:你已经掌握了 uni-app 80% 的知识。uni-app 的核心就是 Vue 语法加上一套跨端编译机制。
但剩下的 20% 往往是新手踩坑的重灾区。这篇文章将用大白话,从底层原理到实战技巧,带你迅速跨越这 20% 的认知鸿沟,看完即可直接上手企业级项目。
在写纯 Vue 时,你的代码运行在浏览器里,你可以肆无忌惮地操作 DOM(document.getElementById)、使用 BOM(window.location)。
但在 uni-app 中,你的代码可能要运行在微信小程序或原生 App 中。 官方文档明确指出:App 和小程序的逻辑层和渲染层是分离的。
结论与习惯改变:
window 和 document。uni.createSelectorQuery()。在 Web 开发中,我们用 HTML 标签(div, span, img)。在 uni-app 中,为了兼容小程序和 App,必须使用基础组件(靠近微信小程序规范)。
<div> ️ <view><span> ️ <text><img> ️ <image> (注意:image 默认有宽高,不像 img 默认由内容撑开)<a> ️ <navigator>Vue 开发者习惯用 vue-router。但在 uni-app 中,不需要也不建议使用 vue-router。 uni-app 采用类似小程序的路由配置方式:
pages.json 中注册。uni.navigateTo()、uni.redirectTo()、uni.switchTab() 等 API,或者 <navigator> 标签。// 伪代码对比
// Vue Router 跳转
router.push({ path: '/pages/detail', query: { id: 1 } })
// uni-app 跳转
uni.navigateTo({
url: '/pages/detail/detail?id=1'
})
除了 Vue 原生的生命周期(onMounted, onUnmounted 等),uni-app 引入了应用生命周期和页面生命周期。
onLoad(options)(页面加载,接收路由参数)和 onShow()(页面每次显示)。created / setup 会在 onLoad 之前执行。建议初始化网络请求写在 onLoad 中,而不是 onMounted,因为 onLoad 能直接拿到路由参数。所有 Web 专属 API 都被 uni-app 重新封装成了跨端 API:
axios / fetch ️ uni.request()localStorage.setItem ️ uni.setStorageSync()alert / ElMessage ️ uni.showToast() / uni.showModal()千万不要在 uni-app 中使用 Element Plus、Ant Design 等基于 DOM 的 Web UI 库! 它们在小程序和 App 中会直接报错。
推荐的跨端组件库:
uni-app 目前全面拥抱 Vue 3。
<script setup> 和 Composition API。.vue 文件,编译到各端。这是 uni-app 最伟大的发明。当某个功能(比如微信支付、App 极光推送)无法跨端时,你可以用特殊注释让代码只在特定平台编译。
<template>
<view>
<!-- #ifdef MP-WEIXIN -->
<button open-type="getPhoneNumber">只有微信小程序会编译这个按钮</button>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<button @click="appPay">只有原生 App 会编译这个按钮</button>
<!-- #endif -->
</view>
</template>
<script setup>
const login = () => {
// #ifdef H5
console.log('执行 H5 的网页登录逻辑')
// #endif
// #ifndef H5
console.log('除了 H5 之外的平台(小程序、App)都会执行这段代码')
// #endif
}
</script>
<style>
/* #ifdef MP-ALIPAY */
.box { background: blue; } /* 只在支付宝小程序生效 */
/* #endif */
</style>
逻辑层与渲染层的通讯瓶颈:
ref 或 reactive 中,直接用普通变量。长列表必须使用 <scroll-view> 或专门的虚拟列表组件。CSS 作用域与深度选择器:
<style scoped>。修改子组件(如 uni-ui)样式时,Vue3 中使用 :deep(.uni-card),但要注意某些小程序平台可能不支持过于复杂的深度选择器嵌套。v-show 的陷阱:
v-show 的表现可能不如预期(因为底层不支持 display: none)。v-if 控制显隐,除非该组件频繁切换且初始化极其耗时。图片路径问题:
static 目录下(绝对路径 /static/xxx.png),或者直接使用网络图片(CDN)。开发工具选择:
pages.json 的智能提示,会为你节省大量配环境的时间。多端同步预览:
拥抱 uniCloud(可选) :
总结: 把 uni-app 当作一个受限的 Vue 环境。收起操作 DOM 的野心,严格遵循数据驱动,善用条件编译处理平台差异,你就能在一周内成为跨端开发的高手。