克拉玛依市网站建设_网站建设公司_域名注册_seo优化
2025/12/25 8:56:25
网站建设
项目流程
一 核心差异总览
- 定位与目标:Vue 面向 Web 单页应用(SPA);UniApp 基于 Vue 语法,面向 多端(H5、微信/支付宝/抖音等小程序、App) 的跨端应用。
- 路由机制:Vue 使用 Vue Router 前端路由;UniApp 通过 pages.json 声明页面栈,用 uni.navigateTo / redirectTo / switchTab / reLaunch 等 API 进行页面跳转。
- 项目配置:Vue 使用 vue.config.js / router.js 等;UniApp 使用 manifest.json(应用配置)、pages.json(页面与窗口)、package.json。
- 标签与组件:Vue 使用标准 HTML 标签;UniApp 使用小程序风格组件(如 view、text、navigator、image、scroll-view、swiper)。
- 生命周期:UniApp 在 Vue 生命周期基础上新增 应用生命周期(onLaunch、onShow) 与 页面生命周期(onLoad、onShow、onPullDownRefresh 等)。
- API 体系:UniApp 提供统一的 uni.xxx API(网络、存储、导航、设备、授权等),而非浏览器的 window / document 对象。
- 样式与适配:UniApp 推荐 rpx 响应式单位与 Flex 布局,并提供 page 根选择器;非 H5 端样式能力与选择器受限。
- 运行环境:非 H5 端运行在 JSCore 等原生环境,无 DOM/BOM;H5 端运行在浏览器环境。
二 项目结构与配置
- 页面声明与路由:所有页面必须在 pages.json -> pages 数组中声明,第一项为首页;通过 pages.json -> tabBar 配置原生底部标签。页面跳转使用 uni.navigateTo 等 API,而非 Vue Router。
- 核心配置文件:
- manifest.json:应用名称、图标、权限、各平台(如 mp-weixin)特有配置(如 appid)。
- pages.json:页面路径、窗口样式、原生导航栏、tabBar、分包等。
- package.json:依赖与脚本(支持多平台扩展字段)。
- H5 路由差异:仅 H5 端 可引入 Vue Router 实现 SPA 路由;小程序/App 端不支持前端路由。
三 模板语法与事件差异
- 标签与语义化:优先使用 view、text、navigator、image、button 等小程序风格标签;避免使用 div、span、a、img 等 Web 标签以保证多端一致性。
- Class 与 Style 绑定:
- 支持 :class="{ active: isActive }"、:style="{ color: c }" 等表达式。
- 非 H5 端不支持 将对象直接传入(如 :class="classObject"、:style="styleObject");如需对象式绑定,请用 computed 返回字符串。
- 事件绑定与修饰符:
- 统一使用 @click / @input 等 Vue 事件绑定;不要用小程序 bind/catch。
- 事件修饰符:.stop 全端支持;.prevent / .self / .once / .capture / .passive 仅在 H5 支持。
- 禁止蒙层滚动:@touchmove.stop.prevent。
- 列表渲染差异:
- v-for="(item,index) in 10":H5 的 item 从 1 开始,其他端从 0 开始,可用 index 保持一致。
- 非 H5 端 不支持对象遍历的第三个参数 index。
- 表单控件:H5 的 select 用 picker 组件替代;radio 用 radio-group 替代。
四 生命周期与数据通信
- 生命周期映射与新增:
- 页面创建阶段:Vue 的 created 可由 UniApp 的 onLoad 承担;mounted 可由 onReady 近似替代。
- 应用级:onLaunch / onShow 用于应用初始化与前后台切换。
- 页面级:onShow(每次显示)、onHide(隐藏)、onPullDownRefresh(下拉刷新)、onReachBottom(上拉加载)等。
- 页面传参与通信:
- 通过 navigator url="/page?id=1" 传参;目标页在 onLoad(options) 接收。
- 复杂场景可用 Event Channel 进行页面间双向通信。
- 状态管理:
- Vue 3 项目可直接使用 Pinia(与 Vue 3 一致);Vue 2 项目使用 Vuex。
- 持久化需适配多端存储:如用 uni.setStorageSync / getStorageSync 替代 localStorage。
五 Vue 中不适用于 UniApp 的清单与替代方案
- 全局配置与 API(非 H5 端不支持):
- 配置:Vue.config.devtools / keyCodes / performance。
- API:Vue.nextTick(非 H5)、Vue.directive / Vue.filter / Vue.compile(小程序端不支持)。
- 选项与实例能力(受限/不支持):
- 选项:el / template / render / renderError / delimiters / functional / comments(非 H5 不支持);小程序端不支持 model / inheritAttrs。
- 实例:vm.el/vm.mount()(非 H5 不支持);小程序端不支持 vm.isServer/vm.attrs / vm.$listeners。
- 模板指令与特殊属性(受限/不支持):
- 指令:v-html(仅 H5/App-vue(V3) 支持,小程序不支持)、v-pre / v-once(小程序不支持)、v-cloak(非 H5 不支持)、v-bind="object"(小程序不支持)。
- 属性:is(小程序不支持);classObject / styleObject(非 H5 不支持);自定义组件上 Class/Style 绑定(非 H5 端受限)。
- 内置组件与高级特性(非 H5 不支持):
- 组件:component(小程序不支持)、transition / transition-group / keep-alive(非 H5 不支持)。
- 其他:动态组件、异步组件、inline-template、X-Templates、scoped slot(旧版) 等非 H5 端不支持。
- 浏览器/DOM/BOM(非 H5 端不支持):
- 对象:window / document / location / navigator / cookie / localStorage / websql / indexdb / webgl 等不可用;不要依赖 jQuery 等浏览器库。
- 如需操作 DOM,App 端可通过 renderjs 方案隔离;小程序端请用数据驱动与组件 API。
- 样式与选择器(非 H5 受限):
- 选择器:不支持 通配符 *;body 选择器请改为 page;避免使用 :root。
- 单位与布局:推荐使用 rpx 与 Flex;原生组件层级高于前端组件,遮挡请用 cover-view。
- 事件与组件细节:
- 自定义组件在部分小程序渲染可能多一级节点,可用 virtualHost / mergeVirtualHostAttributes 调整;
- scroll-view 的 scroll-top 重复赋相同值不会触发滚动,需先记录内部位置再二次设置。
六 实战迁移与最佳实践
- 路由与导航:优先使用 pages.json + uni API 实现跨端导航;仅 H5 场景再引入 Vue Router。
- 网络请求:可用 axios 拦截器,但底层请求需适配为 uni.request(通过 adapter),统一处理 loading / toast。
- 富文本:非 H5 端用 rich-text 组件渲染;避免 v-html 依赖。
- 条件编译:同一文件内用条件编译处理平台差异(如 // #ifdef MP-WEIXIN / H5 / APP-PLUS),减少多份代码维护。
- 适配与布局:使用 rpx 与 Flex;注意 原生组件层级 与 cover-view 覆盖;H5 与 App 的坐标系差异可用 --window-top / --window-bottom 变量统一处理。
七 汇总对比表
表一 核心差异总览
| 维度 | Vue(Web) | UniApp(跨端) | 说明 |
|---|
| 定位与目标 | SPA 单页应用 | 一套代码 → 多端(H5/小程序/App) | 场景与运行平台不同 |
| 路由机制 | Vue Router 前端路由 | pages.json 声明 + uni.xxx 导航 API | 非 H5 端无前端路由 |
| 页面与窗口 | 路由表配置 | pages.json 配置页面、窗口、原生导航栏、tabBar | 原生体验优先 |
| 标签与组件 | div / span / a / img | view / text / navigator / image / scroll-view / swiper | 多端一致性与原生组件 |
| 生命周期 | 组件生命周期 | 组件 + 应用生命周期(onLaunch/onShow) + 页面生命周期(onLoad/onShow/onPullDownRefresh…) | 对接原生能力 |
| API 体系 | window / document / fetch / axios | uni.request / uni.navigateTo / uni.showToast / … | 统一跨端 API |
| 样式与适配 | px / rem / vw + 全 CSS | rpx + Flex;page 根选择器;选择器受限 | 多端自适应与限制 |
| 运行环境 | 浏览器 DOM/BOM | 非 H5:JSCore/原生环境(无 DOM/BOM);H5:浏览器 | 环境差异决定能力边界 |
| 构建与工具 | Vite / Webpack | HBuilderX / CLI | 生态与工具链差异 |
| 状态管理 | Pinia / Vuex | Pinia / Vuex(持久化需适配多端存储) | 用法一致,存储适配 |
| 路由守卫 | router.beforeEach 等 | 无全局路由守卫,需封装或页面级拦截 | 登录/权限拦截策略调整 |
| 表单与交互 | select / input[type=…] | picker / radio-group / switch / … | 移动端组件替代 |
| 富文本 | v-html | rich-text(非 H5 端不支持 v-html) | 安全与跨端渲染 |
| 原生能力 | 浏览器能力有限 | 原生插件 / 原生模块 / 原生导航 | App/小程序原生集成 |
| 调试与预览 | 浏览器 DevTools | 多端预览(H5/小程序/真机/云打包) | 多端一致性验证 |
| 生态与 UI | Element Plus / Ant Design Vue | uni-ui / uView | UI 库选择差异 |
| 适用场景 | Web 应用 / 管理后台 | App + 小程序 + H5 一体化 | 选型依据 |
表二 生命周期映射与差异
| 阶段 | Vue 生命周期 | UniApp 对应 | 触发时机与说明 |
|---|
| 实例初始化 | beforeCreate | beforeCreate | 实例刚创建 |
| 实例创建完成 | created | created | 实例创建完成 |
| 挂载前 | beforeMount | beforeMount | 即将挂载 |
| 挂载完成 | mounted | mounted | 已挂载(H5 近似页面就绪) |
| 更新前 | beforeUpdate | beforeUpdate | 数据将更新 |
| 更新完成 | updated | updated | 数据已更新 |
| 销毁前 | beforeDestroy | beforeDestroy | 实例将销毁 |
| 销毁完成 | destroyed | destroyed | 实例已销毁 |
| 激活(缓存) | activated | 仅 App/小程序 | 被 keep-alive 激活 |
| 停用(缓存) | deactivated | 仅 App/小程序 | 被 keep-alive 停用 |
| 应用启动 | — | onLaunch | 应用初始化完成(仅 App/小程序) |
| 应用显示 | — | onShow | 应用切到前台(仅 App/小程序) |
| 页面显示 | — | onShow | 页面每次显示(含切前台/返回) |
| 页面隐藏 | — | onHide | 页面切到后台/跳转离开 |
| 页面加载 | — | onLoad | 页面创建时触发一次(接收参数) |
| 页面就绪 | — | onReady | 页面初次渲染完成 |
| 下拉刷新 | — | onPullDownRefresh | 触发下拉刷新 |
| 上拉加载 | — | onReachBottom | 触底加载更多 |
| 页面不存在 | — | onPageNotFound | 页面未找到(仅 App/小程序) |
表三 模板语法与事件差异
| 项目 | Vue(Web) | UniApp(跨端) | 说明 |
|---|
| 标签体系 | div / span / a / img | view / text / navigator / image | 多端一致性与原生组件 |
| 列表渲染 | v-for 常规用法 | v-for 基本一致 | 注意跨端 key 与一致性 |
| 整数遍历 | v-for="n in 10" item 从 1 起 | 其他端 item 从 0 起 | 建议统一用 index |
| 对象遍历 | 支持 (v, k, i) | 非 H5 不支持第 3 个参数 index | 避免依赖 i |
| Class 绑定 | 支持对象/数组 | 支持表达式;非 H5 不支持 classObject/styleObject | 用 computed 返回字符串 |
| Style 绑定 | 支持对象/数组 | 支持表达式;非 H5 不支持 classObject/styleObject | 以 px 设置时不会被 rpx 转换 |
| 事件绑定 | @click / @input | @click / @input(统一用 Vue 语法) | 不要用小程序 bind/catch |
| 事件修饰符 | .stop / .prevent / .self / .once / .capture / .passive | .stop 全端;其余多仅 H5 支持 | 移动端谨慎使用 |
| 蒙层滚动 | 自定义阻止 | @touchmove.stop.prevent | 禁止滚动穿透 |
| 表单控件 | select / radio 原生 | picker / radio-group 组件替代 | 移动端交互一致 |
| 富文本 | v-html 全支持 | H5/App(V3) 支持;小程序不支持 | 跨端用 rich-text |
表四 样式与选择器差异
| 项目 | Vue(Web) | UniApp(跨端) | 说明 |
|---|
| 根选择器 | body / :root | 使用 page 作为根 | 小程序/App 无 body |
| 通配符 | \* 支持 | 不支持 | 避免全局重置 |
| 单位 | px / rem / vw | 推荐 rpx(基于屏幕宽度自适应) | 多端适配更简单 |
| 布局 | 多样 | 推荐 Flex | 各端渲染一致性好 |
| 背景与字体 | 常规 | 单文件建议 < 40k | 过大影响性能(小程序端) |
| 本地静态资源 | 相对路径引入 | 静态资源放 static | 注意打包与引用路径 |
| 原生组件层级 | DOM 层级 | video / map / canvas / textarea 层级高 | 覆盖用 cover-view / cover-image |
| 样式作用域 | scoped | 支持但行为因端而异 | 避免依赖深度选择器穿透 |
表五 API 与运行环境差异
| 类别 | Vue(Web) | UniApp(跨端) | 说明 |
|---|
| 导航跳转 | this.$router.push | uni.navigateTo / redirectTo / switchTab / reLaunch | 页面栈与动画由原生接管 |
| 网络请求 | fetch / axios | uni.request(可封装 axios adapter) | 统一多端网络能力 |
| 存储 | localStorage / sessionStorage / cookie | uni.setStorageSync / getStorageSync | 小程序/App 无 cookie |
| 弹窗提示 | alert / confirm | uni.showModal / showToast / showLoading | 原生体验一致 |
| 设备与系统 | window.navigator / device | uni.getSystemInfoSync / uni.getNetworkType | 获取设备与网络信息 |
| 文件与媒体 | File / Blob / URL.createObjectURL | uni.chooseImage / uni.saveFile / uni.previewImage | 原生能力封装 |
| 位置与地图 | Geolocation API | uni.getLocation / map 组件 | 原生定位与地图 |
| 扫码与支付 | 浏览器能力有限 | uni.scanCode / uni.requestPayment | 原生能力集成 |
| DOM/BOM | window / document / location | 非 H5 端 |