一、前言:为什么每个页面都需要配置?
在微信小程序中,除了全局的 app.json,每个页面还可以拥有自己的配置文件 xxx.json (如 index.json)。
这些页面级配置允许你:
- 为不同页面设置不同的导航栏标题或颜色
- 单独开启/关闭下拉刷新、上拉触底
- 引入自定义组件
- 覆盖全局默认样式
📌 核心原则 :
页面配置 > 全局配置。当两者冲突时,以页面配置为准。
本文将带你:
✅ 掌握 page.json 所有可用字段
✅ 理解与 app.json 的继承与覆盖机制
✅ 学会配置自定义组件和特殊能力
✅ 避开常见配置陷阱
二、页面配置文件基础
每个页面目录下可包含一个 .json 文件,例如:
pages/
└── detail/
├── detail.js
├── detail.wxml
├── detail.wxss
└── detail.json ← 页面配置文件
⚠️ 注意:
- 文件名必须与页面同名
- 必须是合法 JSON(不支持注释)
- 若无需特殊配置,可省略该文件(此时完全继承全局配置)
三、页面配置 vs 全局配置:优先级规则
小程序的配置遵循 "就近原则":
| 配置项 | 来源 | 优先级 |
|---|---|---|
| 页面窗口表现 | page.json → app.json |
page.json 优先 |
| 页面路径、tabBar | 仅 app.json |
不可覆盖 |
| 网络超时、分包 | 仅 app.json |
不可覆盖 |
示例:导航栏标题
javascript
// app.json
{
"window": {
"navigationBarTitleText": "默认标题"
}
}
javascript
// pages/detail/detail.json
{
"navigationBarTitleText": "商品详情"
}
✅ 结果:
detail页面显示 "商品详情",其他页面显示 "默认标题"。
四、page.json 支持的核心字段(窗口配置)
页面配置主要通过 window 相关字段 (直接写在根层级,无需嵌套 window 对象)来覆盖全局设置。
🔔 重要:在
page.json中,字段直接平铺 ,不像app.json那样包裹在window里!
常用字段列表:
| 字段 | 类型 | 说明 |
|---|---|---|
navigationBarTitleText |
string | 导航栏标题 |
navigationBarBackgroundColor |
string | 导航栏背景色(十六进制) |
navigationBarTextStyle |
string | 标题颜色(black / white) |
backgroundColor |
string | 页面背景色 |
backgroundTextStyle |
string | 下拉 loading 的样式(dark / light) |
enablePullDownRefresh |
boolean | 是否开启当前页面下拉刷新 |
onReachBottomDistance |
number | 页面上拉触底事件触发距离(px) |
disableScroll |
boolean | 禁止页面滚动(慎用) |
navigationStyle |
string | 导航栏样式(default / custom) |
示例:商品详情页配置
javascript
// pages/detail/detail.json
{
"navigationBarTitleText": "iPhone 16 Pro",
"navigationBarBackgroundColor": "#000000",
"navigationBarTextStyle": "white",
"enablePullDownRefresh": true,
"onReachBottomDistance": 100
}
💡 场景:商品页需要下拉刷新库存,但首页不需要。
五、高级配置:自定义导航栏(navigationStyle: "custom")
当需要完全自定义顶部区域(如透明导航、沉浸式头图),可隐藏默认导航栏:
javascript
{
"navigationStyle": "custom"
}
此时:
- 默认导航栏(标题+返回按钮)消失
- 页面内容从屏幕最顶部开始渲染
- 需自行实现返回按钮(使用
wx.navigateBack)
WXML 示例:
XML
<view class="custom-nav">
<button open-type="navigateBack" class="back-btn">←</button>
<text class="title">自定义标题</text>
</view>
⚠️ 注意:
- iOS 状态栏(电量、时间)仍存在
- 需手动处理刘海屏安全区(使用
env(safe-area-inset-top))
六、引入自定义组件:usingComponents
page.json 还可用于注册页面级自定义组件(推荐方式)。
javascript
// pages/order/confirm.json
{
"usingComponents": {
"address-item": "/components/address-item/address-item",
"coupon-selector": "/components/coupon-selector/coupon-selector"
}
}
✅ 优势:
按需引入,避免全局污染
组件路径支持相对路径或绝对路径(以
/开头)
📁 组件目录建议:components/
├── address-item/
│ ├── address-item.js
│ ├── address-item.json
│ ├── address-item.wxml
│ └── address-item.wxss
七、页面配置的常见误区
❌ 误区 1:"在 page.json 里写 window 对象"
错误写法:
javascript{ "window": { "navigationBarTitleText": "标题" } }正确写法:
javascript{ "navigationBarTitleText": "标题" }
❌ 误区 2:"以为能覆盖 tabBar 或 pages"
事实 :
tabBar、pages、subpackages等只能在app.json中定义,页面无法修改。
❌ 误区 3:"配置了 enablePullDownRefresh 但没监听 onPullDownRefresh"
后果 :下拉无效果
解决:在页面 JS 中实现
javascriptPage({ onPullDownRefresh() { // 刷新逻辑 wx.stopPullDownRefresh(); // 别忘了停止动画 } });
八、最佳实践建议
- 差异化配置才写 page.json
如果页面与全局一致,不要创建空 json 文件。 - 统一命名规范
如所有商品页使用相同背景色,可抽离为模板。 - 自定义组件按需引入
避免在app.json全局注册所有组件,增加主包体积。 - 下拉刷新务必配对 JS 逻辑
否则用户会看到 loading 动画但无实际更新。
九、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!