当前位置: 首页 > news >正文

商城网站静态模板下载安徽安庆天气预报15天

商城网站静态模板下载,安徽安庆天气预报15天,安卓app开发环境,wordpress 木马本文主要介绍一下React实现列表拖拽排序方法,具体样式如下图首先,简单展示一下组件的数据结构 const CodeSetting props > {const {$t, // 国际化翻译函数vm, // 视图模型数据vm: {CodeSet: { Enable [], …

本文主要介绍一下React实现列表拖拽排序方法,具体样式如下图
在这里插入图片描述

首先,简单展示一下组件的数据结构

const CodeSetting = props => {const {$t,                    // 国际化翻译函数vm,                    // 视图模型数据vm: {CodeSet: { Enable = [],    // 启用的编码列表Disable = []    // 停用的编码列表}},getConfig,             // 获取配置的函数save,                  // 保存配置的函数vmChange               // 更新视图模型的函数} = props;
};

完整的数据结构示例

const vm = {CodeSet: {Enable: [{ Compression: "H.264" },{ Compression: "H.265" },{ Compression: "MPEG-4" }],Disable: [{ Compression: "AVC" },{ Compression: "HEVC" }]}
};

主要用到的代码如下,简单看后我将介绍拖拽方法

{Enable.length ? (<Cardtitle={`${$t('com.EnableCode')} (${Enable.length})`}extra={<Buttonsize='small'className='clear-all-btn'type='link'onClick={clearAllEnabled}>{$t('com.ClearAll')}</Button>}>{Enable.map((item, index) => (<divkey={index}className='drag-item'draggableonDragStart={e => {handleDragStart(e, index);}}onDragEnd={handleDragEnd}onDragOver={handleDragOver}onDrop={e => handleDrop(e, index)}><div className='drag-handle'>⋮⋮</div><LabelText text={item.Compression} /><div className='delete-btn-container'><Iconcomponent={remove}onClick={() => codeSetChange('remove', index)}style={{fontSize: '20px'}}/></div></div>))}</Card>

首先用到的组件是Card组件,title是card标题,extra是card后缀

之后遍历Enable数组,将拿到的每一个值渲染到card中

这个组件实现了 HTML5 原生拖拽 API 来实现编码列表的拖拽排序功能。主要使用了以下拖拽事件:

onDragStart - 拖拽开始
onDragOver - 拖拽悬停
onDrop - 拖拽放置
onDragEnd - 拖拽结束

状态管理

const [draggedIndex, setDraggedIndex] = useState(null); // 记录当前拖拽项的索引

拖拽事件处理函数

1 拖拽开始 (handleDragStart)

const handleDragStart = (e, index) => {setDraggedIndex(index);                    // 记录拖拽项的索引e.dataTransfer.effectAllowed = 'move';    // 设置拖拽效果为移动e.currentTarget.classList.add('dragging'); // 添加拖拽样式
};

2 拖拽悬停 (handleDragOver)

const handleDragOver = e => {e.preventDefault();                         // 阻止默认行为e.dataTransfer.dropEffect = 'move';        // 设置放置效果为移动// 清除所有拖拽项的悬停样式const dragItems = document.querySelectorAll('.drag-item');dragItems.forEach(item => {item.classList.remove('drag-over');});// 为当前悬停元素添加悬停样式e.currentTarget.classList.add('drag-over');
};

3 拖拽放置 (handleDrop)

const handleDrop = (e, dropIndex) => {e.preventDefault();e.currentTarget.classList.remove('drag-over');if (draggedIndex === null || draggedIndex === dropIndex) {return;}// 重新排序 Enable 数组const enableList = [...Enable];const draggedItem = enableList[draggedIndex];// 移除拖拽项enableList.splice(draggedIndex, 1);// 在目标位置插入enableList.splice(dropIndex, 0, draggedItem);// 更新vm数据const newCodeSet = {...vm.CodeSet,Enable: enableList};vmChange({ CodeSet: newCodeSet });setDraggedIndex(null);
};

4 拖拽结束 (handleDragEnd)

const handleDragEnd = e => {setDraggedIndex(null);e.currentTarget.classList.remove('dragging');// 清除所有拖拽项的悬停样式const dragItems = document.querySelectorAll('.drag-item');dragItems.forEach(item => {item.classList.remove('drag-over');});
};

5.JSX 结构

<divkey={index}className='drag-item'draggable                                    // 设置为可拖拽onDragStart={e => handleDragStart(e, index)} // 拖拽开始onDragEnd={handleDragEnd}                    // 拖拽结束onDragOver={handleDragOver}                  // 拖拽悬停onDrop={e => handleDrop(e, index)}>          // 拖拽放置<div className='drag-handle'>⋮⋮</div>        // 拖拽手柄<LabelText text={item.Compression} /><div className='delete-btn-container'>{/* 删除按钮 */}</div>
</div>

6. 核心算法

  1. 拖拽排序的核心算法是数组重排序:
  2. 获取拖拽项:从原位置取出拖拽的元素
  3. 移除拖拽项:在原位置删除该元素
  4. 插入新位置:在目标位置插入该元素
  5. 更新状态:将新的数组顺序更新到组件状态

7. 样式处理
组件通过 CSS 类名来管理拖拽状态:
.dragging - 拖拽中的样式
.drag-over - 拖拽悬停的样式
.drag-item - 可拖拽项的基础样式

8.样式代码

    // 拖拽项容器.drag-item {display: flex;align-items: center;cursor: grab;&:hover {background-color: #f5f5f5;}// 拖拽中状态&.dragging {background-color: #e6f7ff;opacity: 0.5;transform: scale(0.95);}// 拖拽悬停状态&.drag-over {background-color: #e6f7ff;border: 1px solid #91d5ff;border-radius: 4px;}}// 拖拽手柄.drag-handle {margin-right: 8px;color: #2f2e2e;font-size: 12px;user-select: none;}
http://www.dtcms.com/a/504474.html

相关文章:

  • 网站任务界面wordpress实例网址
  • Python网络编程调用CnOCR文字识别教程
  • 常熟制作网站的地方广州网页制作
  • 青岛做网站价格关键词排名优化公司
  • 第十九周-训练embedding
  • 何为网站开发如何用cms做网站
  • 2022ICPC区域赛济南站
  • 英文网站建设一般多少钱婚纱摄影图片
  • 家具东莞网站建设技术支持wordpress开启多站点后台没显示
  • 大模型应用开发面经
  • python -day7
  • 解锁AI的“职业技能树“:Claude Skills深度技术解析——从原理到实战的完全指南
  • OpenAI:ChatGPT将开放「成人模式」
  • C程序的核心基石:深入理解与精通函数
  • 网站建设教程赚找湖南岚鸿认 可网站必备功能
  • 阿里巴巴外贸网站首页手机网站布局教程
  • CMOS图像传感器驱动程序原理
  • 移动电商网站设计wordpress 获取文章别名
  • 惠州建设集团网站淘宝上面建设网站安全么
  • 深圳市做网站建设中国响应式网站
  • 双Token机制
  • 网站后台管理模板免费下载WordPress导购模板
  • 简述对网站进行评析的几个方面.网站建设开发设计营销公司厦门
  • php5mysql网站开发实例精讲又拍云 cdn WordPress
  • 宜章泰鑫建设有限公司网站给村里做网站
  • 【学习系列】SAP RAP 10:行为定义-Determinations和Validations
  • 织梦可以做导航网站网络营销的推广方式
  • 建设网站方法wordpress文章显示时间
  • 公司微信网站建设方案模板下载黑白色调网站
  • 中企视窗做网站怎么样今天哈尔滨最新通知