动态修改页面标题应在 onLoad 中调用 uni.setNavigationBarTitle 最稳妥;若无效,检查是否启用 custom 导航栏;H5 退化为 document.title;注意中文乱码、空格及长度限制;多端表现不一需条件判断。

uni-app 动态修改页面标题不生效?先看生命周期时机
动态改 navigationBarTitleText 必须在页面 onLoad 或之后触发,onShow 里改无效(iOS 尤其明显)。因为原生导航栏在页面创建时已初始化,uni-app 不支持运行时重绘整个导航栏结构。
-
onLoad中调用uni.setNavigationBarTitle是最稳妥的时机 -
onReady也可用,但没必要——标题内容通常依赖options或接口数据,onLoad已能拿到 - 别在
onShow里反复调用,安卓可能闪一下,iOS 直接忽略
uni.setNavigationBarTitle 在某些页面没反应?检查页面配置
如果调用 uni.setNavigationBarTitle 后标题纹丝不动,大概率是当前页面启用了自定义导航栏(navigationStyle: custom),此时原生导航栏被隐藏,setNavigationBarTitle 失去作用对象。
- 检查
pages.json对应页面的style配置,确认没有"navigationStyle": "custom" - 若必须用自定义导航栏,标题就得自己用
<view>实现,setNavigationBarTitle完全无效 - H5 平台下该 API 会退化为修改
document.title,和原生表现不一致,别依赖它做跨平台一致性判断
setTitle 后中文乱码或显示异常?注意字符串编码与空格处理
标题传入含不可见字符(如零宽空格、BOM)、连续空格或超长字符串时,部分 Android 厂商定制系统会截断或渲染异常。
- 传参前用
title.trim().replace(/s+/g, ' ')清理多余空白 - 避免从后端直接拼接标题,尤其带用户昵称时,先
encodeURIComponent再解码不现实,简单过滤更实际 - 长度建议控制在 12 字以内(Android 显示上限常为 14~16 UTF-16 单位,中文占 2),超长会被省略号截断且无法干预
多端表现不一致?别硬扛,按平台条件判断
微信小程序中 setNavigationBarTitle 支持度最好;App 端(尤其是 iOS)对异步设置敏感;H5 则只是改 document.title,和地址栏无关。
- 需要精确控制时,优先在
pages.json静态配好navigationBarTitleText,动态仅用于少数需响应数据的场景 - 如果标题依赖异步请求,
onLoad里先设个 loading 文本(如" 加载中……"),再在then里更新真实标题 - App 端遇到偶发失效,可加一层
setTimeout延迟 50ms 再调用(不是治本,但比 retry 更轻量)
真正麻烦的是“页面 A 跳转到 B,B 的标题要根据 A 传来的参数动态生成”,这时候容易漏掉 onLoad 参数解析逻辑,或者把 setTitle 写在了 data 初始化块里——那会比生命周期还早,必然失败。