UNPKG

whistle.mock-plugins

Version:

Whistle 插件,用于快速创建 API 模拟数据

163 lines (123 loc) 4.85 kB
# 列宽拖动调整功能实现说明 ## 实现日期 2025-11-06 ## 功能概述 为接口管理页面的"当前响应"列添加了拖动调整宽度的功能,列内的下拉框(Select)会自动根据列宽进行自适应。 ## 技术方案 使用 Ant Design + react-resizable 的组合方案实现列宽拖动调整。 ## 修改文件清单 ### 1. package.json **修改内容:** - 添加 `react-resizable: ^3.0.5` 依赖到 devDependencies **位置:** 第42行 ### 2. InterfaceManagementV2.js **修改内容:** #### 2.1 导入模块(第18-19行) ```javascript import { Resizable } from 'react-resizable'; import 'react-resizable/css/styles.css'; ``` #### 2.2 扩展 tableConfig 状态(第98-123行) - 添加 `columnWidths` 字段到状态中 - 为"当前响应"列设置默认宽度 180px - 添加兼容性处理,确保旧缓存数据能正确加载 #### 2.3 创建 ResizableTitle 组件(第714-740行) - 封装可调整大小的表头组件 - 集成 react-resizable 的 Resizable 组件 - 添加拖动手柄和事件处理 #### 2.4 创建 handleResize 函数(第742-749行) - 处理列宽调整事件 - 更新 tableConfig.columnWidths - 自动保存到 localStorage #### 2.5 修改"当前响应"列配置(第844-881行) - 将固定宽度改为动态读取:`tableConfig.columnWidths?.currentResponse || 180` - 添加 `onHeaderCell` 属性,配置可调整大小的表头 - 为 Select 组件添加 `getPopupContainer` 属性,确保下拉菜单正确定位 #### 2.6 修改 Table 组件(第1383-1387行) - 添加 `components` 属性 - 配置自定义表头组件:`{ header: { cell: ResizableTitle } }` #### 2.7 更新 handleResetColumns 函数(第680-689行) - 重置列配置时同时重置列宽到默认值 180px ### 3. interface-management.css **修改内容:** 添加拖动手柄样式(第1287-1321行): - `.react-resizable` - 可调整大小容器的基础样式 - `.react-resizable-handle` - 拖动手柄的样式和定位 - `.react-resizable-handle:hover` - 悬停时的视觉反馈 - `.react-resizable-handle::after` - 拖动指示线的样式 ## 功能特性 ### 1. 列宽拖动 - 鼠标悬停在"当前响应"列的右边缘时,光标变为调整大小的图标 - 拖动边缘可以调整列宽 - 拖动时有视觉反馈(蓝色高亮) ### 2. 自动保存 - 调整后的列宽自动保存到 localStorage - 页面刷新后保持用户设置的列宽 ### 3. Select 自适应 - 列内的下拉框宽度设置为 100% - 随列宽变化自动调整 - 下拉菜单正确定位,不会超出容器 ### 4. 重置功能 - 点击"重置"按钮可以恢复默认列宽(180px) ### 5. 兼容性处理 - 兼容旧版本的缓存数据 - 如果缓存中没有 columnWidths,自动初始化为默认值 ## 使用说明 ### 安装依赖 ```bash cd whistle.mock-plugin npm install ``` ### 构建项目 ```bash npm run build ``` ### 测试功能 1. 启动 whistle 服务 2. 打开接口管理页面 3. 找到"当前响应"列 4. 将鼠标移动到列标题的右边缘 5. 当光标变为调整大小图标时,拖动调整列宽 6. 刷新页面,验证列宽是否保持 ## 技术细节 ### 最小/最大宽度 当前实现没有设置硬性的最小/最大宽度限制,但可以通过以下方式添加: ```javascript onResize: (e, { size }) => { const minWidth = 120; const maxWidth = 400; const newWidth = Math.max(minWidth, Math.min(maxWidth, size.width)); // 更新列宽... } ``` ### 扩展到其他列 如果需要为其他列也添加拖动调整功能: 1.`tableConfig.columnWidths` 中添加对应列的默认宽度 2. 在列配置中添加 `onHeaderCell` 属性 3. 使用动态宽度替代固定宽度 示例: ```javascript { title: '延迟(毫秒)', key: 'responseDelay', width: tableConfig.columnWidths?.responseDelay || 100, onHeaderCell: (column) => ({ width: column.width, onResize: handleResize('responseDelay'), }), // ... } ``` ## 注意事项 1. **性能考虑**:拖动时会频繁更新状态和 localStorage,对于大量数据的表格可能需要添加防抖处理 2. **浏览器兼容性**:react-resizable 依赖现代浏览器的 API,IE11 可能需要 polyfill 3. **移动端支持**:当前实现主要针对桌面端,移动端的触摸拖动可能需要额外配置 ## 后续优化建议 1. 添加最小/最大宽度限制,防止列宽过小或过大 2. 为拖动操作添加防抖,减少状态更新频率 3. 支持双击列边缘自动调整到最适宽度 4. 支持更多列的宽度调整 5. 添加"恢复默认列宽"的快捷按钮 ## 相关文档 - [react-resizable 官方文档](https://github.com/react-grid-layout/react-resizable) - [Ant Design Table 可调整列宽示例](https://ant.design/components/table-cn#components-table-demo-resizable-column)