滑动验证组件---设置movable-view组件的x属性在微信小程序端失效的问题

场景

采用uniapp的movable-view组件实现滑动验证组件。

  • 流程
    • 滑块未滑到最右端时,回弹到原点
    • 滑块滑到最右端时,则显示滑动结束,不可再滑动

问题

频繁设置uniapp的movable-view组件的x属性,在H5端正常,但在微信小程序端则失效。

index.vue

<template>
	<view style="height: 100vh;width: 800rpx;display: flex;justify-content: center;align-items: center;">
		<wo-slider>
		</wo-slider>
	</view>
</template>

<script>
	import woSlider from './woSlider.vue'
	export default {
		components: {
			woSlider
		},
	}
</script>

<style>
</style>

woSlider.vue

<template>
	<view>
		<movable-area id="skidway" class="skidway">右滑全开
			<movable-view :damping="100" @touchend="onEnd" id="slider" :x="x" class='slider' direction="horizontal" @change="onChange" :disabled="isFinished">
				<view style="border-radius: 50%;height: 100%; width: 100%;overflow: auto;">
					<view v-if="isFinished" style="height: 100%">
						<view style="background: #1BA035; height: 100%; display: flex;justify-content: center;align-items: center;">
							<view class='movable-icon' style="background-image: url(/static/select-bold.svg)"></view>
						</view>
					</view>
					<view v-else style="height: 100%">
						<view style="background: #E5673B;height: 100%; display: flex;justify-content: center;align-items: center;">
							<view class='movable-icon' style="background-image: url(/static/arrow-right-bold.svg)"></view>
						</view>
					</view>
				</view>
			</movable-view>
		</movable-area>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				x: 0,
				oldX: 0,
				skidwayWidth: 0,  // 滑道长度
				sliderWidth: 0,  // 滑块长度
				isFinished: false,
				moveWidth: 0
			}
		},
		mounted() {
			const elemt = uni.createSelectorQuery().in(this)
			elemt.select('#skidway').boundingClientRect((data) => {
				this.skidwayWidth = data.width;  // 获取滑道长度
			}).exec()
			elemt.select('#slider').boundingClientRect((data) => {
				this.sliderWidth = data.width;  // 获取滑块长度
			}).exec()
		},
		methods: {
			onChange: function(e) {
				this.x = e.detail.x
				if(Math.round(this.x) >= Math.round(this.skidwayWidth - this.sliderWidth)) {
					this.isFinished = true  // 滑到最右端则完成
				}
			},
			onEnd: function(e) {
				if(Math.round(this.x) < Math.round(this.skidwayWidth - this.sliderWidth)) {
					setTimeout(()=>{
						this.x = 0  // 触摸松开的时候,未滑到最右端时则回到原位
					}, 100)
				}
			}
		}
	}
</script>

<style>
	.skidway{
		background-color: aliceblue;
	  width:200px;
	  height: 80rpx;
	  border-radius: 60rpx;
	  display:flex;
	  justify-content:center;
	  align-items:center;
		position: relative;
	}
	.slider{
	  width: 80rpx;
	  height: 80rpx;
	}
	.movable-icon{
	  width: 30rpx;
	  height: 30rpx;
	  background-size: 100% 100%;
	}
	.end-status {
		border-radius: 60rpx 0rpx 0rpx 60rpx;
		background-color: red;
		height: 100%;
		overflow: auto;
		position: absolute;
		left: 0;
		top: 0;
		display: flex;
		justify-content: center;
		align-items: center;
		color: #fff;
	}
</style>

  • H5端
    请添加图片描述
  • 微信小程序端
    请添加图片描述

原因

官方给出的解释:

由于app和小程序的架构是逻辑层与视图层分离,使用js监听拖动时会引发逻辑层和视图层的频繁通讯,影响性能。为了方便高性能的实现拖动,平台特封装了movable-area组件。

意思大概就是: 对频繁变化的组件属性值做了一些优化,将"多次变化"合为"少次变化"来执行。

官方给出的解决方案:
在这里插入图片描述
在这里插入图片描述
官方推荐第一种方法去解决这个问题,所以我们就来试试第一种。
第一种方法的思路就是:先用一个变量记录频繁变化的属性值,在最后的结束动作再用这个记录值来修改组件的属性值。

结果:成功解决在小程序端失效的问题

