Skip to content

uni-app

第一章:初识

一、是什么

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到 iOS、Android、鸿蒙 Next、Web(响应式)、以及各种小程序(微信/支付宝/百度/抖音/飞书/QQ/快手/钉钉/淘宝/京东/小红书)、快应用、鸿蒙元服务等多个平台。

uni-app 是 DCloud 公司推出的,这个公司还有一个非常好用的 IDE 叫 HBuilderX,简称 HX。

二、功能框架图

uni-app 支持两种后缀文件,分别是 vue 和 nvue,他们有什么区别?

uni-app App 端内置了一个基于 weex 改进的原生渲染引擎,提供了原生渲染能力。

在 App 端,如果使用 vue 页面,则使用 webview 渲染;如果使用 nvue 页面 (native vue 的缩写),则使用原生渲染。

结论:Web 前端工程师就只用 vue 后缀文件即可。

三、快速上手

1. 安装 HBuilderX

HBuilderX:官方 IDE 下载地址

HBuilderX 是通用的前端开发工具,但为 uni-app 开发做了特别强化。所以使用 uni-app 开发程序就首选 HBuilderX。

2. 配置 HX

首次使用,请配置好调试环境,在工具栏里的【工具】->【设置】->【运行配置】。

如果开发微信等小程序,在 manifest.json 中记得配置 AppID。

3. 创建 & 运行 uni-app

在点击工具栏里的【文件】->【新建】->【项目】。

选择 uni-app 类型,输入工程名,选择模板,点击创建,即可成功创建。

要运行项目请点击工具栏里的【运行】->【……】。

4. 目录结构

┌─components            符合vue组件规范的uni-app组件目录
│  └─comp-a.vue         可复用的a组件
├─pages                 业务页面文件存放的目录
│  ├─index
│  │  └─index.vue       index页面
│  └─list
│     └─list.vue        list页面
├─static                存放应用引用的本地静态资源(如图片、视频等)的目录,注意:静态资源都应存放于此目录
├─uni_modules           存放 uni_module
├─wxcomponents          存放微信小程序、QQ小程序组件的目录
├─mycomponents          存放支付宝小程序组件的目录
├─swancomponents        存放百度小程序组件的目录
├─ttcomponents          存放抖音小程序、飞书小程序组件的目录
├─kscomponents          存放快手小程序组件的目录
├─jdcomponents          存放京东小程序组件的目录
├─App.vue               应用配置,用来配置App全局样式以及监听 应用生命周期
├─index.html
├─main.js               Vue初始化入口文件
├─manifest.json         配置应用名称、appid、logo、版本等打包信息
├─pages.json            配置页面路由、导航条、选项卡等页面类信息
├─uni.promisify.adaptor.js
└─uni.scss              内置的常用样式变量
1)uni.promisify.adaptor.js

如果你使用的是 Vue3,那么这个文件可以删除,之后在 main.js 中记得删除对这个文件的引入。

javascript
uni.addInterceptor({
  returnValue (res) { // 方法调用后触发,处理返回值
    // 1. 判断返回值是否是一个 Promise (thenable 对象)
    if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
      return res;
    }
    // 2. 如果是 Promise,则重新包装一个新的 Promise
    return new Promise((resolve, reject) => {
      res.then((res) => {
        if (!res) return resolve(res)
        // 3. 核心逻辑:处理 [err, data] 格式
        // 如果 res[0] 存在(即有错误),则 reject(err)
        // 否则 resolve(res[1])(即成功数据)
        return res[0] ? reject(res[0]) : resolve(res[1])
      });
    });
  },
});

这个文件的主要作用是调整 uni-app API 的 Promise 返回格式,使其符合标准的 Promise 规范(即成功时 resolve 数据,失败时 reject 错误),而不是返回一个包含错误和数据的数组。

javascript
// 默认行为 (无适配器): 即使请求失败,Promise 也是 resolve,需要手动判断数组第一个元素
const [err, res] = await uni.request({ url: '...' });
if (err) {
  console.error('请求失败', err);
} else {
  console.log('请求成功', res);
}

附加:uni.addInterceptor(STRING, OBJECT) API 官方文档解释。

第二章:全局文件

一、重要

1. pages.json 页面路由

用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生 tabbar 等。

注意:微信小程序的定位权限申请等原属于 app.json 的内容,但在 uni-app 中是在 manifest 中配置。

1)globalStyle

用于设置应用的状态栏、导航条、标题、窗口背景色等。

属性类型默认值描述平台差异说明
navigationBarBackgroundColorHexColor#F8F8F8导航栏背景颜色(同状态栏背景色)APP 与 H5 为#F8F8F8,小程序平台请参考相应小程序文档
navigationBarTextStyleStringblack导航栏标题颜色及状态栏前景颜色,仅支持 black/white
navigationBarTitleTextString导航栏标题文字内容
navigationStyleStringdefault导航栏样式,仅支持 default/custom。custom 即取消默认的原生导航栏,需看使用注意微信小程序 7.0+、百度小程序、H5、App(2.0.3+)、小红书小程序
backgroundColorHexColor#ffffff下拉显示出来的窗口的背景色微信小程序、小红书小程序
backgroundTextStyleStringdark下拉 loading 的样式,仅支持 dark / light微信小程序
enablePullDownRefreshBooleantrue是否开启下拉刷新,详见页面生命周期
onReachBottomDistanceNumber50页面上拉触底事件触发时距页面底部距离,单位只支持 px,详见页面生命周期
2)pages

