uniapp结合movable-area与movable-view实现拖拽功能2

前言

上篇我们写了,固定高度的拖拽,这篇我们将进行不固定高度的拖拽模块编写完成。

开始

一、初始化

我们在list数组里面增加一个data的动态数组,这样可以动态改变元素的高度。

当前元素y = 上一个元素的高度

<template>
  <view style="height: 100%;">
    <movable-area :style="{'width': '100%', 'height': allHeight + 'px'}">
      <movable-view
        v-for="(item, index) in list"
        :key="item.id"
        :x="0"
        :y="item.y"
		:style="{'height': item.itemHeight + 'px', 'width': '100%',}"
        direction="all"
        @touchstart="handleDragStart(index)"
	   @change="handleMoving(index, $event)"
	   @touchend="handleDragEnd"
        class="movable-view"
      >
	  
        <!-- 这里可以放置步骤的详细内容 -->
        <view style="background-color: aqua; padding: 20rpx 0; margin: 10rpx 0;">
			<view v-for="(d_item, d_key) in item['data']" :key="d_key">{{ d_item.name }}</view>
		</view>
		
      </movable-view>
    </movable-area>
  </view>
</template>
 
<script>
export default {
  data() {
    return {
		list: [],
		allHeight: 0,
    };
  },
  
  created() {
	  // 初始化 === 当前y=上一个元素高度(索引为0的y=0)
	  this.list = [
		  {
			  id: 0,
			  itemHeight: 100,
			  y: 0,
			  key: Math.random() + 0,
			  data: [
				  {
					name: '测试0-1'
				  },
				  {
					name: '测试0-2'
				  }
			  ]
		  },
		  {
			  id: 1,
			  itemHeight: 50,
			  y: 100,
			  key: Math.random() + 1,
			  data: [
				  {
					name: '测试1-1'
				  }
			  ]
		  },
		  {
			  id: 2,
			  itemHeight: 50,
			  y: 150,
			  key: Math.random() + 2,
			  data: [
				  {
					name: '测试2-1'
				  }
			  ]
		  },
		  {
			  id: 3,
			  itemHeight: 200,
			  y: 200,
			  key: Math.random() + 3,
			  data: [
				  {
					name: '测试3-1'
				  },
				  {
					name: '测试3-2'
				  },
				  {
					name: '测试3-3'
				  },
				  {
					name: '测试3-4'
				  }
			  ]
		  },
	  ]
	  
  },
  
  methods: {
  },
};
</script>
 
<style>
.movable-area {
 
}
 
.movable-view {
 
}
</style>

二、拖拽实现

y是高度累加,通过ref获取元素高度

<template>
	<view style="height: 100%;">
		<movable-area :style="{'width': '100%', 'height': allHeight + 'px'}">
			<movable-view v-for="(item, index) in list" :key="item.id" :x="0" :y="item.y"
				:style="{'height': item.itemHeight + 'px', 'width': '100%', 'background-color': '#fff'}" direction="all"
				@touchstart="handleDragStart(index)" @change="handleMoving(index, $event)" @touchend="handleDragEnd"
				class="movable-view">

				<!-- 这里可以放置步骤的详细内容 -->
				<view ref="itemRef" style="background-color: aqua; height: 100%; margin: 10rpx 0;">
					<view v-for="(d_item, d_key) in item['data']" :key="d_key">{{ d_item.name }}</view>
				</view>

			</movable-view>
		</movable-area>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				list: [],
				cloneList: [],

				activeIndex: -1, // 选中
				oldIndex: -1,

				moveToIndex: -1, // 移动

				allHeight: 1200,
			};
		},
		mounted() {
			// console.log("===itemRef===", this.$refs.itemRef);
			// if (this.$refs.itemRef) {
			// 	this.$refs.itemRef.forEach((item) => {
			// 		console.log(item.$el.clientHeight)
			// 	});
			// }
		},
		created() {
			// 1.通过ref获取元素高度,并进行计算y轴
			// 2.拖拽时,更换位置(重新计算-高度累积计算)

			// 注意点(总高度不够时,会乱排序)

			// 初始化
			this.list = [{
					id: 0,
					y: 0,
					itemHeight: 100,
					data: [{
							name: '测试0-1'
						},
						{
							name: '测试0-2'
						}
					]
				},
				{
					id: 1,
					y: 100,
					itemHeight: 50,
					data: [{
						name: '测试1-1'
					}]
				},
				{
					id: 2,
					y: 150,
					itemHeight: 50,
					data: [{
						name: '测试2-1'
					}]
				},
				{
					id: 3,
					y: 200,
					itemHeight: 200,
					data: [{
							name: '测试3-1'
						},
						{
							name: '测试3-2'
						},
						{
							name: '测试3-3'
						},
						{
							name: '测试3-4'
						}
					]
				},
			];

			this.cloneList = this.deepCopy(this.list);
		},

		methods: {
			deepCopy(source) {
				return JSON.parse(JSON.stringify(source));
			},

			// 拖拽开始
			handleDragStart(index) {
				this.activeIndex = index;
				this.oldIndex = index;
			},
			handleMoving(index, e) {
				if (e.detail.source !== 'touch') return;
				const {x, y} = e.detail;
				
				let itemHeight = this.list[index]['itemHeight'];
				const currentY = Math.floor((y + itemHeight / 2) / itemHeight);
	
				this.moveToIndex = Math.min(currentY, this.list.length - 1);
				// console.log("===this.moveToIndex===", this.moveToIndex);
			},
			handleDragEnd(e) {
				console.log("=====拖拽结束============");
				if (this.moveToIndex !== -1 && this.activeIndex !== -1 && this.moveToIndex !== this.activeIndex) {
					
					// console.log("===选中目标activeIndex===", this.list[this.activeIndex]);
					// console.log("===移动目标moveToIndex===", this.list[this.moveToIndex]);
					
					// 交互位置
					this.cloneList.splice(this.moveToIndex, 0, ...this.cloneList.splice(this.activeIndex, 1));
					// 计算y轴
					this.cloneList.forEach((item) => {
						item.y = currentY;
      					currentY += item.itemHeight;
					});
					this.list = this.cloneList
				}
				this.activeIndex = -1;
				this.oldIndex = -1;
				this.moveToIndex = -1;
			},
		},
	};
