最近接到个需求, 需要在video组件上弹出弹窗, 也就是覆盖video这个原生组件
未播放时, 弹窗可以覆盖, 但是当video播放时, 写的弹窗就覆盖不了了
因为video是原生组件, 层级非常高, 普通标签是覆盖不了的, map标签同理
覆盖原生组件, 官方给出解决办法一. 使用cover-view标签 二. 使用subNvue原生子窗体, 或者Nvue
此处因为弹窗样式比较多元, cover-view不支持嵌套, 故选择使用subNvue来写这个弹窗
我这个页面配置了两个subnvue
{
"path": "pages/player/player1",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
// 将回弹属性关掉
"bounce": "none",
"popGesture": "none",
"subNVues": [{
"id": "newMetalModal", // 唯一标识
"path": "pages/player/subNVue/newMetalModal", // 页面路径
// "type": "popup", // 这里不需要
"style": {
"position": "absolute",
"dock": "top",
"background": "transparent",
"margin": "auto"
}
}, {
"id": "cardSuccessModal", // 唯一标识
"path": "pages/player/subNVue/cardSuccessModal", // 页面路径
// "type": "popup", // 这里不需要
"style": {
"position": "absolute",
"dock": "top",
"background": "transparent",
"margin": "auto"
}
}]
}
}
},
官方给出nvue开发的注意事项, 和vue写法的区别, 在此不赘述
传送门 https://uniapp.dcloud.net.cn/tutorial/nvue-outline.html#nvue%E4%BB%8B%E7%BB%8D
const subNVue = uni.getSubNVueById('newMetalModal') //设置子窗体
subNVue.show('slide-in-left', 200, () => {
uni.$emit('sendMetalList', { // 与子窗体通信
metalList: this.metalList,
});
})
uni.$on('sendMetalList', data => {
his.metalList = data.metalList;
});
虽然原生窗体实现覆盖原生标签的作用, 但开发起来坑是一个接一个的,
不支持hbx调试, 必须真机, 而且有时不能实时编译
样式和标签使用上都有局限, 样式上特别是整个窗体的样式控制不是很灵活
页面对窗体显示隐藏的控制也没那么灵活, 类似dom元素的控制
subnvue和nvue还存在安卓和ios的兼容问题, 具体这里不细述了 , 主要时间太久忘了~~~~