配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象,其属性值如下:

属性类型默认值描述
pathString配置页面路径
styleObject配置页面窗口表现,配置项参考下方 pageStyle
needLoginBooleanfalse是否需要登录才可访问

注意:

  • pages 节点的第一项为应用入口页(即首页)。
  • 应用中新增 / 减少页面,都需要对 pages 数组进行修改。
  • 文件名不需要写后缀,框架会自动寻找路径下的页面资源。
3)easycom

传统 Vue 组件,需要安装、引用、注册,三个步骤后才能使用组件。easycom 将其精简为一步。

只要组件路径符合规范,就不用引用、注册,就可以直接在页面中使用。路径规范 指:

  1. 安装在项目根目录的 components 目录下,并符合 components/组件名称/组件名称.vue
  2. 安装在 uni_modules 下,路径为 uni_modules/插件ID/components/组件名称/组件名称.vue

不管 components 目录下安装了多少组件,easycom 打包会自动剔除没有使用的组件,对组件库的使用尤为友好。

4)tabBar
属性类型必填默认值描述平台差异说明
colorHexColortab 上的文字默认颜色
selectedColorHexColortab 上的文字选中时的颜色
backgroundColorHexColortab 的背景色
borderStyleStringblacktabbar 上边框的颜色,可选值 black/white,black 对应颜色 rgba(0,0,0,0.33),white 对应颜色 rgba(255,255,255,0.33)。App 2.3.4+ 、H5 3.0.0+、微信小程序、小红书小程序、京东小程序
listArraytab 的列表,详见 list 属性说明,最少 2 个、最多 5 个 tab
positionStringbottom可选值 bottom、toptop 值仅微信小程序支持
customBoolean是否启用自定义 tabBar微信小程序、抖音小程序

其中 list 接收一个数组,数组中的每个项都是一个对象,其属性值如下:

属性类型必填说明平台差异
pagePathString页面路径,必须在 pages 中先定义
textStringtab 上按钮文字,在 App 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标
iconPathString图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片,不支持字体图标
selectedIconPathString选中时的图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效
visibleBoolean该项是否显示,默认显示App (3.2.10+)、H5 (3.2.10+)
iconfontObject字体图标,优先级高于 iconPathApp(3.4.4+)、H5 (3.5.3+)

2. manifest.json 应用配置

应用的配置文件,用于指定应用的名称、图标、权限等。

参考官方文档:manifest.json 应用配置

3. uni.scss

uni.scss 是一个特殊文件,在代码中无需 import 这个文件即可在 scss 代码中使用这里的样式变量。uni-app 的编译器在 webpack 配置中特殊处理了这个 uni.scss,使得每个 scss 文件都被注入这个 uni.scss,达到全局可用的效果。如果开发者想要 less、stylus 的全局使用,需要在 vue.config.js 中自行配置 webpack 策略。

注意:

  • 如要使用这些常用变量,需要在 HBuilderX 里面安装 scss 插件(dart-sass);

  • 使用时需要在 style 节点上加上 lang="scss"

    html
    <style lang="scss">
    </style>

二、vite.config.js

vite.config.js 是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载,一般用于配置 vite 的编译选项,具体规范参考:vite.config.js

三、App.vue

App.vue 本身不是页面 ,这里不能编写视图元素,也就是没有 <template> 元素。主要是聚集其他页面挂载到容器里。

App.vue 的作用:

  • 应用的生命周期
  • 编写全局样式
  • 定义全局数据
  • globalData

第三章:组件

官方文档:组件

一、内置组件

1. 视图容器组件

1)view

类似于传统 html 中的 div,用于包裹各种元素内容。

属性名类型默认值说明
hover-classStringnone指定按下去的样式类。当 hover-class="none" 时,没有点击态效果
hover-stop-propagationBooleanfalse指定是否阻止本节点的祖先节点出现点击态
hover-start-timeNumber50按住后多久出现点击态,单位毫秒
hover-stay-timeNumber400手指松开后点击态保留时间,单位毫秒
2)text

类似于传统 html 中的 span,用于包裹文本内容。

属性名类型默认值说明平台差异说明
selectableBooleanfalse文本是否可选小红书小程序不支持
user-selectBooleanfalse文本是否可选微信小程序
spaceString显示连续空格钉钉小程序不支持
decodeBooleanfalse是否解码百度、钉钉小程序不支持

space 值说明

说明
ensp中文字符空格一半大小
emsp中文字符空格大小
nbsp根据字体设置的空格大小
3)scroll-view

可滚动视图区域组件。