<template>
	<view>
		<movable-area id="skidway" class="skidway">右滑全开
			<movable-view :damping="100" @touchend="onEnd" id="slider" :x="x" class='slider' direction="horizontal" @change="onChange" :disabled="isFinished">
				<view style="border-radius: 50%;height: 100%; width: 100%;overflow: auto;">
					<view v-if="isFinished" style="height: 100%">
						<view style="background: #1BA035; height: 100%; display: flex;justify-content: center;align-items: center;">
							<view class='movable-icon' style="background-image: url(/static/select-bold.svg)"></view>
						</view>
					</view>
					<view v-else style="height: 100%">
						<view style="background: #E5673B;height: 100%; display: flex;justify-content: center;align-items: center;">
							<view class='movable-icon' style="background-image: url(/static/arrow-right-bold.svg)"></view>
						</view>
					</view>
				</view>
			</movable-view>
		</movable-area>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				x: 0,
				oldX: 0,
				skidwayWidth: 0,  // 滑道长度
				sliderWidth: 0,  // 滑块长度
				isFinished: false,
				moveWidth: 0
			}
		},
		mounted() {
			const elemt = uni.createSelectorQuery().in(this)
			elemt.select('#skidway').boundingClientRect((data) => {
				this.skidwayWidth = data.width;  // 获取滑道长度
			}).exec()
			elemt.select('#slider').boundingClientRect((data) => {
				this.sliderWidth = data.width;  // 获取滑块长度
			}).exec()
		},
		methods: {
			onChange: function(e) {
				this.oldX = e.detail.x  // 记录变化值
				if(Math.round(this.oldX) >= Math.round(this.skidwayWidth - this.sliderWidth)) {
					this.isFinished = true  // 滑到最右端则完成
				}
			},
			onEnd: function(e) {
				this.x = this.oldX  // 触摸松开,设置movable-view的x属性为记录的变化值
				if(Math.round(this.oldX) < Math.round(this.skidwayWidth - this.sliderWidth)) {
					setTimeout(()=>{  // 触摸松开的时候,未滑到最右端时则回到原位
						this.x = 0
						this.oldX = 0
					}, 100)
				}
			}
		}
	}
</script>

