nvue页面仍存在层级遮挡,因其虽原生渲染,但混用vue组件、误用subnvue或错误配置(如height用百分比、zindex滥用、cover-view误用)会导致ios/android表现不一、点击失效、位置偏移等问题。

为什么nvue页面里还会有层级遮挡?
因为nvue本身是原生渲染,但如果你在nvue页面里混用了vue组件(比如通过v-if动态插入video或map),或者误把nvue当成了“万能解药”,就可能掉进新坑:nvue子窗体(subNVue)和主nvue页面之间、甚至多个subNVue之间,依然存在z-index竞争和平台差异。
典型现象是:弹幕层显示了,但点击无响应;地图标记点位置偏移;iOS上正常,Android上被tabbar切掉一半。
-
subNVue默认层级高于主nvue页面,但多个subNVue之间按pages.json中配置顺序叠加,后写的会盖在前面的上面 - nvue页面内不能直接放
video或map——它们在nvue中不支持,必须用cover-view配合原生video组件(App端需用plus.videoAPI) - Android下
subNVue的height若设为百分比(如"100%")会失效,必须用rpx或固定px
pages.json里subNVue配置的关键参数
配置错一个字段,整个覆盖层就失效。重点不是加不加,而是怎么加。
-
id必须全局唯一,且后续要用uni.getSubNVueById("xxx")控制显隐,不能靠v-if -
position: "absolute"是强制要求,static或relative会被忽略 -
zindex只在App端生效,且仅对同级subNVue起作用;iOS下实际层级由创建顺序决定 -
type: "popup"可启用系统级弹出动画,但会禁用部分手势交互;普通浮层建议留空
错误示例:"height": "100%" → 正确写法:"height": "600rpx" 或 "bottom": "0", "top": "auto"
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
nvue与vue页面通信时的层级陷阱
你在vue页调用uni.showPopup(),结果弹窗闪一下就没了?大概率是通信时机不对,导致subNVue还没ready就被show()了。
- 务必等
onReady回调触发后再发消息,不要在mounted里直接uni.postMessage - subNVue内部不能用
uni.$on监听全局事件,要用uni.on(...)绑定到当前实例 - 从vue页传数据给subNVue,优先走
uni.postMessage,别用uni.setStorageSync——异步写入可能来不及读取 - subNVue里调用
uni.hideKeyboard()可能无效,需先plus.webview.currentWebview().evalJS("uni.hideKeyboard()")
cover-view在nvue里根本不能用
这是最常被文档误导的一点:cover-view是小程序专属组件,在nvue页面中完全不识别,写进去等于没写,编译也不报错,但运行时直接消失。
如果你正在nvue里写<cover-view><cover-view>按钮</cover-view></cover-view>,那它不会出现在任何地方——连DOM树里都找不到。
- nvue中要覆盖原生视频,只能走
subNVue+ 原生video控件(App端)或cover-view(仅限小程序,此时你已不在nvue环境) - nvue页面里所有UI必须用
view/text/image等nvue原生标签,div、span、cover-*全都不认 - 想兼容多端?方案不是“一套代码跑所有”,而是分端判断:
uni.getSystemInfoSync().platform === 'app'时走subNVue,=== 'mp-weixin'时走cover-view
真正难的从来不是写出来,而是想清楚你到底在哪个渲染层里干活——WebView、cover层、还是Weex原生层。跨错一层,z-index就成摆设。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