点我查看
属性名类型默认值说明平台差异说明
scroll-xBooleanfalse允许横向滚动
scroll-yBooleanfalse允许纵向滚动
upper-thresholdNumber/String50距顶部/左边多远时(单位px),触发 scrolltoupper 事件
lower-thresholdNumber/String50距底部/右边多远时(单位px),触发 scrolltolower 事件
scroll-topNumber/String设置竖向滚动条位置
scroll-leftNumber/String设置横向滚动条位置
scroll-with-animationBooleanfalse在设置滚动条位置时使用动画过渡
show-scrollbarBooleantrue控制是否出现滚动条App-nvue 2.1.5+
refresher-enabledBooleanfalse开启自定义下拉刷新H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
refresher-thresholdNumber45设置自定义下拉刷新阈值H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
refresher-default-styleString"black"设置自定义下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
refresher-backgroundString"#FFF"设置自定义下拉刷新区域背景颜色H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
refresher-triggeredBooleanfalse设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
@scrolltoupperEventHandle滚动到顶部/左边,会触发 scrolltoupper 事件
@scrolltolowerEventHandle滚动到底部/右边,会触发 scrolltolower 事件
@scrollEventHandle滚动时触发,event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY}
@refresherpullingEventHandle自定义下拉刷新控件被下拉H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
@refresherrefreshEventHandle自定义下拉刷新被触发H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
@refresherrestoreEventHandle自定义下拉刷新被复位H5、app-vue 2.5.12+,微信小程序基础库2.10.1+、小红书小程序
@refresherabortEventHandle自定义下拉刷新被中止H5、app-vue 2.5.12+,微信小程序基础库2.10.1+
4)swiper

滑块视图容器。一般用于左右滑动或上下滑动,比如 banner 区域的轮播图。

swiper 组件是块级组件,高度默认 150px。swiper 的子组件只能是 swiper-item,宽高默认为 100%。

swiper 组件可用的常见属性
属性名类型默认值说明平台差异说明
indicator-dotsBooleanfalse是否显示面板指示点
indicator-colorColorrgba(0, 0, 0, .3)指示点颜色
indicator-active-colorColor#000000当前选中的指示点颜色
active-classStringswiper-item 可见时的 class支付宝小程序
autoplayBooleanfalse是否自动切换
currentNumber0当前所在滑块的 index
intervalNumber5000自动切换时间间隔
durationNumber500滑动动画时长app-nvue 不支持
circularBooleanfalse是否采用衔接滑动,即播放到末尾后重新回到开头
verticalBooleanfalse滑动方向是否为纵向
@changeEventHandlecurrent 改变时会触发 change 事件,event.detail = {current: current, source: source}

2. 媒体组件

1)image

默认宽度 320px、高度 240px。

属性名类型默认值说明平台差异说明
srcString图片资源地址
modeString'scaleToFill'图片裁剪、缩放的模式。具体参见:image mode 有效值
lazy-loadBooleanfalse图片懒加载。只针对 page 与 scroll-view 下的 image 有效基本所有小程序都支持
show-menu-by-longpressbooleanfalse开启长按图片显示识别小程序码菜单仅支持微信小程序
@errorHandleEvent当错误发生时,发布到 AppService 的事件名,事件对象 event.detail = {errMsg: 'something wrong'}
@loadHandleEvent当图片载入完毕时,发布到 AppService 的事件名,事件对象 event.detail = {height:'图片高度px', width:'图片宽度px'}

mode 值说明

说明
scaleToFill图片的宽高完全拉伸至填满 image 元素;不保持纵横比
aspectFit图片的长边能完全显示出来(图片不能完全占满所在元素);保持纵横比
aspectFill图片的短边能完全显示出来,另一个方向将会发生截取;保持纵横比
widthFix宽度不变,高度自动变化;保持纵横比
heightFix高度不变,宽度自动变化;保持纵横比
top bottom center left right

注意:

  • <image> 组件未设置宽高时,默认宽度 320px、高度 240px。尤其注意当图片加载失败时,widthFix 模式指定宽度的图片,虽然图片空白,但其高度会变成 240px。
  • src 仅支持相对路径、绝对路径,base64 编码。

3. 路由与页面跳转

1)navigator

页面跳转。

该组件类似 HTML 中的 <a> 组件,但只能跳转本地页面。目标页面必须在 pages.json 中注册。

除了组件方式,API 方式也可以实现页面跳转,另见:https://uniapp.dcloud.io/api/router?id=navigateto

属性名类型默认值说明平台差异说明
urlString应用内的跳转链接,值为相对路径或绝对路径,如:"../first/first"、"/pages/first/first",注意不能加 .vue 后缀
open-typeStringnavigate跳转方式
deltaNumber当 open-type 为 'navigateBack' 时有效,表示回退的层数支付宝小程序不支持
hover-classStringnavigator-hover指定点击时的样式类,当 hover-class="none" 时,没有点击态效果
hover-stop-propagationBooleanfalse指定是否阻止本节点的祖先节点出现点击态微信小程序、小红书小程序
hover-start-timeNumber50按住后多久出现点击态,单位毫秒
hover-stay-timeNumber600手指松开后点击态保留时间,单位毫秒
targetStringself在哪个小程序目标上发生跳转,默认当前小程序,值域 self/miniProgram微信2.0.7+、百度2.5.2+、QQ

open-type 有效值

说明平台差异说明
navigate对应 uni.navigateTo 的功能,保留当前页面,跳转到应用内的某个页面
redirect对应 uni.redirectTo 的功能,关闭当前页面,跳转到应用内的某个页面
switchTab对应 uni.switchTab 的功能,跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
reLaunch对应 uni.reLaunch 的功能,关闭所有页面,打开到应用内的某个页面抖音小程序与飞书小程序不支持
navigateBack对应 uni.navigateBack 的功能,关闭当前页面,返回上一页面或多级页面
exit退出小程序,target="miniProgram" 时生效微信2.1.0+、百度2.5.2+、QQ1.4.7+、小红书小程序

