uniapp显示遮罩(选规格)

本文介绍了一个基于Vue的购物车组件实现方案,该组件能够展示商品详情并支持规格与数量的选择。通过状态管理来控制组件的显示与隐藏,并详细解释了组件的创建、挂载及使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、可以新建一个组件

zhezhao.vue

<template>
	<u-overlay :show="show" @click="handleClose">
		<view v-if="odata" class="bg-fff pop-cont" @tap.stop>
			<view class="flex padding u-border-bottom">
				<image class="poster margin-right" :src="odata.img" mode="aspectFill"></image>
				<view class="fs-24">
					<view class="">
						{{odata.name}}
					</view>
					{{odata.french}}
					<view class="margin-tb-xs">
						¥{{odata.list[dropIdx].price}}
					</view>
					<text class="iconfont icon-canju"></text>
					{{odata.list[dropIdx].fittings}}
				</view>
			</view>
			<view class="flex justify-between padding u-border-bottom">
				<text>规格选择</text>
				<view class="spec-cont">
					<view @tap="listShow=!listShow">
						{{odata.list[dropIdx].spec}}
						({{odata.list[dropIdx].weight}})
						 - 
						 {{odata.list[dropIdx].edible}}
						<text class="iconfont icon-xiala"></text>
					</view>
					<view v-if="listShow" class="spec-list bg-fff my-shadow">
						<view v-for="(item,index) in odata.list" @tap="handleDrop(index)" :class="{'bg-grey':index==dropIdx}" class="padding-sm">
							{{item.spec}}({{item.weight}}) - {{item.edible}}
						</view>
					</view>
				</view>
			</view>
			<view class="flex justify-between padding">
				<text>数量选择</text>
				<u-number-box v-model="num" :min="1" :max="100" buttonSize="20"></u-number-box>
			</view>
			<view class="flex btn-cont">
				<view  @tap="handleClose" class="bg-grey padding">
					取消
				</view>
				<view @tap="handleOk" class="bg-yellow padding">
					确认
				</view>
			</view>
		</view>
	</u-overlay>
</template>

<script>
	export default {
		name:"good-spec",
		data() {
			return {
				listShow:false,
				dropIdx:0,  //被选中下拉规格序号
				num:1 //商品数量
			};
		},
		computed: {
			show() {
				return this.$store.state.cart.show 
			},
			odata(){ //弹窗商品数据
				return this.$store.state.cart.overlayData
			}
		},
		created(){
			console.log('弹窗组件显示了');
			if(!this.odata){return} //弹窗未显示的容错处理
			let {dropIdx,num} = this.odata
			if(dropIdx){ //判断新增、编辑
				this.dropIdx = dropIdx
				this.num = num
			}
		},
		methods: {
			handleClose() {
				this.$store.commit('cart/cartOverlayMut',false)
			},
			handleDrop(idx){ //规格选择
				this.dropIdx = idx
				this.listShow = false
			},
			handleOk(){ //商品添加
				let obj = {...this.odata}
				obj.dropIdx = this.dropIdx
				obj.id = obj.list[this.dropIdx].id //将商品id换为规格id
				obj.num = this.num
				this.$store.commit('cart/cartAddMut',obj)
				this.handleClose()
			}
		},
	}
</script>

<style lang="scss">
.pop-cont{   //这里是把遮罩控制在页面居中
	position: absolute;
	top: 50%;
	left: 3%;
	width: 94%;
	box-sizing: border-box;
	transform: translateY(-50%);
}
.poster{
	height: 160upx;
	width: 160upx;
}
.btn-cont{
	view{
		width: 50%;
		text-align: center;
	}
}
.spec-cont{
	position: relative;
	.spec-list{
		position: absolute;
		right: 0;
		top: 70upx;
		z-index: 2;
		width: 400upx;
	}
}
</style>

2、挂载在main.js

import GoodSpec from 'components/good-spec.vue'
Vue.component('good-spec',GoodSpec)

3、哪里需要这个组件就写在那个页面

<good-spec v-if="show"></good-spec>

4、

<u-overlay :show="show" @click="handleClose">
		<view v-if="odata" class="bg-fff pop-cont" @tap.stop>   //@tap.stop是阻止冒泡

在状态机新建一个数据包data 为null  然后把页面点击的数据传给this.data

页面代码

handleCartAdd(){ 
				this.$store.commit('cart/initOverlayDataMut',{  //连接状态机这个方法
					obj:this.gdata,  //传入的数据
					edit:-1
				})

状态代码

overlayData:null,  //存放弹窗商品数据
initOverlayDataMut(state,{obj,edit}){ //购物车按钮、编辑按钮,初始化弹窗数据
			state.overlayData = obj  //设置弹窗数据
			state.edit = edit
			state.show = true
		}

弹窗显示页面为 v-if=“data”   //说明 这个数据包有数据的时候才能开启遮罩

然后弹窗页面拿到数据包 渲染页面

computed: {
			show() {//接住一个bool判断是否开启弹窗
				return this.$store.state.cart.show 
			},
			odata(){ //弹窗商品数据接收
				return this.$store.state.cart.overlayData
			}
}


页面渲染
{{odata.name}}

### 如何在 UniApp 中防止按钮被遮罩层遮挡 为了确保按钮不会被遮罩层所遮挡,在设计页面布局时需要注意几个方面。通过调整 CSS 属性以及合理设置 HTML 结构,可以有效解决问题。 #### 使用 `z-index` 控制层级关系 CSS 的 `z-index` 属性用于控制元素的堆叠顺序。数值较高的元素会显示在较低数值之上。对于遮罩层和按钮而言: -遮罩层设定一个相对低一点的 z-index 值; - 对于需要保持可点击状态的按钮,则赋予更高的 z-index 值; 这样能够保证即使存在遮罩层的情况下,特定区域内的交互控件仍然处于最顶层并响应用户的操作[^1]。 ```css /* 设置遮罩层样式 */ .mask { position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0, 0, 0, .5); z-index: 998; /* 调整此值以适应实际需求 */ } /* 设置按钮样式 */ .button { position: relative; z-index: 999; /* 应该大于遮罩层的 z-index */ } ``` #### 添加 `catchtouchmove` 事件处理函数 为了避免遮罩层下方的内容接收到触摸或点击事件,可以在遮罩层上添加 `catchtouchmove="preventTouchMove"` 属性,并实现对应的 JavaScript 方法来拦截这些事件传播给下一层级的对象[^2]。 ```html <template> <!-- ... --> <view class="mask" @touchmove.stop.prevent="handlePrevent"></view> </template> <script> export default { methods: { handlePrevent() {} } }; </script> ``` 以上措施结合起来可以帮助开发者更好地管理 UI 元素之间的相互作用,从而避免不必要的干扰现象发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值