<style>
	.skidway{
		background-color: aliceblue;
	  width:200px;
	  height: 80rpx;
	  border-radius: 60rpx;
	  display:flex;
	  justify-content:center;
	  align-items:center;
		position: relative;
	}
	.slider{
	  width: 80rpx;
	  height: 80rpx;
	}
	.movable-icon{
	  width: 30rpx;
	  height: 30rpx;
	  background-size: 100% 100%;
	}
	.end-status {
		border-radius: 60rpx 0rpx 0rpx 60rpx;
		background-color: red;
		height: 100%;
		overflow: auto;
		position: absolute;
		left: 0;
		top: 0;
		display: flex;
		justify-content: center;
		align-items: center;
		color: #fff;
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89071.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux —— 进程间通信(System V)

目录 一&#xff0c;共享内存 申请共享内存 shmget 控制共享内存 shmctl 关联共享内存 shmat / 去联共享内存 shmdt 二&#xff0c;消息队列 创建或打开消息队列 msgget 发送消息 msgsnd / 接收消息 msgrcv 控制消息 msgctl 三&#xff0c;信号量 创建或打开信号量 s…

【esp32】GPIO引脚功能使用集合

本文主要介绍 esp32 这块芯片的GPIO 口功能使用以及软硬件设计注意事项 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页…

Mac操作系统Safari 17全新升级:秋季推出全部特性

苹果的内置浏览器可能是Mac上最常用的应用程序&#xff08;是的&#xff0c;甚至比Finder、超级Mac Geeks还要多&#xff09;。因此&#xff0c;苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中&#xff0c;Safari可以帮助你提高工作效…

【HCIP】15.MPLS基础

多协议标签交换 MPLS位于TCP/IP协议栈中的数据链路层和网络层之间&#xff0c;可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部实现数据快速转发。 术语 MPLS域&#xff08;MPLS Domain&#xff09;&#xff1a;一系列…

C语言学习笔记(完整版)

文章目录 算法算法的基本概念算法的特征算法的优劣 描述算法三种基本结构流程图N-S流程图伪代码 常量和变量了解数据类型常量整形常量实型常量字符型常量转义字符符号常量 变量整形变量实型变量字符型变量 表达式与运算符赋值运算符和赋值表达式变量赋初值强制类型转换 算术运算…

行式存储与列式存储

1.概述 数据处理大致可分为两大类&#xff0c;联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用&#xff0c;用来执行一些基本的、日常的事务处理&#xff0c;比如数据库记录的增、删…

LAMP配置与应用

web资源类型&#xff1a; 静态资源&#xff1a;原始形式与响应内容一致&#xff0c;在客户端浏览器执行 动态资源&#xff1a;原始形式通常为程序文件&#xff0c;需要在服务器端执行之后&#xff0c;将执行结果返回给客户端 LAMP架构组成&#xff1a; L&#xff1a;linux …

翻倍以链表形式表示的数字

题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 有点相似于&#xff1a;链表相加II&#xff0c;这道题我们仍然有进位&#xff0c;但不同的是&#xff0c;链表相加我们选择了开辟新节点&#xff0c;这道题我们选择反转两次链表&#xff0c;开始一次&#xff0c;结束一次…

测试工具coverage的高阶使用

在文章Python之单元测试使用的一点心得中&#xff0c;笔者介绍了自己在使用Python测试工具coverge的一点心得&#xff0c;包括&#xff1a; 使用coverage模块计算代码测试覆盖率使用coverage api计算代码测试覆盖率coverage配置文件的使用coverage badge的生成 本文在此基础上…

CrystalNet .Net VCL for Delphi Crack

CrystalNet .Net VCL for Delphi Crack VCL或更为人所知的可视化组件库是基于一个面向对象的框架&#xff0c;什么是用户对开发人员和事件的Microsoft Windows应用程序的接口。可视化组件库是用对象Pascal编写的。它主要是为使用Borland而开发的&#xff0c;它具有与Delphi以及…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的&#xff1a; 左右两侧都留了大块空白&#xff0c;很难看 解决方案 点击横坐标&#xff0c;双击&#xff0c;然后按下图顺序点击 效果

自动设置服务器全教程

亲爱的爬虫探险家&#xff01;在网络爬虫的世界里&#xff0c;自动设置代理服务器是一个非常有用的技巧。今天&#xff0c;作为一家代理服务器供应商&#xff0c;我将为你呈上一份轻松实用的教程&#xff0c;帮助你轻松搞定爬虫自动设置代理服务器。 一、为什么需要自动设置代…

SMC状态机 讲解2 从模型到SMC

SMC状态机 讲解2 从模型到SMC 1、实例化有限状态机&#xff08;FSM)2、简单转换 Simple Transition3、外部环回转换 External Loopback Transition4、内部环回转换 Internal Loopback Transition5、转换动作6、转换Guard7、转换参数8、Entry 和 Exit动作9、Push 转换10、Pop转换…

chatGPT界面

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…

jenkins Linux如何修改jenkins 默认的工作空间workspace

由于jenkins默认存放数据的目录是/var/lib/jenkins&#xff0c;一般这个var目录的磁盘空间很小的&#xff0c;就几十G,所以需要修改jenkins的默认工作空间workspace 看到最后 环境 jenkins使用yum安装的 centos 7 正题 1 查看jenkins安装路径 [rootlocalhost jenkins_old_d…

Git 安装、配置并把项目托管到码云 Gitee

错误聚集篇&#xff1a; 由于我 git 碰见大量错误&#xff0c;所以集合了一下&#xff1a; git 把项目托管到 码云出现的错误集合_打不着的大喇叭的博客-CSDN博客https://blog.csdn.net/weixin_49931650/article/details/132460492 1、安装 git 1.1 安装步骤 1.1.1 下载对应…

网络渗透day2-Windows服务器服务管理相关

1.在Windows Server中&#xff0c;用于监视网络连接和流量的工具是&#xff1f; A.Event Viewer B.Performance Monitor C.Task Scheduler D.Resource Monitor 正确答案&#xff1a;D 你的答案&#xff1a;B 解析&#xff1a; 答案解析&#xff1a;Resource Monitor用于监…

2分钟搭建自己的GPT网站

如果觉得官方免费的gpt&#xff08;3.5&#xff09;体验比较差&#xff0c;总是断开&#xff0c;或者不会fanqiang&#xff0c;那你可以自己搭建一个。但前提是你得有gpt apikey。年初注册的还有18美金的额度&#xff0c;4.1号后注册的就没有额度了。不过也可以自己充值。 有了…

数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成

数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成 目录 数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成&#xff1b; 2.马尔科夫链蒙特卡洛方…