实际开发中的 bug:

vue
<navigator url="/pages/classlist/classlist" class="row">
  <view class="left">
    <uni-icons type="download-filled" size="20"></uni-icons>
    <view class="text">我的下载</view>
  </view>
  <view class="right">
    <view class="text">33</view>
    <uni-icons type="right" size="15" color="#aaa"></uni-icons>
  </view>
</navigator>

<style>
.row {
  position: relative;
  display: flex;
  justify-content: space-between;
  align-items: center;
  height: 100rpx;
  padding: 0 30rpx;
  border-bottom: 1px solid #eee;
  background: #fff;
}
</style>

期望里面的元素在一行,但实际不是。

为什么?因为 navigator 里在渲染后会套一个 a 标签,破坏布局结构了。

通过下面方式解决:

vue
<style>
:deep() {
  .navigator-wrap {
    flex: 1;
	display: flex;
	justify-content: space-between;
	align-items: center;
	height: 100rpx;
	padding: 0 30rpx;
	border-bottom: 1px solid #eee;
	background: #fff;
  }
}
</style>

4. 表单组件

1)form
属性名类型说明平台差异说明
@submitEventHandle携带 form 中的数据触发 submit 事件,event.detail = {value : {'name': 'value'} , formId: ''},report-submit 为 true 时才会返回 formId
@resetEventHandle表单重置时会触发 reset 事件

一般都不会使用这个 form 组件,都是 state 由 Vue 管理,然后异步 AJAX 提交。

2)button
属性名类型默认值说明生效时机平台差异说明
sizeStringdefault按钮的大小
typeStringdefault按钮的样式类型
plainBooleanfalse按钮是否镂空,背景色透明
disabledBooleanfalse是否禁用
loadingBooleanfalse名称前是否带 loading 图标H5、App(App-nvue 平台,在 ios 上为雪花,Android上为圆圈)
form-typeString用于 <form> 组件,点击分别会触发 <form> 组件的 submit/reset 事件
open-typeString开放能力
hover-classStringbutton-hover指定按钮按下去的样式类。当 hover-class="none" 时,没有点击态效果App-nvue 平台暂不支持
hover-stop-propagationbooleanfalse指定是否阻止本节点的祖先节点出现点击态
hover-start-timeNumber20按住后多久出现点击态,单位毫秒
hover-stay-timeNumber70手指松开后点击态保留时间,单位毫秒

具体属性取值参考:button 组件官方文档

3)input
属性名类型默认值说明平台差异说明
valueString输入框的初始内容
typeStringtextinput 的类型 有效值
passwordBooleanfalse是否是密码类型H5和App写此属性时,type失效
placeholderString输入框为空时占位符
placeholder-styleString指定 placeholder 的样式
placeholder-classString"input-placeholder"指定 placeholder 的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/抖音小程序、飞书小程序、快手小程序不支持
disabledBooleanfalse是否禁用
maxlengthNumber140最大输入长度,设置为 -1 的时候不限制最大长度
confirm-typeStringdone设置键盘右下角按钮的文字,仅在 type="text" 时生效。有效值微信小程序、App、H5、快手小程序、京东小程序、小红书小程序
confirm-holdBooleanfalse点击键盘右下角按钮时是否保持键盘不收起App(3.3.7+)、H5 (3.3.7+)、微信小程序、支付宝小程序、百度小程序、QQ小程序、京东小程序、小红书小程序
@inputEventHandle当键盘输入时,触发 input 事件,event.detail = {value}差异见下方 Tips
@focusEventHandle输入框聚焦时触发,event.detail = { value, height },height 为键盘高度仅微信小程序、京东小程序、App(2.2.3+) 、QQ小程序、快手小程序支持 height、小红书小程序
@blurEventHandle输入框失去焦点时触发,event.detail = {value: value}
@confirmEventHandle点击完成按钮时触发,event.detail = {value: value}

type 有效值

说明平台差异说明
text文本输入键盘
number数字输入键盘均支持,App平台、H5平台 3.1.22 以下版本 vue 页面在 iOS 平台显示的键盘包含负数和小数。
idcard身份证输入键盘微信、支付宝、百度、QQ小程序、快手小程序、京东小程序
tel电话输入键盘小红书小程序不支持
safe-password密码安全输入键盘微信小程序
nickname昵称输入键盘微信小程序
4)checkbox

checkbox-group

多选框组。

属性名类型默认值说明
@changeEventHandle<checkbox-group> 中选中项发生改变是触发 change 事件,detail = {value:[选中的checkbox的value的数组]}

checkbox

多选项。

属性名类型默认值说明平台差异说明
valueString<checkbox> 标识,选中时触发 <checkbox-group> 的 change 事件,并携带 <checkbox> 的 value。
disabledBooleanfalse是否禁用
checkedBooleanfalse当前是否选中,可用来设置默认选中
colorColorcheckbox的颜色,同css的color
backgroundColorColor#ffffffcheckbox默认的背景颜色H5(3.99+)、App-Vue(3.99+)
borderColorColor#d1d1d1checkbox默认的边框颜色H5(3.99+)、App-Vue(3.99+)
activeBackgroundColorColor#ffffffcheckbox选中时的背景颜色,优先级大于color属性H5(3.99+)、App-Vue(3.99+)
activeBorderColorColor#d1d1d1checkbox选中时的边框颜色H5(3.99+)、App-Vue(3.99+)
iconColorColor#007affcheckbox的图标颜色H5(3.99+)、App-Vue(3.99+)
5)radio

