最轻量改标题是直接设navigationbartitletext,仅适用于纯文字静态标题;动态改需用uni.setnavigationbartitle(onready后调用);自定义导航栏须设navigationstyle:"custom"并手动处理状态栏和平台差异。
直接改 navigationbartitletext 是最轻量、最稳妥的方式,适用于纯文字标题且无需动态更新的场景;需要动态改标题或混用图标/按钮时,必须走自定义组件 + navigationstyle: "custom" 路线,否则会丢功能或出兼容问题。
pages.json 里静态设置标题文字
这是最常用也最容易被忽略细节的方式。在 pages.json 的页面级 style 或 globalStyle 中配 navigationBarTitleText 即可生效,但要注意:
- 只对原生导航栏有效 —— 即未设置
navigationStyle: "custom"的页面 - 不支持富文本、图标、按钮等任何嵌入内容,纯字符串
- 中文标点、空格、emoji 都能正常显示,但过长会被截断(微信小程序约 12 字以内较安全)
- H5 端会 fallback 到
document.title,App 端渲染为原生 title,性能比 DOM 渲染高
示例:
{"path": "pages/detail/detail", "style": {"navigationBarTitleText": "商品详情"}}
运行时动态修改标题用 uni.setNavigationBarTitle
当标题需根据接口数据、路由参数或用户操作实时变化时,不能只靠配置,得调 API。但这个函数有明显限制和坑:
- 必须在
onReady或之后调用,onLoad里大概率失效(框架初始化还没完) - 微信小程序中,如果页面设置了
navigationStyle: "custom",该 API 完全无效 —— 此时标题已由你自己的组件控制 - 部分平台(如 QQ 小程序)在
onShow中调用需加setTimeout延迟 100ms 左右,否则被内部逻辑覆盖 - 不返回 Promise,只能靠
success/fail回调判断是否成功,失败时无明确错误码,建议加兜底日志
示例:
onReady() { uni.setNavigationBarTitle({ title: this.productName || '加载中' }); }
自定义组件里完全接管标题(含图标/按钮/搜索框)
一旦你用了 navigationStyle: "custom",标题就彻底脱离系统控制,变成你 <view></view> 里的一个 <text></text> 或插槽内容。这时标题不是“设置”出来的,而是“写出来”的:
- 必须手动处理状态栏高度:用
uni.getSystemInfoSync().statusBarHeight获取值,并通过 CSS 变量或内联样式顶上去,否则标题会被状态栏遮住 - 若要兼容 iOS 安全区,推荐用
env(safe-area-inset-top),而不是硬写像素值 -
left-icon和right-icon属性只在<uni-nav-bar></uni-nav-bar>组件中有效,原生navigationBarTitleText不支持图标 - 搜索框、下拉菜单等复杂交互无法塞进原生导航栏,只能走自定义组件方案
示例结构:
<view class="custom-nav" :style="{ paddingTop: statusBarHeight + 'px' }"><view class="title">{{ title }}</view></view>
真正容易被忽略的是:不同平台对「标题颜色」的控制粒度完全不同。比如微信小程序要求 frontColor 只能是 #000000 或 #ffffff,而支付宝小程序却允许任意色值 —— 这意味着你不能只靠一套配色方案打天下,得按平台条件编译或运行时判断。











