Files
light-code/web/src/apps/muse/base/table/DragSelection.md
2025-10-21 03:52:07 +08:00

172 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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