uniapp开发小程序中因uchart的canvas层级过高遮盖uni-datetime-picker组件的解决办法

bug描述

页面需要展示一个环形图,可以按时间段筛选数据,所以我用了uchartuni-datetime-picker组件。
请添加图片描述

但uchart用到了canvas,其层级过高,当实机运行小程序时会遮盖弹出的uni-datetime-picker组件
请添加图片描述

解决办法

当uni-datetime-picker组件弹出遮罩时,把canvas移到用户视野之外。

uni-datetime-picker组件本质就是普通的vue组件,进入uni-modules寻找uni-datetime-picker组件的代码,通过监听控制uni-datetime-picker组件弹出收回的属性控制canvas是否移出用户视野之外。
几经查找,选择监控uni-datetime-picker组件下的calendar组件的show属性,因为实验监控uni-datetime-picker的popup属性无法实现效果,所以找更靠谱的孙组件calendar,又因为我的uni-app版本不支持 $listen,所以被迫让中间的uni-datetime-picker中转 $emit,最终最上层自己写的组件就可以监听uni-datetime-picker的显示隐藏了。

在calendar组件里找到的控制台历显示的show属性
watch: {
			// 自己添加的控制爷组件canvas显隐的监视方法,以解决canvas层级过高问题
			show: {
				handler(newVal, oldVal) {
					if (this.show) {
						this.$emit('closeCanvas');
					}else {
						this.$emit('showCanvas');
					}
				}
			},
		}
在uni-datetime-picker组件里找到每一个用到calendar组件的地方加上自定义事件(closeCanvas,showCanvas)监听
<calendar ref="pcSingle" :showMonth="false"
	:start-date="caleRange.startDate" :end-date="caleRange.endDate" :date="defSingleDate"
	@change="singleChange" style="padding: 0 8px;" @closeCanvas="closeCanvas" @showCanvas="showCanvas"/>
<view class="popup-x-body">
	<calendar ref="left" :showMonth="false"
		:start-date="caleRange.startDate" :end-date="caleRange.endDate" :range="true"
		@change="leftChange" :pleStatus="endMultipleStatus" @firstEnterCale="updateRightCale"
		@monthSwitch="leftMonthSwitch" style="padding: 0 8px;" @closeCanvas="closeCanvas" @showCanvas="showCanvas"/>
	<calendar ref="right" :showMonth="false"
		:start-date="caleRange.startDate" :end-date="caleRange.endDate" :range="true"
		@change="rightChange" :pleStatus="startMultipleStatus" @firstEnterCale="updateLeftCale"
		@monthSwitch="rightMonthSwitch" style="padding: 0 8px;border-left: 1px solid #F1F1F1;" @closeCanvas="closeCanvas" @showCanvas="showCanvas"/>
</view>
<calendar v-show="isPhone" ref="mobile" :clearDate="false" :date="defSingleDate" :defTime="reactMobDefTime"
	:start-date="caleRange.startDate" :end-date="caleRange.endDate" :selectableTimes="mobSelectableTime"
	:pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :typeHasTime="hasTime" :insert="false"
	:hideSecond="hideSecond" @confirm="mobileChange" @closeCanvas="closeCanvas" @showCanvas="showCanvas"/>
uni-datetime-picker方法写上中转监听方法
// 监听calendar的触发,然后再向上传递
methods: {
	closeCanvas() {
		this.$emit('closeCanvas');
	},
	showCanvas() {
		this.$emit('showCanvas');
	}
}
在自己的组件用到uni-datetime-picker的地方也加上监听
<view class="datetime-picker-wrap">
	<uni-datetime-picker v-model="dateRange" type="daterange" rangeSeparator=""
		@change="dateRangeChange" @closeCanvas="closeCanvas" @showCanvas="showCanvas"/>
</view>

监听到组件的显示隐藏就好办了,写一个让canvas水平移出外面的样式,uni-datetime-picker组件弹出就加上样式,收回就去掉样式即可。

动态加上移出视野的样式代码
<view class="card-box">
	<view class="card-title-box remove-border">
		<view class="card-title title-text">食品安全检测数据统计</view>
	</view>
	<view class="card-content-box">
		<checkRingChart v-if="!isEmpty" class="check-ring-box" :class="hiddenCanvas ? 'hidden-canvas' : ''" :chartData="chartData" :title="title"
			:subtitle="subtitle" :color="color"></checkRingChart>
		<view v-if="isEmpty" class="empty-box-wrap">
			<view class="empty-box">
				<view class="empty-img"></view>
				<view class="empty-title">暂无数据</view>
			</view>
		</view>
	</view>
</view>
data() {
	return {
		hiddenCanvas: false
	};
},
methods: {
	closeCanvas() {
		this.hiddenCanvas = true;
	},
	showCanvas() {
		this.hiddenCanvas = false;
	}
}
.hidden-canvas {
	transform: translateX(200%);
}
大功告成

请添加图片描述
可以看到canvas图表在弹出框后被移走

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
uni-data-picker是一个选择类的datacom组件,适用于uni-app使用uni-data-picker实现省市区选择器的json数据。它支持多列级联选择,没有列数限制,如果屏幕显示不全,顶部tab区域会左右滚动。 在使用uni-data-picker进行筛选时,可以通过设置showSearch属性来决定是否显示搜索框和多选操作。当showSearch为true时,会显示搜索框和多选操作。 uni-data-picker可以与其他组件结合使用,比如uchart和uni-datetime-picker组件。如果你的页面需要展示一个环形图,并且可以按时间段筛选数据,你可以使用uchart和uni-datetime-picker组件来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [uni-app uni-data-picker 省市区数据表](https://download.csdn.net/download/qq_34707272/85657925)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [uniapp 改写uni-data-picker级联选择器(带搜索和多选)新增列出选择和删除功能](https://blog.csdn.net/qq_36958916/article/details/125691460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [uniapp开发小程序中因uchart的canvas层级过高遮盖uni-datetime-picker组件解决办法](https://blog.csdn.net/weixin_48009166/article/details/127904109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值