草庐IT

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

燊燊向上 2023-09-10 原文

在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的地方也加上监听

<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图表在弹出框后被移走

有关uniapp开发小程序中因uchart的canvas层级过高遮盖uni-datetime-picker组件的解决办法的更多相关文章

  1. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  2. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  3. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - 如何更快地解决 project euler #21? - 2

    原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,

  6. ruby - 为什么这些方法没有解决? - 2

    这个问题在这里已经有了答案:WhydoRubysettersneed"self."qualificationwithintheclass?(3个答案)关闭29天前。给定这段代码:classSomethingattr_accessor:my_variabledefinitialize@my_variable=0enddeffoomy_variable=my_variable+3endends=Something.news.foo我收到这个错误:test.rb:9:in`foo':undefinedmethod`+'fornil:NilClass(NoMethodError)fromtes

  7. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  8. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  9. 【RuntimeError: CUDA error: device-side assert triggered】问题与解决 - 2

    RuntimeError:CUDAerror:device-sideasserttriggered问题描述解决思路发现问题:总结问题描述当我在调试模型的时候,出现了如下的问题/opt/conda/conda-bld/pytorch_1656352465323/work/aten/src/ATen/native/cuda/IndexKernel.cu:91:operator():block:[5,0,0],thread:[63,0,0]Assertion`index>=-sizes[i]&&index通过提示信息可以知道是个数组越界的问题。但是如图一中第二行话所说这个问题可能并不出在提示的代码段

  10. ruby-on-rails - 如何解决#<Book::ActiveRecord_Relation:0x007fb709a6a8c0> 的未定义方法 `to_key'? - 2

    我遇到了未定义方法`to_key'的问题这是我的books_controller.rbclassBooksController和我的索引页如下。index.html.erb......现在当我要访问索引页面时出现如下错误。undefinedmethod`to_key'for# 最佳答案 index通常返回一个集合。事实上,您的Controller符合要求。但是,您的View试图为其定义一个表单。正如您所发现的,这不会成功。表单适用于实体,而不适用于集合。该错误在您看来以及您希望如何处理index。

随机推荐