4.2 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			4.2 KiB
		
	
	
	
	
	
	
	
表格拖拽多选功能
功能概述
表格组件现在支持拖拽多选功能,用户可以通过鼠标拖拽来快速选择多行数据,提升批量操作的效率。
功能特性
✅ 已实现的功能
- 
基础拖拽选择
- 在表格行上拖拽可以选择多行
 - 实时显示选择框和选中状态
 - 拖拽结束后更新选中状态
 
 - 
智能交互
- 避免在复选框和操作按钮区域启动拖拽
 - 设置最小拖拽距离阈值,避免意外触发
 - 拖拽过程中禁用文本选择
 
 - 
键盘修饰键支持
- Ctrl/Cmd + 拖拽:追加选择模式(切换选中状态)
 - Shift + 点击复选框:范围选择模式
 - Ctrl/Cmd + A:全选
 - Escape:取消拖拽或清空选择
 
 - 
虚拟滚动兼容
- 正确处理虚拟滚动的坐标转换
 - 考虑滚动位置的行索引计算
 
 - 
视觉反馈
- 拖拽选择框的实时显示
 - 选中行的高亮效果
 - 拖拽过程中的样式变化
 - 用户操作提示
 
 
使用方法
基本配置
import { Table } from './base/table/Table';
import { RowSelection } from './base/table/types';
const rowSelection: RowSelection<Mark> = {
  type: 'checkbox',
  selectedRowKeys,
  onChange: (selectedRowKeys, selectedRows) => {
    // 处理选择变化
    setSelectedRowKeys(selectedRowKeys);
  },
  dragSelection: {
    enabled: true, // 启用拖拽多选
    multi: true,   // 支持多选
    onDragStart: (startRowIndex) => {
      console.log('开始拖拽选择');
    },
    onDragEnd: (selectedRows) => {
      console.log('拖拽选择结束');
    },
  },
};
<Table
  data={data}
  columns={columns}
  rowSelection={rowSelection}
  // ... 其他属性
/>
配置选项
DragSelectionConfig
interface DragSelectionConfig {
  enabled?: boolean; // 是否启用拖拽选择,默认为 true
  multi?: boolean; // 是否支持多选,默认为 true
  onDragStart?: (startRowIndex: number) => void; // 拖拽开始回调
  onDragEnd?: (selectedRows: Mark[]) => void; // 拖拽结束回调
}
用户操作指南
- 
基础拖拽选择
- 在表格行(非复选框/操作按钮区域)按下鼠标左键
 - 拖拽至目标行
 - 释放鼠标完成选择
 
 - 
追加选择
- 按住 
Ctrl(Windows/Linux)或Cmd(Mac)键 - 进行拖拽选择
 - 已选中的行会切换状态(选中变未选中,未选中变选中)
 
 - 按住 
 - 
范围选择
- 先点击一个复选框选中一行
 - 按住 
Shift键 - 点击另一个复选框
 - 两行之间的所有行都会被选中
 
 - 
键盘快捷键
Ctrl/Cmd + A:全选所有行Escape:取消当前拖拽操作或清空所有选择
 
技术实现
核心组件
- 
状态管理
DragSelectionState:管理拖拽状态- 鼠标位置跟踪
 - 选择范围计算
 
 - 
事件处理
handleMouseDown:开始拖拽检测handleMouseMove:拖拽过程处理handleMouseUp:完成选择操作
 - 
坐标转换
- 虚拟滚动坐标映射
 - 行索引计算
 - 碰撞检测算法
 
 
样式类名
.row-selected:选中行样式.row-drag-selected:拖拽选中行样式.drag-selection-box:拖拽选择框样式.drag-hint:操作提示样式
性能优化
- 
事件防抖
- 设置拖拽距离阈值
 - 避免频繁状态更新
 
 - 
虚拟滚动适配
- 只处理可视区域内的行
 - 优化大数据量场景
 
 - 
内存管理
- 及时清理事件监听器
 - 合理的状态重置
 
 
兼容性
- ✅ 支持现有的复选框选择
 - ✅ 兼容虚拟滚动
 - ✅ 支持排序和筛选
 - ✅ 响应式设计
 - ✅ 键盘导航友好
 
示例代码
查看 DragSelectionExample.tsx 文件获取完整的使用示例。
注意事项
- 拖拽选择不会在复选框和操作按钮区域启动
 - 需要设置合适的行高以确保拖拽体验
 - 大数据量时建议启用虚拟滚动
 - 移动端设备可能需要额外的触摸事件处理
 
未来规划
- 触摸设备支持
 - 自定义拖拽选择框样式
 - 更多键盘快捷键
 - 拖拽选择动画效果
 - 选择统计和操作面板