radio-group

属性名类型默认值说明
@changeEventHandle<radio-group> 中的选中项发生变化时触发 change 事件,event.detail = {value: 选中项radio的value}

radio

属性名类型默认值说明平台差异说明
valueString<radio> 标识。当该 <radio> 选中时,<radio-group> 的 change 事件会携带 <radio> 的 value
checkedBooleanfalse当前是否选中
disabledBooleanfalse是否禁用
colorColorradio的颜色,同css的color
backgroundColorColor#ffffffradio默认的背景颜色H5(3.99+)、App-Vue(3.99+)
borderColorColor#d1d1d1radio默认的边框颜色H5(3.99+)、App-Vue(3.99+)
activeBackgroundColorColor#007AFFradio选中时的背景颜色,优先级大于color属性H5(3.99+)、App-Vue(3.99+)
activeBorderColorColorradio选中时的边框颜色H5(3.99+)、App-Vue(3.99+)
iconColorColor#ffffffradio的图标颜色H5(3.99+)、App-Vue(3.99+)

二、扩展组件

1. 使用步骤

官方扩展组件使用文档:uni-ui

如果需要表单组件,首推 uni-forms 组件,主要内置了表单验证功能。

2. 定制主题

定制 uni-ui 主题风格:uni-app官网

1)安装 dart-sass 插件(一般都会提示,并自动安装)

2)在项目根目录的 uni.scss 文件中引入 uni-ui 组件库的 variable.scss 变量文件,然后就可以使用或修改对应的 scss 变量。

scss
/* 需要放到文件最上面 */
@import '@/uni_modules/uni-scss/variables.scss';

3)uni.scss 文件中修改对应的 scss 变量

第四章:CSS

官方文档:页面样式与布局

一、基本

1. 预处理器支持

uni-app 支持 less、sass、scss、stylus 等预处理器。

2. 尺寸单位

rpx 是相对于基准宽度的单位,可以根据屏幕宽度进行自适应。uni-app 规定屏幕基准宽度 750rpx。

开发者可以通过设计稿基准宽度计算页面元素 rpx 值,设计稿 1px 与框架样式 1rpx 转换公式如下:

设计稿 1px / 设计稿基准宽度 = 框架样式 1rpx / 750rpx

换言之,页面元素宽度在 uni-app 中的宽度计算公式:

750 * 元素在设计稿中的宽度 / 设计稿基准宽度

3. 选择器

目前支持的选择器:

选择器样例样例描述
elementview选择所有 view 组件
element, elementview, checkbox选择所有文档的 view 组件和所有的 checkbox 组件
#id#firstname选择拥有 id="firstname" 的组件
.class.intro选择所有拥有 class="intro" 的组件
::afterview::after在 view 组件后边插入内容,仅 vue 页面生效
::beforeview::before在 view 组件前边插入内容,仅 vue 页面生效

技巧:page 相当于 body 节点

css
<!-- 设置页面背景颜色,使用 scoped 会导致失效 -- >
page {
  background-color: #ccc;
}

4. 全局样式与局部样式

定义在 App.vue 中的样式为全局样式,作用于每一个页面。在 pages 目录下 的 vue 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 App.vue 中相同的选择器。

注意:

  • App.vue 中通过 @import 语句可以导入外联样式,一样作用于每一个页面。

5. CSS 变量

CSS 变量描述App小程序H5
--status-bar-height系统状态栏高度系统状态栏高度25px0

注意:

  • 当设置 "navigationStyle":"custom" 取消原生导航栏后,由于窗体为沉浸式,占据了状态栏位置。此时可以使用一个高度为 var(--status-bar-height) 的 view 放在页面顶部,避免页面内容出现在状态栏。

6. 背景图片

uni-app 支持使用在 css 里设置背景图片,使用方式与普通 web 项目大体相同,但需要注意以下几点:

  • 支持 base64 格式图片。

  • 支持网络路径图片。

  • 小程序不支持在 css 中使用本地文件,包括本地的背景图和字体文件。需以 base64 方式方可使用。

  • 使用本地路径背景图片需注意:

    1. 为方便开发者,在背景图片小于 40kb 时,uni-app 编译到不支持本地背景图的平台时,会自动将其转化为 base64 格式;

    2. 图片大于等于 40kb,会有性能问题,不建议使用太大的背景图,如开发者必须使用,则需自己将其转换为 base64 格式使用,或将其挪到服务器上,从网络地址引用。

    3. 本地背景图片的引用路径推荐使用以 ~@ 开头的绝对路径。

      css
      .test2 {
        background-image: url('~@/static/logo.png');
      }

二、样式导入与内联样式

样式导入

使用 @import 语句可以导入外联样式表,@import 后跟需要导入的外联样式表的相对路径,用 ; 表示语句结束。

内联样式

style:接收动态的样式。

html
<view :style="{color:color}" />

