uniapp 在app端使用nvue来解决视频层级过高

1.在pagejson中申明nvue

{
			"path": "pages/detail/detail",
			"style": {
				"navigationBarTitleText": "商品详情",
				"app-plus": {
					"titleNView": false,
					"subNVues": [{
						"id": "goodsBottom",
						"path": "pages/detail/subnvue/goodsBottom",
						"style": {
							"type": "popup",
							"position": "dock",
							"dock": "bottom",
							"width": "750upx",
							"height": "100upx",
							"zindex": 2
						}
					},
					{
						"id": "goodsSpec",
						"path": "pages/detail/subnvue/goodsSpec",
						"type": "popup",
						"style": {
							"width": "750upx",
							"top":  "20%",
							"bottom": "0upx",
							"zindex": 3

						}
					},{
						"id": "coupon",
						"path": "pages/detail/subnvue/coupon",
						"type": "popup",
						"style": {
							"width": "750upx",
							"top":  "50%",
							"bottom": "0upx",
							"zindex": 3
						}
					},{
						"id": "share",
						"path": "paltform/app-plus/subNVue/shareDetail",//这个放在pages外部目录的nvue
						"type": "popup",
						"style": {
							"width": "750upx",
							"height":"250upx",
							"bottom": "0upx",
							"zindex": 3
						}
					}]
				}
			}
		}

2.要是放在pages同级目录需要注意坑

3.vue和nvue之间的通讯

①在vue向nvue通讯

methods:{

    collect(){
        // #ifdef APP-PLUS
            //触发监听  并传值
			uni.$emit('goods_bottom_setval',{isCollected:this.isCollected})
		// #endif
    }

}

②在nvue

    created() {
              //监听vue中的事件
			const vm = this;
			uni.$on('goods_spec_setval', (data) => {

				console.log('goods_spec_setval', data.product)
				this.detail=data.detail
				for (var key in data) {
					vm[key] = data[key]
				}
				// vm.title = data.title;
				// vm.content = data.content;
				//console.log(vm.product.Products_JSON.imgPath)
			})
		},
		beforeDestroy() {
			uni.$off('goods_spec_setval')
		},
		methods: {
			toHome() {
				uni.switchTab({
					url: '/pages/index/index'
				})
			},
			addCart() {
				// if (!this.$fun.checkIsLogin(1, 1)) {
				//     return;
				// }
				uni.$emit('cartHandle', {});
                //向vue发送监听  cartHandle   vue页面监听
			},
			directBuy() {

				// if (!this.$fun.checkIsLogin(1, 1)) {
				//     return;
				// }
				uni.$emit('directHandle');
			},
			lingqu() {
				if (this.canSubmit) {
					this.$emit('goGet')
				}
			}
		}

③在vue页面的监听和取消监听

onLoad: function (option) {

		// #ifdef APP-PLUS
            //条件编译只在app才会使用nvue  监听nvue传递的函数
			const vm = this;

            //控制nvue的显示和隐藏  show  hide 通过pages.json的id
			const subNVue2 = uni.getSubNVueById('goodsBottom')
			subNVue2.show()


		uni.$on('cartHandle', (data) => {
			vm.addCart()        //调用vue当前的方法
		})
		uni.$on('directHandle',(data)=>{
			vm.directBuy()
		})

		uni.$on('kefu', (data) => {
			vm.contact()
		})

		uni.$on('collectHandle',(data)=>{
			console.log('触发收藏事件')
			vm.collect()
		})
		uni.$on('getMyCoupon',(data)=>{
			console.log('触发领取事件')
			vm.getMyCoupon(data.item,data.i)
		})
		uni.$on('goNextPage',(data)=>{
			console.log('触发优惠券下一页事件')
			vm.goNextPage()
		})

		uni.$on('shareDetail',(data)=>{

			if(data.detail!='detail') return
				console.log('触发普通详情分享')
				vm.shareFunc(data.item)


		})

		uni.$on('goodsSkuSub',(data)=>{
			if(data.detail!='detail') return    //因为多个使用同一nvue  所以根据传递的值 判断,不然后多个地方触发
			console.log('触发这么多次事件????')
			let {check_attr,check_attrid_arr,submit_flag,postData} = data
			this.check_attr = check_attr
			this.check_attrid_arr = check_attrid_arr
			this.submit_flag = submit_flag
			this.postData = postData
			vm.skuSub()
			//隐藏规格框
			const goodsSpecNvue = uni.getSubNVueById('goodsSpec')
			goodsSpecNvue.hide()
		})


		uni.$on('goGet',(data)=>{
			console.log('触发立即领取')
			vm.lingqu()
		})
		// #endif


	 },

	mounted(){

	},
	onUnload(){
		// #ifdef APP-PLUS
               //条件编译 关闭监听 如果不写关闭 在安卓会卡死重启
			uni.$off('cartHandle')
			uni.$off('directHandle')

			uni.$off('collectHandle')
			uni.$off('getMyCoupon')
			uni.$off('goNextPage')

			uni.$off('shareDetail')
			uni.$off('kefu')

			uni.$off('goodsSkuSub')

			uni.$off('goGet')
		// #endif
	},

 

UniApp 是一款基于 Vue 的跨平台框架,它允许开发者编写一套代码,构建并发布到多个平台上,如微信小程序、H5、Android、iOS等。如果你想要在 TabBar(底部导航栏)上使用 NVue 组件,并在 UniApp 中覆盖原生的 TabBar,这需要一些特殊的处理: 1. **理解TabBar的工作原理**:在 UniApp 中,TabBar 通常由 `uni-tabbar` 组件负责,它是预置的组件,其样式和功能是由框架提供的。 2. **引入NVue组件**:尽管 UniApp 使用 Vue 生态,但是 TabBar 上的层级结构并不支持直接混入 NVue。你需要将 NVue 组件作为自定义组件开发,然后通过插件或者其他方式动态替换或覆盖原有的 TabBar 项。 3. **创建自定义 TabBar 组件**:你可以创建一个名为 `CustomTabBar.vue` 的文件,使用 NVue 的语法编写你的自定义 tab 项。记得在这个组件中添加事件监听,以便与 NVue 实现交互。 4. **替换TabBar**:在全局或者 App.vue 文件中,你可以尝试动态地设置 `uni-tabbar` 的数据源,使其包含你的自定义组件。例如,你可以使用 Vue 的 `v-for` 或者 `ref` 更新 TabBar 内容。 ```vue <template> <uni-tabbar v-if="isNVueTabbar" :items="customTabItems" /> </template> <script> export default { data() { return { isNVueTabbar: false, // 根据实际情况切换是否启用 NVue TabBar customTabItems: [], // 这里存储你的 NVue TabBar 项 }; }, methods: { switchTabbarType() { this.isNVueTabbar = !this.isNVueTabbar; }, ... // 可能需要的其他事件处理器 }, mounted() { this.switchTabbarType(); // 初始状态 }, }; </script> ``` **注意事项**: - 由于 UniAppNVue 之间的差异,这种方法可能存在一定的兼容性和性能问题,具体取决于 UniApp 是否完全支持这种动态替换。 - 在实际操作之前,建议查阅 UniApp 的官方文档或者社区论坛,确认是否有更推荐的方式来实现类似需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木贝西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值