</script>

<style>
	.movable-area {}

	.movable-view {}
</style>

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

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

相关文章

ubuntu为Docker配置代理

终端代理 我们平常在ubuntu终端中使用curl或git命令时&#xff0c;往往会很慢。 所以&#xff0c;首先需要给ubuntu终端环境添加代理。 查看自身那个软件的端口号&#xff0c;我这里是7890。 sudo gedit ~/.bashrcexport http_proxyhttp://localhost:7890 export https_pr…

【Uniapp-Vue3】v-if条件渲染及v-show的选择对比

如果我们想让元素根据响应式变量的值进行显示或隐藏可以使用v-if或v-show 一、v-show 另一种控制显示的方法就是使用v-show&#xff0c;使用方法和v-if一样&#xff0c;为true显示&#xff0c;为false则不显示。 二、v-if v-if除了可以像v-show一样单独使用外&#xff0c;还…

wujie无界微前端框架初使用

先说一下项目需求&#xff1a;将单独的四套系统的登录操作统一放在一个入口页面进行登录&#xff0c;所有系统都使用的是vue3&#xff0c;&#xff08;不要问我为啥会这样设计&#xff0c;产品说的客户要求&#xff09; 1.主系统下载wujie 我全套都是vue3&#xff0c;所以直接…

C语言 数组编程练习

1.将数组A的内容和数组B中的内容进行交换。&#xff08;数组一样大&#xff09; 2.创建一个整形数组&#xff0c;完成对数组的操作 实现函数Init()初始化数组全为0 实现print()打印数组的每个元素 实现reverse()函数完成数组元素的逆置 //2.创建一个整形数组&#xff0c;完…

【three.js】模型-几何体Geometry,材质Material

模型 在现实开发中&#xff0c;有时除了需要用代码创建模型之外&#xff0c;多数场景需要加载设计师提供的使用设计软件导出的模型。此时就需要使用模型加载器去加载模型&#xff0c;不同格式的模型需要引入对应的模型加载器&#xff0c;虽然加载器不同&#xff0c;但是使用方式…

MySQL和Hive中的行转列、列转行

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 MySQL1.行转列2.列转行 Hive1.行转列2.列转行(1)侧窗(2)union MySQL 1.行转列 把多行转成列。直接group&#xff0c;sum(if()) 2.列转行 Hive 1.行转列 select name,sum(if(kmshuxu…

unity学习8:unity的基础操作 和对应shortcut

目录 1 unity的基础操作的工具&#xff0c;就在scene边上 1.1 对应shortcut快捷键 2 物体的重置/ 坐标归到0附近 3 F&#xff1a;快速找到当前gameobject 4 Q&#xff1a;小手和眼睛&#xff0c;在场景中移动 5 W&#xff1a;十字箭头&#xff0c;移动gameobject 6 …

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”