class:用于指定样式规则,其属性值是样式规则中类选择器名 (样式类名) 的集合,样式类名之间用空格分隔。

html
<view class="normal_view" />

第五章:页面

官方文档:页面

一、生命周期

1. 页面生命周期

官方文档:页面生命周期

函数名说明平台差异说明最低版本
onLoad监听页面加载,该钩子被调用时,响应式数据、计算属性、方法、侦听器、props、slots 已设置完成,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),参考示例
onShow监听页面显示,页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady监听页面初次渲染完成,此时组件已挂载完成,DOM 树 ($el) 已可用,注意如果渲染速度快,会在页面进入动画完成前触发
onHide监听页面隐藏
onUnload监听页面卸载
onResize监听窗口尺寸变化App、微信小程序、快手小程序
onPullDownRefresh监听用户下拉动作,一般用于下拉刷新,参考示例
onReachBottom页面滚动到底部的事件(不是 scroll-view 滚到底),常用于下拉下一页数据。具体见下方注意事项
onShareAppMessage用户点击右上角分享微信小程序、QQ小程序、支付宝小程序、抖音小程序、飞书小程序、快手小程序、京东小程序
onPageScroll监听页面滚动,参数为 Objectnvue 不支持
onAddToFavorites监听用户点击右上角收藏微信小程序、QQ 小程序2.8.1+
onShareChat监听右上角菜单“分享到微信群组”按钮的行为小红书小程序

2. 组件生命周期

官方文档:Vue 生命周期钩子

uni-app 组件支持的生命周期,与 Vue 组件的生命周期相同。

组件中可以使用页面的生命周期吗?

  • 在 Options API 语法:组件中不支持使用页面生命周期。
  • 在 Composition API 语法:组件中支持页面生命周期,不同端支持情况有差异。

二、页面调用接口

1. getApp()

getApp() 函数用于获取当前应用实例,一般用于获取 globalData。也可通过应用实例调用 App.vue methods 中定义的方法。

实例

javascript
const app = getApp()
console.log(app.globalData)
app.doSomething() // 调用 App.vue methods 中的 doSomething 方法

注意

  • 不要在定义于 App() 内的函数中,或调用 App 前调用 getApp() ,可以通过 this.$scope 获取对应的 app 实例
  • 通过 getApp() 获取实例之后,不要私自调用生命周期函数。

2. getCurrentPages()

getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,数组中的元素为页面实例,第一个元素为首页,最后一个元素为当前页面。

每个页面实例的方法属性列表:

方法描述平台说明
page.$getAppWebview()获取当前页面的 webview 对象实例App
page.route获取当前页面的路由

注意

getCurrentPages() 仅用于展示页面栈的情况,请勿修改页面栈,以免造成页面状态错误。页面关闭时,对应页面实例会在页面栈中删除。

Tips:

  • navigateTo, redirectTo 只能打开非 tabBar 页面。
  • switchTab 只能打开 tabBar 页面。
  • reLaunch 可以打开任意页面。
  • 不能在首页 onReady 之前进行页面跳转。

三、路由

四、页面通讯

方法一:全局数据 globalData

方式二:本地数据存储

方式三:Vuex 和 Pinia

方式四:路由传参

直接在 url 后面通过查询字符串的方式拼接。如 url 查询字符串出现特殊字符等格式,需编码。然后可在 onLoad 生命周期中获取 url 传递的参数。

例子

html
<navigator :url="'/pages/navigate/navigate?item='+ encodeURIComponent(JSON.stringify(item))"></navigator>
javascript
// navigate.vue 页面接受参数
onLoad: function (option) {
	const item = JSON.parse(decodeURIComponent(option.item));
}

方法五:事件总线

1)uni.$emit(eventName,OBJECT)

触发全局的自定义事件。附加参数都会传给监听器回调。

属性类型描述
eventNameString事件名
OBJECTObject触发事件携带的附加参数
2)uni.$on(eventName,callback)

监听全局的自定义事件。事件可以由 uni.$emit 触发,回调函数会接收所有传入事件触发函数的额外参数。

属性类型描述
eventNameString事件名
callbackFunction事件的回调函数
3)uni.$once(eventName,callback)

监听全局的自定义事件。事件可以由 uni.$emit 触发,但是只触发一次,在第一次触发之后移除监听器。

属性类型描述
eventNameString事件名
callbackFunction事件的回调函数
4)uni.$off(eventName, callback)

移除全局自定义事件监听器。

属性类型描述
eventNameString事件名
callbackFunction事件的回调函数

注意:

  • 如果没有提供参数,则移除所有的事件监听器;
  • 如果只提供了事件,则移除该事件所有的监听器;
  • 如果同时提供了事件与回调,则只移除这个回调的监听器;
  • 提供的回调必须跟 $on 的回调为同一个才能移除这个回调的监听器;

方法六:EventChannel

页面间事件通信通道。

第六章:API

一、界面

1. 交互反馈

1)消息提示框

uni.showToast(OBJECT):显示消息提示框。

参数类型必填说明平台差异说明
titleString提示的内容,长度与 icon 取值有关。
iconString图标,有效值详见下方说明,默认:success。
imageString自定义图标的本地路径(app端暂不支持gif)App、H5、微信小程序、百度小程序、抖音小程序(2.62.0+)、小红书小程序
maskBoolean是否显示透明蒙层,防止触摸穿透,默认:falseApp、微信小程序、抖音小程序(2.47.0+)、小红书小程序
durationNumber提示的延迟时间,单位毫秒,默认:1500
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

