# pages.json 页面路由 `pages.json` 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 它类似微信小程序中`app.json`的**页面管理**部分。注意定位权限申请等原属于`app.json`的内容,在uni-app中是在manifest中配置。 # 配置项列表 |属性|类型|必填|描述|平台兼容| |:-|:-|:-|:-|:-| |[globalStyle](/collocation/pages?id=globalstyle)|Object|否|设置默认页面的窗口表现|| |[pages](/collocation/pages?id=pages)|Object Array|是|设置页面路径及窗口表现|| |[easycom](/collocation/pages?id=easycom)|Object|否|组件自动引入规则|2.5.5+| |[tabBar](/collocation/pages?id=tabbar)|Object|否|设置底部 tab 的表现|| |[condition](/collocation/pages?id=condition)|Object|否|启动模式配置|| |[subPackages](/collocation/pages?id=subPackages)|Object Array|否|分包加载配置|H5、uni-app x 不支持| |[preloadRule](/collocation/pages?id=preloadrule)|Object|否|分包预下载规则|微信小程序| |[workers](https://developers.weixin.qq.com/miniprogram/dev/framework/workers.html)|String|否|`Worker` 代码放置的目录|微信小程序| |[leftWindow](/collocation/pages?id=leftwindow)|Object|否|大屏左侧窗口|H5| |[topWindow](/collocation/pages?id=topwindow)|Object|否|大屏顶部窗口|H5| |[rightWindow](/collocation/pages?id=rightwindow)|Object|否|大屏右侧窗口|H5| |[uniIdRouter](https://doc.dcloud.net.cn/uniCloud/uni-id/summary.html#uni-id-router)|Object|否|自动跳转相关配置,新增于HBuilderX 3.5.0|uni-app x 不支持| |entryPagePath|String|否|默认启动首页,新增于HBuilderX 3.7.0|微信小程序、支付宝小程序| 以下是一个包含了所有配置选项的 `pages.json` : ```json { "pages": [{ "path": "pages/component/index", "style": { "navigationBarTitleText": "组件" } }, { "path": "pages/API/index", "style": { "navigationBarTitleText": "接口" } }, { "path": "pages/component/view/index", "style": { "navigationBarTitleText": "view" } }], "condition": { //模式配置,仅开发期间生效 "current": 0, //当前激活的模式(list 的索引项) "list": [{ "name": "test", //模式名称 "path": "pages/component/view/index" //启动页面,必选 }] }, "globalStyle": { "navigationBarTextStyle": "black", "navigationBarTitleText": "演示", "navigationBarBackgroundColor": "#F8F8F8", "backgroundColor": "#F8F8F8", "usingComponents":{ "collapse-tree-item":"/components/collapse-tree-item" }, "renderingMode": "seperated", // 仅微信小程序,webrtc 无法正常时尝试强制关闭同层渲染 "pageOrientation": "portrait", //横屏配置,全局屏幕旋转设置(仅 APP/微信/QQ小程序),支持 auto / portrait / landscape "rpxCalcMaxDeviceWidth": 960, "rpxCalcBaseDeviceWidth": 375, "rpxCalcIncludeWidth": 750 }, "tabBar": { "color": "#7A7E83", "selectedColor": "#3cc51f", "borderStyle": "black", "backgroundColor": "#ffffff", "height": "50px", "fontSize": "10px", "iconWidth": "24px", "spacing": "3px", "iconfontSrc":"static/iconfont.ttf", // app tabbar 字体.ttf文件路径 app 3.4.4+ "list": [{ "pagePath": "pages/component/index", "iconPath": "static/image/icon_component.png", "selectedIconPath": "static/image/icon_component_HL.png", "text": "组件", "iconfont": { // 优先级高于 iconPath,该属性依赖 tabbar 根节点的 iconfontSrc "text": "\ue102", "selectedText": "\ue103", "fontSize": "17px", "color": "#000000", "selectedColor": "#0000ff" } }, { "pagePath": "pages/API/index", "iconPath": "static/image/icon_API.png", "selectedIconPath": "static/image/icon_API_HL.png", "text": "接口" }], "midButton": { "width": "80px", "height": "50px", "text": "文字", "iconPath": "static/image/midButton_iconPath.png", "iconWidth": "24px", "backgroundImage": "static/image/midButton_backgroundImage.png" } }, "easycom": { "autoscan": true, //是否自动扫描组件 "custom": {//自定义扫描规则 "^uni-(.*)": "@/components/uni-$1.vue" } }, "topWindow": { "path": "responsive/top-window.vue", "style": { "height": "44px" } }, "leftWindow": { "path": "responsive/left-window.vue", "style": { "width": "300px" } }, "rightWindow": { "path": "responsive/right-window.vue", "style": { "width": "300px" }, "matchMedia": { "minWidth": 768 } } } ``` ## globalStyle 用于设置应用的状态栏、导航条、标题、窗口背景色等。 |属性|类型|默认值|描述|平台差异说明| |:-|:-|:-|:-|:-| |navigationBarBackgroundColor|HexColor|#F8F8F8|导航栏背景颜色(同状态栏背景色)|APP与H5为#F8F8F8,小程序平台请参考相应小程序文档| |navigationBarTextStyle|String|black|导航栏标题颜色及状态栏前景颜色,仅支持 black/white|支付宝小程序不支持,请使用 [my.setNavigationBar](https://opendocs.alipay.com/mini/api/xwq8e6)| |navigationBarTitleText|String||导航栏标题文字内容|| |navigationStyle|String|default|导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages?id=customnav)|微信小程序 7.0+、百度小程序、H5、App(2.0.3+)| |backgroundColor|HexColor|#ffffff|下拉显示出来的窗口的背景色|微信小程序| |backgroundTextStyle|String|dark|下拉 loading 的样式,仅支持 dark / light|微信小程序| |enablePullDownRefresh|Boolean|false|是否开启下拉刷新,详见[页面生命周期](/tutorial/page.html#lifecycle)。|| |onReachBottomDistance|Number|50|页面上拉触底事件触发时距页面底部距离,单位只支持px,详见[页面生命周期](/tutorial/page.html#lifecycle)|uni-app x 不支持| |backgroundColorTop|HexColor|#ffffff|顶部窗口的背景色(bounce回弹区域)|仅 iOS 平台| |backgroundColorBottom|HexColor|#ffffff|底部窗口的背景色(bounce回弹区域)|仅 iOS 平台| |titleImage|String||导航栏图片地址(替换当前文字标题),支付宝小程序内必须使用https的图片链接地址|支付宝小程序、H5、APP(uni-app x 不支持)| |transparentTitle|String|none|导航栏整体(前景、背景)透明设置。支持 always 一直透明 / auto 滑动自适应 / none 不透明|支付宝小程序、H5、APP(uni-app x 不支持)| |titlePenetrate|String|NO|导航栏点击穿透|支付宝小程序、H5| |pageOrientation|String|portrait|横屏配置,屏幕旋转设置,仅支持 auto / portrait / landscape 详见 [响应显示区域变化](https://developers.weixin.qq.com/miniprogram/dev/framework/view/resizable.html)|App 2.4.7+(uni-app x 不支持)、微信小程序、QQ小程序| |animationType|String|pop-in|窗口显示的动画效果,详见:[窗口动画](/api/router?id=animation)|App(uni-app x 不支持)| |animationDuration|Number|300|窗口显示动画的持续时间,单位为 ms|App(uni-app x 不支持)| |app-plus|Object||设置编译到 App 平台的特定样式,配置项参考下方 [app-plus](/collocation/pages?id=app-plus)|App| |h5|Object||设置编译到 H5 平台的特定样式,配置项参考下方 [H5](/collocation/pages?id=h5)|H5| |mp-alipay|Object||设置编译到 mp-alipay 平台的特定样式,配置项参考下方 [MP-ALIPAY](/collocation/pages?id=mp-alipay)|支付宝小程序| |mp-weixin|Object||设置编译到 mp-weixin 平台的特定样式,配置项参考下方 [MP-WEIXIN](/collocation/pages?id=mp-weixin)|微信小程序| |mp-baidu|Object||设置编译到 mp-baidu 平台的特定样式,配置项参考下方 [MP-BAIDU](/collocation/pages?id=mp-baidu)|百度小程序| |mp-toutiao|Object||设置编译到 mp-toutiao 平台的特定样式|抖音小程序| |mp-lark|Object||设置编译到 mp-lark 平台的特定样式|飞书小程序| |mp-qq|Object||设置编译到 mp-qq 平台的特定样式|QQ小程序| |mp-kuaishou|Object||设置编译到 mp-kuaishou 平台的特定样式|快手小程序| |mp-jd|Object||设置编译到 mp-jd 平台的特定样式|京东小程序| |usingComponents|Object| |引用小程序组件,参考 [小程序组件](/tutorial/miniprogram-subject.html#小程序自定义组件支持)|uni-app x 不支持| |renderingMode|String| |同层渲染,webrtc(实时音视频) 无法正常时尝试配置 seperated 强制关掉同层|微信小程序| |leftWindow|Boolean|true|当存在 leftWindow 时,默认是否显示 leftWindow|H5| |topWindow|Boolean|true|当存在 topWindow 时,默认是否显示 topWindow|H5| |rightWindow|Boolean|true|当存在 rightWindow 时,默认是否显示 rightWindow|H5| |rpxCalcMaxDeviceWidth|Number|960|rpx 计算所支持的最大设备宽度,单位 px|App(vue2 且不含 nvue)、H5(2.8.12+)| |rpxCalcBaseDeviceWidth|Number|375|rpx 计算使用的基准设备宽度,设备实际宽度超出 rpx 计算所支持的最大设备宽度时将按基准宽度计算,单位 px|App(vue2 且不含 nvue)、H5(2.8.12+)| |rpxCalcIncludeWidth|Number|750|rpx 计算特殊处理的值,始终按实际的设备宽度计算,单位 rpx|App(vue2 且不含 nvue)、H5(2.8.12+)| |dynamicRpx|Boolean|false|动态 rpx,屏幕大小变化会重新渲染 rpx|App-nvue(vue3 固定值为 true) 3.2.13+| |maxWidth|Number||单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选)|H5(2.9.9+)| **注意** - 支付宝小程序使用`titleImage`时必须使用`https`的图片链接地址,需要真机调试才能看到效果,支付宝开发者工具内无效果 - `globalStyle`中设置的`titleImage`也会覆盖掉`pages`->`style`内的设置文字标题 - 使用 `maxWidth` 时,页面内fixed元素需要使用--window-left,--window-right来保证布局位置正确 - `dynamicRpx` vue3 nvue页面已移除此配置,升级为横竖屏切换自动rpx,如果不需要可以使用 px ## topWindow@topwindow uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽屏适配问题。 以现有的手机应用为mainWindow,在左、上、右,可以追加新的页面显示窗体。 整体的宽屏适配思路,参考单独的[宽屏适配指南](https://uniapp.dcloud.net.cn/tutorial/adapt) |属性|类型|默认值|描述| |:-|:-|:-|:-| |path|String||配置页面路径| |style|Object||配置页面窗口表现,配置项参考下方 [pageStyle](/collocation/pages?id=style)| |matchMedia|Object||配置显示该窗口的规则,配置项参考下方 [matchMedia](/collocation/pages?id=matchmedia)| **注意** - 目前 style 节点仅支持配置 width,height 等 css 样式相关属性 - 如果需求当存在 topwindow 时,自动隐藏页面的 navigationBar,根据需求不同在`App.vue`中配置如下 css: - 只需要隐藏某个的页面 navigationBar ```css /* 隐藏路径为 pages/component/view/view 页面的 navigationBar */ .uni-app--showtopwindow [data-page="pages/component/view/view"] uni-page-head { display: none; } ``` - 需要隐藏大部分页面的 navigationBar,显示某个页面的 navigationBar ```css /* 隐藏所有页面的 navigationBar */ .uni-app--showtopwindow uni-page-head { display: none; } /* 显示路径为 pages/component/view/view 页面的 navigationBar */ .uni-app--showtopwindow [data-page="pages/component/view/view"] uni-page-head { display: block; } ``` #### matchMedia |属性|类型|默认值|描述| |:-|:-|:-|:-| |minWidth|Number|768|当设备可见区域宽度 >= minWidth 时,显示该 window| 通过matchMedia的调节,可以自适应在不同屏幕上显示指定的window。 ```json { "pages": [ { "path": "pages/login/login", "style": { "topWindow": false // 当前页面不显示 topWindow "leftWindow": false // 当前页面不显示 leftWindow "rightWindow": false // 当前页面不显示 rightWindow } } ], "topWindow": { "path": "responsive/top-window.vue", // 指定 topWindow 页面文件 "style": { "height": "44px" } }, "leftWindow": { "path": "responsive/left-window.vue", // 指定 leftWindow 页面文件 "style": { "width": "300px" } }, "rightWindow": { "path": "responsive/right-window.vue", // 指定 rightWindow 页面文件 "style": { "width": "300px" // 页面宽度 }, "matchMedia": { "minWidth": 768 //生效条件,当窗口宽度大于768px时显示 } } } ``` 案例演示:HBuilderX 2.9.9+,新建项目选择hello uni-app或新闻模板,或直接浏览:[https://hellouniapp.dcloud.net.cn/](https://hellouniapp.dcloud.net.cn/) ## leftWindow 与[topWindow](/collocation/pages?id=topwindow)相同 ## rightWindow 与[topWindow](/collocation/pages?id=topwindow)相同 窗口通信参考:[https://uniapp.dcloud.net.cn/api/window/communication](https://uniapp.dcloud.net.cn/api/window/communication) ## pages `uni-app` 通过 pages 节点配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象,其属性值如下: |属性|类型|默认值|描述| |:-|:-|:-|:-| |path|String||配置页面路径| |style|Object||配置页面窗口表现,配置项参考下方 [pageStyle](/collocation/pages?id=style)| |needLogin|Boolean|false|是否需要登录才可访问| **Tips:** - pages节点的第一项为应用入口页(即首页) - **应用中新增/减少页面**,都需要对 pages 数组进行修改 - 文件名**不需要写后缀**,框架会自动寻找路径下的页面资源 **代码示例:** 开发目录为:
┌─pages
│ ├─index
│ │ └─index.vue
│ └─login
│ └─login.vue
├─static
├─main.js
├─App.vue
├─manifest.json
└─pages.json
则需要在 pages.json 中填写
```javascript
{
"pages": [
{
"path": "pages/index/index",
"style": { ... }
}, {
"path": "pages/login/login",
"style": { ... }
}
]
}
```
## style
用于设置每个页面的状态栏、导航条、标题、窗口背景色等。
页面中配置项会覆盖 [globalStyle](/collocation/pages?id=globalstyle) 中相同的配置项
|属性|类型|默认值|描述|平台差异说明|
|:-|:-|:-|:-|:-|
|navigationBarBackgroundColor|HexColor|#F8F8F8|导航栏背景颜色(同状态栏背景色)|APP与H5为#F8F8F8,小程序平台请参考相应小程序文档|
|navigationBarTextStyle|String|black|导航栏标题颜色及状态栏前景颜色,仅支持 black/white||
|navigationBarTitleText|String||导航栏标题文字内容||
|navigationBarShadow|Object||导航栏阴影,配置参考下方 [导航栏阴影](/collocation/pages?id=navigationBarShadow)|uni-app x 不支持|
|navigationStyle|String|default|导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages?id=customnav)|微信小程序 7.0+、百度小程序、H5、App(2.0.3+)|
|disableScroll|Boolean|false|设置为 true 则页面整体不能上下滚动(bounce效果),只在页面配置中有效,在globalStyle中设置无效|微信小程序(iOS)、百度小程序(iOS)|
|backgroundColor|HexColor|#ffffff|窗口的背景色|微信小程序、百度小程序、抖音小程序、飞书小程序、京东小程序|
|backgroundTextStyle|String|dark|下拉 loading 的样式,仅支持 dark/light|uni-app x 不支持|
|enablePullDownRefresh|Boolean|false|是否开启下拉刷新,详见[页面生命周期](/tutorial/page.html#lifecycle)。||
|onReachBottomDistance|Number|50|页面上拉触底事件触发时距页面底部距离,单位只支持px,详见[页面生命周期](/tutorial/page.html#lifecycle)|uni-app x 不支持|
|backgroundColorTop|HexColor|#ffffff|顶部窗口的背景色(bounce回弹区域)|仅 iOS 平台|
|backgroundColorBottom|HexColor|#ffffff|底部窗口的背景色(bounce回弹区域)|仅 iOS 平台|
|disableSwipeBack|Boolean|false|是否禁用滑动返回|App-iOS(3.4.0+)|
|titleImage|String||导航栏图片地址(替换当前文字标题),支付宝小程序内必须使用https的图片链接地址|支付宝小程序、H5、App(uni-app x 不支持)|
|transparentTitle|String|none|导航栏透明设置。支持 always 一直透明 / auto 滑动自适应 / none 不透明|支付宝小程序、H5、APP(uni-app x 不支持)|
|titlePenetrate|String|NO|导航栏点击穿透|支付宝小程序、H5|
|app-plus|Object||设置编译到 App 平台的特定样式,配置项参考下方 [app-plus](/collocation/pages?id=app-plus)|App|
|h5|Object||设置编译到 H5 平台的特定样式,配置项参考下方 [H5](/collocation/pages?id=h5)|H5|
|mp-alipay|Object||设置编译到 mp-alipay 平台的特定样式,配置项参考下方 [MP-ALIPAY](/collocation/pages?id=mp-alipay)|支付宝小程序|
|mp-weixin|Object||设置编译到 mp-weixin 平台的特定样式|微信小程序|
|mp-baidu|Object||设置编译到 mp-baidu 平台的特定样式|百度小程序|
|mp-toutiao|Object||设置编译到 mp-toutiao 平台的特定样式|抖音小程序|
|mp-lark|Object||设置编译到 mp-lark 平台的特定样式|飞书小程序|
|mp-qq|Object||设置编译到 mp-qq 平台的特定样式|QQ小程序|
|mp-kuaishou|Object||设置编译到 mp-kuaishou 平台的特定样式|快手小程序|
|mp-jd|Object||设置编译到 mp-jd 平台的特定样式|京东小程序|
|usingComponents|Object||引用小程序组件,参考 [小程序组件](/tutorial/miniprogram-subject.html#小程序自定义组件支持)|App(uni-app x 不支持)、微信小程序、支付宝小程序、百度小程序、京东小程序|
|leftWindow|Boolean|true|当存在 leftWindow时,当前页面是否显示 leftWindow|H5|
|topWindow|Boolean|true|当存在 topWindow 时,当前页面是否显示 topWindow|H5|
|rightWindow|Boolean|true|当存在 rightWindow时,当前页面是否显示 rightWindow|H5|
|maxWidth|Number||单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选)|H5(2.9.9+)|
**注意**
- 使用 `maxWidth` 时,页面内fixed元素需要使用--window-left,--window-right来保证布局位置正确
**代码示例:**
```javascript
{
"pages": [{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "首页",//设置页面标题文字
"enablePullDownRefresh":true//开启下拉刷新
}
},
...
]
}
```
**注意**
- 支付宝小程序使用`titleImage`时必须使用`https`的图片链接地址,需要真机调试才能看到效果,支付宝开发者工具内无效果
### 自定义导航栏使用注意@customnav
当navigationStyle设为custom或titleNView设为false时,原生导航栏不显示,此时要注意几个问题:
- 非H5端,手机顶部状态栏区域会被页面内容覆盖。这是因为窗体是沉浸式的原因,即全屏可写内容。uni-app提供了状态栏高度的css变量[--status-bar-height](/tutorial/syntax-css.html#css-变量),如果需要把状态栏的位置从前景部分让出来,可写一个占位div,高度设为css变量。
```html
┌─components
│ └─comp-a
│ └─comp-a.vue 符合easycom规范的组件
└─uni_modules [uni_module](/uni_modules)中符合easycom规范的组件
└─uni_modules
└─uni-list
└─components
└─uni-list
└─ uni-list.vue
不管components目录下安装了多少组件,`easycom`打包会自动剔除没有使用的组件,对组件库的使用尤为友好。
组件库批量安装,随意使用,自动按需打包。以官方的`uni-ui`为例,在HBuilderX新建项目界面选择`uni-ui`项目模板,只需在页面中敲u,拉出大量组件代码块,直接选择,即可使用。大幅提升开发效率,降低使用门槛。
在[uni-app插件市场](https://ext.dcloud.net.cn/)下载符合`components/组件名称/组件名称.vue`目录结构的组件,均可直接使用。
**自定义easycom配置的示例**
`easycom`是自动开启的,不需要手动开启,有需求时可以在`pages.json`的`easycom`节点进行个性化设置,如关闭自动扫描,或自定义扫描匹配组件的策略。设置参数如下:
|属性 |类型 |默认值 |描述 |
|:- |:- |:- |:- |
|autoscan |Boolean|true |是否开启自动扫描,开启后将会自动扫描符合`components/组件名称/组件名称.vue`目录结构的组件 |
|custom |Object |- |以正则方式自定义组件匹配规则。如果`autoscan`不能满足需求,可以使用`custom`自定义匹配规则 |
如果你的组件,不符合easycom前述的`路径规范`。可以在pages.json的easycom节点中自行定义路径规范。
如果需要匹配node_modules内的vue文件,需要使用`packageName/path/to/vue-file-$1.vue`形式的匹配规则,其中`packageName`为安装的包名,`/path/to/vue-file-$1.vue`为vue文件在包内的路径。
```json
"easycom": {
"autoscan": true,
"custom": {
"^uni-(.*)": "@/components/uni-$1.vue", // 匹配components目录内的vue文件
"^vue-file-(.*)": "packageName/path/to/vue-file-$1.vue" // 匹配node_modules内的vue文件
}
}
```
**说明**
- `easycom`方式引入的组件无需在页面内`import`,也不需要在`components`内声明,即可在任意页面使用。
- `easycom`方式引入组件不是全局引入,而是局部引入。例如在H5端只有加载相应页面才会加载使用的组件。
- 在组件名完全一致的情况下,`easycom`引入的优先级低于手动引入(区分连字符形式与驼峰形式)。
- 考虑到编译速度,直接在`pages.json`内修改`easycom`不会触发重新编译,需要改动页面内容触发。
- `easycom`只处理vue组件,不处理小程序专用组件(如微信的wxml格式组件)。不处理后缀为.nvue的组件。因为nvue页面引入的组件也是.vue组件。可以参考uni ui,使用vue后缀,同时兼容nvue页面。
- `nvue`页面里引用`.vue`后缀的组件,会按照nvue方式使用原生渲染,其中不支持的css会被忽略掉。这种情况同样支持`easycom`。
- `vue` 与 `uvue` 组件优先级,[详见](https://doc.dcloud.net.cn/uni-app-x/component/README.html#priority)。
### Bug & Tips@easycom_tips
+ HBuilderX 3.96 版本以下`uni-app x`项目,当页面文件名与`easycom`的组件名一样时,会渲染异常,可以通过调整页面文件名规避该Bug。
## tabBar
如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。
在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性能。在这两个平台,底层原生引擎在启动时无需等待js引擎初始化,即可直接读取 pages.json 中配置的 tabBar 信息,渲染原生tab。
**Tips**
- 当设置 position 为 top 时,将不会显示 icon
- tabBar 中的 list 是一个数组,只能配置最少2个、最多5个 tab,tab 按数组的顺序排序。
- tabbar 切换第一次加载时可能渲染不及时,可以在每个tabbar页面的onLoad生命周期里先弹出一个等待雪花(hello uni-app使用了此方式)
- tabbar 的页面展现过一次后就保留在内存中,再次切换 tabbar 页面,只会触发每个页面的onShow,不会再触发onLoad。
- 顶部的 tabbar 目前仅微信小程序上支持。需要用到顶部选项卡的话,建议不使用 tabbar 的顶部设置,而是自己做顶部选项卡,可参考 hello uni-app->模板->顶部选项卡。
**属性说明:**
|属性|类型|必填|默认值|描述|平台差异说明|
|:-|:-|:-|:-|:-|:-|
|color|HexColor|是||tab 上的文字默认颜色||
|selectedColor|HexColor|是||tab 上的文字选中时的颜色||
|backgroundColor|HexColor|是||tab 的背景色||
|borderStyle|String|否|black|tabbar 上边框的颜色,可选值 black/white,也支持其他颜色值|App 2.3.4+ 、H5 3.0.0+|
|blurEffect|String|否|none|iOS 高斯模糊效果,可选值 dark/extralight/light/none(参考:[使用说明](https://ask.dcloud.net.cn/article/36617))|App 2.4.0+ 支持(uni-app x 不支持)、H5 3.0.0+(只有最新版浏览器才支持)|
|list|Array|是||tab 的列表,详见 list 属性说明,最少2个、最多5个 tab||
|position|String|否|bottom|可选值 bottom、top|top 值仅微信小程序支持|
|fontSize|String|否|10px|文字默认大小|App 2.3.4+、H5 3.0.0+|
|iconWidth|String|否|24px|图标默认宽度(高度等比例缩放)|App 2.3.4+、H5 3.0.0+|
|spacing|String|否|3px|图标和文字的间距|App 2.3.4+、H5 3.0.0+|
|height|String|否|50px|tabBar 默认高度|App 2.3.4+、H5 3.0.0+|
|midButton|Object|否||中间按钮 仅在 list 项为偶数时有效|App 2.3.4+、H5 3.0.0+|
|iconfontSrc|String|否||list设置 iconfont 属性时,需要指定字体文件路径 |App 3.4.4+、H5 3.5.3+|
|backgroundImage|String|否||设置背景图片,优先级高于 backgroundColor |App|
|backgroundRepeat|String|否||设置标题栏的背景图平铺方式,可取值:"repeat" - 背景图片在垂直方向和水平方向平铺;"repeat-x" - 背景图片在水平方向平铺,垂直方向拉伸;"repeat-y" - 背景图片在垂直方向平铺,水平方向拉伸;"no-repeat" - 背景图片在垂直方向和水平方向都拉伸。 默认使用 "no-repeat"|App|
|redDotColor|String|否||tabbar上红点颜色|App|
其中 list 接收一个数组,数组中的每个项都是一个对象,其属性值如下:
|属性|类型|必填|说明|平台差异|
|:-|:-|:-|:-|:-|
|pagePath|String|是|页面路径,必须在 pages 中先定义||
|text|String|是|tab 上按钮文字,在 App 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标||
|iconPath|String|否|图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片,不支持字体图标||
|selectedIconPath|String|否|选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效||
|visible|Boolean|否|该项是否显示,默认显示|App (3.2.10+)、H5 (3.2.10+)|
|iconfont|Object|否|字体图标,优先级高于 iconPath|App(3.4.4+)、H5 (3.5.3+)|
**midButton 属性说明**
|属性|类型|必填|默认值|描述|
|:-|:-|:-|:-|:-|
|width|String|否|80px|中间按钮的宽度,tabBar 其它项为减去此宽度后平分,默认值为与其它项平分宽度|
|height|String|否|50px|中间按钮的高度,可以大于 tabBar 高度,达到中间凸起的效果|
|text|String|否||中间按钮的文字|
|iconPath|String|否||中间按钮的图片路径|
|iconWidth|String|否|24px|图片宽度(高度等比例缩放)|
|backgroundImage|String|否||中间按钮的背景图片路径|
|iconfont|Object|否||字体图标,优先级高于 iconPath|App(3.4.4+)|
midButton没有pagePath,需监听点击事件,自行处理点击后的行为逻辑。监听点击事件为调用API:uni.onTabBarMidButtonTap,详见[https://uniapp.dcloud.io/api/ui/tabbar?id=ontabbarmidbuttontap](https://uniapp.dcloud.io/api/ui/tabbar?id=ontabbarmidbuttontap)
**iconfont参数说明:**
|属性|类型|说明|
|:-|:-|:-|
|text|String|字库 Unicode 码|
|selectedText|String|选中后字库 Unicode 码|
|fontSize|String|字体图标字号(px)|
|color|String|字体图标颜色|
|selectedColor|String|字体图标选中颜色|
#### **tabbar常见问题** @tips-tabbar
- tabbar 的 js api 见[接口-界面-tabbar](https://uniapp.dcloud.io/api/ui/tabbar),可实现动态显示隐藏(如弹出层无法覆盖tabbar)、内容修改(如国际化)、item加角标等功能。hello uni-app中也有示例。
- tabbar 的 item 点击事件见[页面生命周期的onTabItemTap](https://uniapp.dcloud.io/tutorial/page.html#lifecycle)。
- 代码跳转到 tabbar 页面,api只能使用[uni.switchTab](https://uniapp.dcloud.io/api/router?id=switchtab),不能使用uni.navigateTo、uni.redirectTo;使用navigator组件跳转时必须设置[open-type="switchTab"](https://uniapp.dcloud.io/component/navigator)
- tabbar 的默认高度,在不同平台不一样。App端的默认高度在HBuilderX 2.3.4起从56px调整为50px,与H5端统一。开发者也可以自行设定高度,调回56px。[详见](https://uniapp.dcloud.io/tutorial/syntax-css.html#固定值)
- tabbar 在H5端是div模拟的,属于前端屏幕窗口的一部分,如果要使用bottom居底定位方式,应该使用css变量`--window-bottom`,比如悬浮在tabbar上方10px的按钮,样式如下`bottom: calc(var(--window-bottom) + 10px)`
- 中间带+号的tabbar模板例子,[参考](https://ext.dcloud.net.cn/plugin?id=98)。可跨端,但+号不凸起。如需中间凸起,配置tabbar的midButton。
- 如果是需要先登录、后进入tab页面,不需要把登录页设为首页,首页仍然是tabbar页,可参考[云端一体登录模板](https://ext.dcloud.net.cn/plugin?id=13)
- 前端弹出遮罩层挡不住tabbar的问题,跨端处理方式时动态隐藏tabbar。App端可以使用plus.nativeObj.view或subNVue做弹出和遮罩,可参考这个[底部原生图标分享菜单例子](https://ext.dcloud.net.cn/plugin?id=69)
- 微信小程序模拟器1.02.1904090版有bug,在缩放模拟器页面百分比后,tabbar点击多次后就会卡死。真机无碍,使用时注意。[详见](https://developers.weixin.qq.com/community/develop/doc/0002e6e6bf0d602d8c783e10756400)
- PC宽屏上,当页面存在topWindow或leftWindow或rightWindow等多窗体结构时,若想改变 tabbar 显示的位置,请使用 [custom-tab-bar组件](https://uniapp.dcloud.io/component/custom-tab-bar) 配置,若想隐藏 tabbar,可以使用如下 css(好处是可以和 leftwindow 等窗体联动):
```css
.uni-app--showleftwindow + .uni-tabbar-bottom {
display: none;
}
```
**代码示例**
```json
"tabBar": {
"color": "#7A7E83",
"selectedColor": "#3cc51f",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/component/index",
"iconPath": "static/image/icon_component.png",
"selectedIconPath": "static/image/icon_component_HL.png",
"text": "组件"
}, {
"pagePath": "pages/API/index",
"iconPath": "static/image/icon_API.png",
"selectedIconPath": "static/image/icon_API_HL.png",
"text": "接口"
}]
}
```
#### 自定义tabbar @custom-tab-bar
原生tabBar是相对固定的配置方式,可能无法满足所有场景,这就涉及到自定义tabBar。
但注意除了H5端,自定义tabBar的性能体验会低于原生tabBar。App和小程序端非必要不要自定义。
- H5端的自定义tabBar组件:H5端不存在原生tabBar性能更高的概念,并且宽屏下常见的tabBar在顶部而不是底部,此时可以使用 [custom-tab-bar组件](https://uniapp.dcloud.io/component/custom-tab-bar) 来自定义
- 普通自定义tabBar:使用view自行绘制tabBar。如果页面是多页方式,切换tabBar将无法保持底部tabBar一直显示。所以这种情况建议使用单页方式。单页方式,如果是复杂页面,应用性能会下降明显,需减少页面复杂度。如果是App端,nvue单页的性能会显著高于vue页面
- 微信小程序自定义tabbar:微信提供一直基于webview自定义tabBar的方案。该功能体验不佳,不太推荐使用。如果要使用,参考[微信文档](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html),项目根创建 custom-tab-bar 目录,注意里边的代码是 wxml,wxss,不是 vue,uni-app编译器会直接拷贝该目录到微信小程序中
- 原生的tabbar有且只有一个且在首页。二级页如需的tab,需自行编写view来实现。一般二级页面更适合的导航是 [segement组件](https://ext.dcloud.net.cn/plugin?id=54)
## condition
启动模式配置,仅开发期间生效,用于模拟直达页面的场景,如:小程序转发后,用户点击所打开的页面。
**属性说明:**
|属性|类型|是否必填|描述|
|:-|:-|:-|:-|
|current|Number|是|当前激活的模式,list节点的索引值|
|list|Array|是|启动模式列表|
**list说明:**
|属性|类型|是否必填|描述|
|:-|:-|:-|:-|
|name|String|是|启动模式名称|
|path|String|是|启动页面路径|
|query|String|否|启动参数,可在页面的 [onLoad](/tutorial/page.html#lifecycle) 函数里获得|
**注意:** 在 App 里真机运行可直接打开配置的页面,微信开发者工具里需要手动改变编译模式,如下图:
┌─pages
│ ├─index
│ │ └─index.vue
│ └─login
│ └─login.vue
├─pagesA
│ ├─static
│ └─list
│ └─list.vue
├─pagesB
│ ├─static
│ └─detail
│ └─detail.vue
├─static
├─main.js
├─App.vue
├─manifest.json
└─pages.json
则需要在 pages.json 中填写
```javascript
{
"pages": [{
"path": "pages/index/index",
"style": { ...}
}, {
"path": "pages/login/login",
"style": { ...}
}],
"subPackages": [{
"root": "pagesA",
"pages": [{
"path": "list/list",
"style": { ...}
}]
}, {
"root": "pagesB",
"pages": [{
"path": "detail/detail",
"style": { ...}
}]
}],
"preloadRule": {
"pagesA/list/list": {
"network": "all",
"packages": ["__APP__"]
},
"pagesB/detail/detail": {
"network": "all",
"packages": ["pagesA"]
}
}
}
```
## preloadRule
分包预载配置。
配置preloadRule后,在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度
`preloadRule` 中,`key` 是页面路径,`value` 是进入此页面的预下载配置,每个配置有以下几项:
|字段|类型|必填|默认值|说明|
|---|---|---|---|---|
|packages|StringArray |是|无|进入页面后预下载分包的 `root` 或 `name`。`__APP__` 表示主包。|
|network|String|否 |wifi|在指定网络下预下载,可选值为:all(不限网络)、wifi(仅wifi下预下载)|
app的分包,同样支持preloadRule,但网络规则无效。
## FAQ
- Q:为什么在pages.json里配置小程序定位权限描述,无法编译到小程序端,运行后一直提示getLocation需要在app.json中声明
- A:微信小程序的权限描述配置在manifest中,不在pages.json中,具体参考文档:[https://uniapp.dcloud.io/collocation/manifest?id=mp-weixin](https://uniapp.dcloud.io/collocation/manifest?id=mp-weixin)