2024年&#xff0c;在高阶智驾进入快速上车的同时&#xff0c;座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示&#xff0c;2024年1-10月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用…

Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本

目录 ledeWRT介绍固件编译下载代码修改feed源更新并安装编译第三方软件包制作用于eMMC烧写的rootfs基于lede发行版验证烧写rk3568.img, LEDE wrt启动成功refhttps://blog.csdn.net/zc21463071/article/details/106751361介绍rk3568平台下, lede 大神版 openwrt固件的下载、编译…

【Unity3D】Text文本文字掉落效果

相关技术&#xff1a;Text、TextMesh、Rigidbody&#xff08;刚体&#xff09;、BoxCollider&#xff08;碰撞体&#xff09;、TextGenerator、文本网格、文字网格 原理&#xff1a;使用UGUI Text获取其文字的每个字符网格坐标&#xff0c;转世界坐标生成对应的3D文本(TextMesh…

Spring Boot教程之四十九:Spring Boot – MongoRepository 示例

Spring Boot – MongoRepository 示例 Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…

el-table-fixed滚动条被遮挡导致滚动条无法拖动

/* 设置默认高度-滚动条高度 */ .el-table__fixed { height: calc(100% - 16px) !important; } .el-table__fixed {height: calc(100% - 16px) !important; } .el-table__fixed:before {height: 0px; }

探索大型语言模型新架构:从 MoE 到 MoA

探索大型语言模型新架构&#xff1a;从 MoE 到 MoA 当前&#xff0c;商业科技公司纷纷投身于一场激烈的竞赛&#xff0c;不断扩大语言模型的规模&#xff0c;并为其注入海量的高质量数据&#xff0c;试图逐步提升模型的准确性。然而&#xff0c;这种看似顺理成章的发展路径逐渐…

【通识安全】煤气中毒急救的处置

1.煤气中毒的主要症状与体征一氧化碳中毒&#xff0c;其中毒症状一般分为轻、中、重三种。 (1)轻度&#xff1a;仅有头晕、头痛、眼花、心慌、胸闷、恶心等症状。如迅速打开门窗&#xff0c;或将病人移出中毒环境&#xff0c;使之吸入新鲜空气和休息&#xff0c;给些热饮料&am…

分享:osgb倾斜数据转cesium-3dtiles 小工具.

背景: 很多知识殊途同归,在三维软件这块,少不了要和各种各样的数据格式打交道.osgb,stl,obj,3dtiles,3ds等等..虽然里面本质核心基本都是几何数据拓扑数据材质纹理数据等等,但是由于其组织方式不同和特殊的应用场景,导致很多模型需要转来转去...相信很多人在这方面都或多或少吃…

Node.js——fs(文件系统)模块

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Mac M2基于MySQL 8.4.3搭建(伪)主从集群

前置准备工作 安装MySQL 8.4.3 参考博主之前的文档&#xff0c;在本地Mac安装好MySQL&#xff1a;Mac M2 Pro安装MySQL 8.4.3安装目录&#xff1a;/usr/local/mysql&#xff0c;安装好的MySQL都处于运行状态&#xff0c;需要先停止MySQL服务最快的方式&#xff1a;系统设置 …

第5章——与HTTP协作的Web服务器

第5章——与HTTP协作的Web服务器 用单台虚拟主机实现多个域名 ​ 一台服务器可以使用虚拟主机功能拥有多个域名。 ​ 域名通过DNS服务映射到IP地址&#xff08;域名解析&#xff09;之后访问目标网站。当请求发送到服务器时&#xff0c;已经是以IP地址形式访问了。 ​ 相同的…

基于Python的投资组合收益率与波动率的数据分析

基于Python的投资组合收益率与波动率的数据分析 摘要&#xff1a;該文通过研究马科维茨的投资组合模型&#xff0c;并将投资组合模型应用到包含6只金融股票的金融行业基金中。首先通过开源的财经接口Tushare获取股票原始数据&#xff0c;接着利用数据分析的黄金组合库&#xf…

AWS re:Invent 2024 现场实录 - It‘s all about Scale

时隔五年&#xff0c;再度造访美国&#xff0c;也是同样的主题&#xff0c;参加在拉斯维加斯举行的 AWS re:Invent 大会。 会场 从 2012 起第一届开始&#xff0c;每年的 re:Invent 大会都放在拉斯维加斯&#xff0c;主会场也都放在威尼斯人酒店 (Venetian)。有小伙伴好奇这背…