uni.hideToast():隐藏消息提示框。

2)loading 提示框

uni.showLoading(OBJECT):显示 loading 提示框, 需主动调用 uni.hideLoading 才能关闭提示框。

参数类型必填说明平台差异说明
titleString提示的文字内容,显示在loading的下方
maskBoolean是否显示透明蒙层,防止触摸穿透,默认:falseH5、App、微信小程序、百度小程序、抖音小程序(2.47.0+)、小红书小程序
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

uni.hideLoading():隐藏 loading 提示框。

3)模态弹窗

uni.showModal(OBJECT):类似 html 中:alert。

参数类型必填说明平台差异说明
titleString提示的标题
contentString提示的内容
showCancelBoolean是否显示取消按钮,默认为 true
cancelTextString取消按钮的文字,默认为"取消"
cancelColorHexColor取消按钮的文字颜色,默认为"#000000"H5、微信小程序、百度小程序、抖音小程序(2.62.0+)、支付宝小程序、小红书小程序
confirmTextString确定按钮的文字,默认为"确定"
confirmColorHexColor确定按钮的文字颜色,H5平台默认为"#007aff",微信小程序平台默认为"#576B95",百度小程序平台默认为"#3c76ff"H5、微信小程序、百度小程序、抖音小程序(2.62.0+)、支付宝小程序、小红书小程序
editableBoolean是否显示输入框H5 (3.2.10+)、App (3.2.10+)、微信小程序 (2.17.1+)、抖音小程序(2.62.0+)、小红书小程序
placeholderTextString显示输入框时的提示文本H5 (3.2.10+)、App (3.2.10+)、微信小程序 (2.17.1+)、抖音小程序(2.62.0+)、小红书小程序
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

success返回参数说明

参数类型说明平台差异说明
confirmBoolean为 true 时,表示用户点击了确定按钮
cancelBoolean为 true 时,表示用户点击了取消(用于 Android 系统区分点击蒙层关闭还是点击取消按钮关闭)
contentStringeditable 为 true 时,用户输入的文本H5 (3.2.10+)、App (3.2.10+)、微信小程序 (2.17.1+)、抖音小程序(2.62.0+)
4)操作菜单

uni.showActionSheet(OBJECT):从底部向上弹出操作菜单。

参数类型必填说明平台差异说明
titleString菜单标题App、H5、支付宝小程序、钉钉小程序、微信小程序 3.4.5+(仅真机有效)
alertTextString警示文案(同菜单标题)微信小程序(仅真机有效)、抖音小程序、小红书小程序
itemListArray<String>按钮的文字数组微信、百度、抖音小程序数组长度最大为6个
itemColorHexColor按钮的文字颜色,字符串格式,默认为"#000000"App-iOS、飞书小程序不支持
successFunction接口调用成功的回调函数,详见返回参数说明
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

success 返回参数说明:

参数类型说明
tapIndexNumber用户点击的按钮,从上到下的顺序,从0开始

二、设置导航条

官方文档:设置导航条相关 API

1. 动态设置当前页面的标题

uni.setNavigationBarTitle(OBJECT)

OBJECT 参数类型必填说明
titleString页面标题
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

如果需要在页面进入时设置标题,可以在 onReady 内执行,以避免被框架内的修改所覆盖。如果必须在 onShow 内执行需要延迟一小段时间。

三、设置 TabBar

官方文档:设置 TabBar 相关 API

1. 动态设置 tabBar 某一项的内容

uni.setTabBarItem(OBJECT)

属性类型默认值必填说明平台差异
indexnumbertabBar 的哪一项,从左边算起
textStringtab 上的按钮文字
iconPathString图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效。微信小程序 2.7.0+、支付宝小程序支持网络图片,其他平台暂不支持网络图片
selectedIconPathString选中时的图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效
pagePathString页面绝对路径,必须在 pages 中先定义,被替换掉的 pagePath 不会变成普通页面(仍然需要使用 uni.switchTab 跳转)App(2.8.4+)、H5(2.8.4+)
successFuntion接口调用成功的回调函数
failFuntion接口调用失败的回调函数
completeFuntion接口调用结束的回调函数(调用成功、失败都会执行)

2. 隐藏 / 显示 tabBar

uni.hideTabBar(OBJECT):隐藏 tabBar。

OBJECT 属性类型默认值必填说明
animationbooleanfalse是否需要动画效果,仅小程序支持
successFuntion接口调用成功的回调函数
failFuntion接口调用失败的回调函数
completeFuntion接口调用结束的回调函数(调用成功、失败都会执行)

uni.showTabBar(OBJECT):显示 tabBar。

OBJECT 属性类型默认值必填说明
animationbooleanfalse是否需要动画效果,仅小程序支持
successFuntion接口调用成功的回调函数
failFuntion接口调用失败的回调函数
completeFuntion接口调用结束的回调函数(调用成功、失败都会执行)

3. 右上角文本

应用场景:未读消息多少条。

uni.setTabBarBadge(OBJECT):为 tabBar 某一项的右上角添加文本。

OBJECT 参数类型必填说明
indexNumbertabBar 的哪一项,从左边算起
textString显示的文本,不超过 3 个半角字符
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

uni.removeTabBarBadge(OBJECT):移除 tabBar 某一项右上角的文本。

OBJECT 参数类型必填说明
indexNumbertabBar 的哪一项,从左边算起
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

4. 右上角红点

uni.showTabBarRedDot(OBJECT):显示 tabBar 某一项的右上角的红点。

uni.hideTabBarRedDot(OBJECT):隐藏 tabBar 某一项的右上角的红点。

OBJECT 参数类型必填说明
indexNumbertabBar 的哪一项,从左边算起
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

四、下拉刷新

1. onPullDownRefresh

在 js 中定义 onPullDownRefresh 处理函数,监听该页面用户下拉刷新事件。

  • 需要在 pages.json 里,找到的当前页面的 pages 节点,并在 style 选项中开启 enablePullDownRefresh。
  • 当处理完数据刷新后,uni.stopPullDownRefresh 可以停止当前页面的下拉刷新。

2. 开始下拉刷新

uni.startPullDownRefresh(OBJECT):调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。

3. 停止下拉刷新

uni.stopPullDownRefresh():停止当前页面下拉刷新。

五、页面和路由

1. uni.navigateTo(OBJECT)

保留当前页面,跳转到应用内的某个页面,使用 uni.navigateBack 可以返回到原页面。

OBJECT 参数类型必填默认值说明平台差异说明
urlString需要跳转的应用是非 tabBar 的页面的路径 , 路径后可以带参数。参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔;如:'path?key=value&key2=value2',path 为下一个页面的路径,下一个页面的 onLoad 函数可得到传递的参数

2. uni.redirectTo(OBJECT)

关闭当前页面,跳转到应用内的某个页面。

OBJECT 参数同 uni.navigateTo(OBJECT)

3. uni.reLaunch(OBJECT)

关闭所有页面,打开到应用内的某个页面。

OBJECT 参数类型必填说明
urlString需要跳转的应用内页面路径,路径后可以带参数。参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔;如:'path?key=value&key2=value2'。
如果跳转的页面路径是 tabBar 页面则不能带参数

4. uni.switchTab(OBJECT)

跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。

OBJECT 参数类型必填说明
urlString需要跳转的 tabBar 页面的路径(需在 pages.json 的 tabBar 字段定义的页面),路径后不能带参数

5. uni.navigateBack(OBJECT)

关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。

OBJECT 参数类型必填默认值说明平台差异说明
deltaNumber1返回的页面数,如果 delta 大于现有页面数,则返回到首页。

六、数据缓存

方法解释
uni.setStorage({key, data})将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。
uni.setStorageSync(KEY,DATA)将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
uni.getStorage({key, success})从本地缓存中异步获取指定 key 对应的内容。
success 返回 data 参数,为 key 对应的内容(具体代码 res.data)。
uni.getStorageSync(KEY)从本地缓存中同步获取指定 key 对应的内容。
uni.getStorageInfo({success})异步获取当前 storage 的相关信息。
success 返回 keys 参数,为当前 storage 中所有的 key(具体代码 res.keys)。
uni.getStorageInfoSync()同步获取当前 storage 的相关信息。
返回值是一个对象,其中 keys 属性表示当前 storage 中所有的 key。
uni.removeStorage({key})从本地缓存中异步移除指定 key。
uni.removeStorageSync(KEY)从本地缓存中同步移除指定 key。
uni.clearStorage()清理本地数据缓存。
uni.clearStorageSync()同步清理本地数据缓存。

七、网络

1. 发起网络请求

uni.request(OBJECT)

OBJECT 参数名类型必填默认值说明平台差异说明
urlString开发者服务器接口地址
dataObject/String/ArrayBuffer请求的参数App 3.3.7 以下不支持 ArrayBuffer 类型
headerObject设置请求的 header,header 中不能设置 RefererApp、H5端会自动带上cookie,且H5端不可手动修改
methodStringGET有效值详见下方说明
timeoutNumber60000超时时间,单位 msH5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
dataTypeStringjson如果设为 json,会对返回的数据进行一次 JSON.parse,非 json 不会进行 JSON.parse
responseTypeStringtext设置响应的数据类型。合法值:text、arraybuffer支付宝小程序不支持
successFunction收到开发者服务器成功返回的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

success 返回参数说明:

参数类型说明
dataObject / String / ArrayBuffer开发者服务器返回的数据
statusCodeNumber开发者服务器返回的 HTTP 状态码
headerObject开发者服务器返回的 HTTP Response Header
cookiesArray.<string>开发者服务器返回的 cookies,格式为字符串数组

第七章:高级

一、跨平台兼容

1. 条件编译

官方文档:条件编译处理多端差异

#ifdef#ifndef%PLATFORM% 开头,以 #endif 结尾。

  • #ifdef:if defined 仅在某平台存在
  • #ifndef:if not defined 除了某平台均存在
  • %PLATFORM%:平台名称

注意:Android 和 iOS 平台不支持通过条件编译来区分,如果需要区分 Android、iOS 平台,请通过调用 uni.getSystemInfo 来获取平台信息。支持 ifiosifAndroid 代码块,可方便编写判断。

Updated at:

preview
图片加载中
预览

Released under the MIT License.