Skip to content

feat: support column.resizable #1106

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

linxianxi
Copy link
Contributor

@linxianxi linxianxi commented Apr 8, 2024

原先内部 onColumnResize 重命名为 onColumnWidthChange,进行区分

Summary by CodeRabbit

  • 新功能
    • 表格列支持可调整宽度(resizable),新增列宽调整完成事件回调,提供被调整列及所有列的最新宽度。
    • 表头单元格新增可调整宽度的交互支持,支持最小宽度限制和左右方向适配。
    • 新增切换表格布局方向(RTL)的示例,展示列宽调整功能。
  • 样式
    • 增加列宽调整时的视觉样式,包括拖拽手柄和调整指示线,优化固定列阴影的交互体验。
  • 文档
    • 更新 README,新增 resizable 属性说明。
  • 测试
    • 新增列宽可调整功能测试,覆盖宽度变化、最小宽度限制及宽度调整事件回调验证。

Copy link

vercel bot commented Apr 8, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
table ✅ Ready (Inspect) Visit Preview 💬 Add feedback May 14, 2025 9:00am

@zombieJ
Copy link
Member

zombieJ commented Apr 23, 2024

体验有点怪异,如果是超出 width 的时候缩小应该就是缩小,不应该把右边的撑开才对。

@zombieJ
Copy link
Member

zombieJ commented May 10, 2024

看起来好像没对齐

截屏2024-05-10 13 56 36

Copy link

codecov bot commented May 11, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 98.06%. Comparing base (facc838) to head (875626c).
Report is 6 commits behind head on master.

Current head 875626c differs from pull request most recent head 696ddd4

Please upload reports for the commit 696ddd4 to get more accurate results.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1106      +/-   ##
==========================================
+ Coverage   97.96%   98.06%   +0.09%     
==========================================
  Files          51       53       +2     
  Lines        4674     4913     +239     
  Branches      597      627      +30     
==========================================
+ Hits         4579     4818     +239     
  Misses         91       91              
  Partials        4        4              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@li-jia-nan
Copy link
Member

mark

@yoyo837
Copy link
Member

yoyo837 commented Sep 6, 2024

mark 2

@afc163
Copy link
Member

afc163 commented May 14, 2025

冲突了

Copy link

coderabbitai bot commented May 14, 2025

## Walkthrough

本次更改为表格组件引入了列宽可调整(resizable)功能。更新内容涵盖了接口、上下文、样式、文档、示例和测试,支持通过拖拽表头实现列宽调整,并在状态变更时触发回调。相关钩子、属性和上下文均已适配,增加了最小宽度限制和视觉反馈。

## Changes

| 文件/路径                                 | 变更摘要                                                                                                              |
|-------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| README.md                                | 文档新增 `resizable` 列属性说明。                                                                                     |
| assets/index.less                        | 新增列宽调整相关样式,包括拖拽手柄、调整线和指针样式,修正固定列阴影的 pointer-events。                                |
| docs/examples/column-resize.tsx           | 示例重构为函数组件,移除 `react-resizable`,直接用内部列宽管理和拖拽回调,增加 RTL 切换和更丰富的数据。                |
| package.json                             | 移除 `react-resizable` 依赖。                                                                                         |
| src/Body/MeasureCell.tsx<br>src/Body/MeasureRow.tsx<br>src/Body/index.tsx<br>src/VirtualTable/BodyGrid.tsx | 统一将 `onColumnResize` 重命名为 `onColumnWidthChange`,保持回调命名一致。                                             |
| src/FixedHolder/index.tsx                 | 监听滚动事件的 effect 增加 `direction` 依赖,确保方向变更时重新绑定。                                                  |
| src/Header/HeaderCell.tsx                 | 新增 `HeaderCell` 组件,支持渲染可调整宽度的表头单元格,集成拖拽手柄。                                                |
| src/Header/HeaderRow.tsx                  | 表头行渲染由 `Cell` 改为 `HeaderCell`,增加可调整宽度、最小宽度等属性传递。                                            |
| src/Header/useCellResize.tsx              | 新增 `useCellResize` 钩子,封装列宽拖拽逻辑、视觉反馈及事件处理。                                                      |
| src/Table.tsx                            | Table 组件新增 `onColumnResizeEnd` 属性,扩展上下文传递列宽、拖拽状态及相关回调。                                      |
| src/context/TableContext.tsx              | TableContextProps 扩展,增加列宽、拖拽状态、回调等属性,重命名相关方法。                                                |
| src/interface.ts                         | `ColumnType` 新增 `resizable` 属性,`CellType` 增加 `scrollbar` 标志。                                                |
| tests/Resizable.spec.tsx                  | 新增表格列宽调整功能的测试用例,覆盖宽度变更、最小宽度约束及回调验证。                                                 |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant HeaderCell
    participant useCellResize
    participant TableContext
    participant Table

    User->>HeaderCell: 按下拖拽手柄
    HeaderCell->>useCellResize: 触发拖拽逻辑
    useCellResize->>TableContext: 更新列宽状态
    useCellResize-->>User: 拖拽视觉反馈
    User->>useCellResize: 松开鼠标
    useCellResize->>TableContext: 调用 onColumnResizeEnd
    TableContext->>Table: 触发 onColumnResizeEnd 回调

Suggested reviewers

  • afc163
  • zombieJ

Poem

(兔子祝贺新功能上线)

兔兔拖拽表头边,
列宽随心变又宽。
红线闪现鼠标舞,
约束最小不乱窜。
回调响应新宽度,
代码整洁乐无边!

(。・ω・。)ノ♡


<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> <details>
> <summary>src/Header/useCellResize.tsx</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.57.1
> 
> ESLint couldn't find the config "prettier" to extend from. Please check that the name of the config is correct.
> 
> The config "prettier" was referenced from the config file in "/.eslintrc.js".
> 
> If you still have problems, please stop by https://eslint.org/chat/help to chat with the team.
> 
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->

<!-- announcements_start -->

> [!TIP]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> - CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> 
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between e237b55b21e914024fa9b1995ba722210badc3cb and ada35d260077d2cee60ad6c29a3f9056a35a6416.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `src/Header/useCellResize.tsx` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* src/Header/useCellResize.tsx

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: test / react component workflow

</details>

</details>
<!-- internal state start -->


<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKNwSPbABsvkCiQBHbGlcSHFcLzpIACIAMxJqLiYvRwwbaXgALxVI6MgAdzRkBwFmdRp6OTDYD2xESkgveAwAD3hMNvRkW0gMRwEGgEZBgAYANn4sXBq/BLEwJmZufHIMXAB6XByPf2XEdXwXDRgZ5m0sBlhMUhQMCXwvKWR/DDQyjCJ0LGaaClffEhSNaQK4YWiRPixCgsSAAAxWAGEHql0vtMiRYWF8HDEcjmBgAOrwWjTBGg0iYgiQAa4X6QWhIcQfbBIWAoXDIbjYCh7EjHOCobDcWjUDyofxeUX0KloSDpIIhSCxQ6QJGsdjIAAUNgAYgiAJT0pAMOr7FYg/CICqTaoeTC4MBKfZELC7S0HFyQTWwWncRAcdbrIjqWDYAQaRbre2OjIuqNrGPOjDrBmIE2IM0YRDrAAsAA5BgBWABM+v5MydDAo8G44nNqAE1ZIsS+9F48DO1a88mV6ekNum4rIb2anypDEl1di8mmHkB7AA5M8HmKpjNkqlZmjR0qErhuXzzJY1Ww1sVHJ3XAYAMrzqi+RanjkFSgeM5KAcITneXz+BVWgAaEF4CIWAmlAplPjqBoSBabhKHgMgGBIICJCQbA0F8TCQIwJ8gMweg2AoG4mAwWImjEf0jCgAAqGjMhYNQSAAKTovxtHqehSOQv5kBUfA8FtLcsh3AYrjQw4gIwfBIOqagChqNcPA3fECmJaYUGeOhsGQyoSFkFZ6FlHitmaRoO3UIDZwUFJVMQWABK8eh7OrDAAGt0AYJgKAZD5u3Y2c+GmTBIFg7gCJ3ay0FoIQ0GQ4FqwgmzUnLVBCmQStqwGIy+KwbA+gcTDIGgvgwoQpC+UgABBWgGTrf5uyAhjmCY5ieHwH4ogE0JZTQwrfDKRBsJdJ9NIcVchK2ARIkaNADMEgj7CufwjPsKsSDIeyZKxFAfDqXAqBoITeEESJmA0ajIDoppWnaW66KsmY0DwBy+HwFtrNsID/EQZYwSiKkovA3D2AUDAeKwKowslZpIquUJrJUrB0tuGg1ngFZMP8vZ1Ax8h6HNazYmcPwQJ9akFuBgHsWsyJYlCfYP3euTQiRgKaiC0FGHYV9aFSjLYwuBz4GQgoikgd8PAGBhnvqISSB8Gt9mKEhaR3Mokpl6D+CkChyPwfIwbRhHsQGYDarIID8gQS4FG8IzYniMQhL6jCsO4eDnEwZCLoMWiaKaMAhHaMBXgwNjFrogyDLzABmAB2NiBBktk6dCRtEJbR8NQl5w3LhjwvvMtyFfkZoGRl2S4rc6T8kiWgiFGlUDur0dff9tBYgYQYxljtjpOtYKEZmLkfFmf9QiuZAiJIlZyJF58h96DbpVNnZpAeKQ9OVfx2UYEKzZnuhfYAeV1rHHuUlgn2QXs6htDsTrQj4hJ+kSX7EtAJKCteJcOVd9y4ykPhWqP19gv1dkVYaINgRIHGlpSUg9sQKyaH6VA+Bdb63yPhMEW5N7q0oLPMiFFF7IKzAeewzB8Ap1RiQIgh08btzAIYAwJgoBkAJi2Z6BBiBkGUNabOawuC8H4MIUQ4gnjUnkEwJQVBVDqC0DofQrDwBQAFMgVAIVuGEFIOQQ6URBGcHYobBwThPRVBkcoeRmhtC6GYUYFRpgDA2AAKJVQACIAFkXEaGYLQDgBhohBIMBYaqABJXheipT2AvM4eQzNLjXGkG4Cs+ATRPmoHjJUzcZhTRmmzE68EKDiH7GZayriPHeN8fQFGQoRRINuBObAH5ZTkENoUyguB5CvDYPQWEb9sjTQxPzHg0IildM0vwD6sh4KQAAELUMiFo3B6gBZpmrLWLJqBohswGXyPIAA5bEKcGiJI+P2QGMwqpWDCfwPgdQ0A3Fgm8bgkRkD5FfLnJQvsjzVS8L8TJKxkCXI8EoCcXt6rIGZmFQ41oVRcmmiLUK6MSmIEujVJQ9A2nJVUh04psguD9IyIMyImJmZdNmbCBZK5MCYnyCGek0gqw1nqjEXZxKSB5DKTMWESJbJYCsGMxAmJ6hiCyeSmYFSvE+L8RdIJ0RqJOKKPUDk6xy6wQ0G8qi8qQmWCqhE3R/CoimMvFMxg5JkkGHcOapJGi1jQloDpDw2KETXmvPYLpbzZiIOpji10xKdzco8Hkq+SwVjsGOFVZehtwUZmyZzK+/LhKZB3FaUUXpYQADIFh4gwGAAZo5YSGhVcC9c3JEDN2xLCZI+aOWwmOESQcSluZj1IjQFooRNRZoWCgotVl8jYmxQrEgN90C7ytLIeuXBZR7JBARGaXbs17LAKCcEGJDSLRnRy8y5AM1Lo5WAG667jgLI0s4DwON6pRBUBWlINBGr2HCs22IP4QQkDJqECVykUFAXEnaNSJI2TMxzNwFoOD6Day3ZUau9CBJgnLOvNEHhV0zSnugRoBsGiZDAOqloXpBgbtwdZWdR70MIFAlhnD/08OalGCMfUVsGW02aMhw4WQVhbB8NInmK1irgM+LKFuWYd7nWqrVXGmMuOXx4PUZphBh2jp3kqeALQDEoKWtFA2Wpu2xBU2ANNxT9NXFoAbTEi0dN6Y4UZzT+Qi1zqkNSDaeVhTRKpM0JpH5YTLE6hQMA84zxcGkuQMlSl4B8FhBwDgndfiYgUznKkvB/OhB83FVlPn4gvB9pAI5oU2hWlTZ6/sKovD4GDAwF8u9/BUK3nc9A/zeaOYMkRmoctop1TxogH5uq/kAshTtayYLJyAqzGamFxSup8ARRRZF4REJor9tl7EZzSDAuQXBWFE3PCIvK+wXG0gFyMvBQwoFFW3zRQmoODK8BHYAG5Jj+Vde6idM02sSZGx83ePwHVOr5oE4JfsnEmYYNmZ5Sw3nrCRrWpDGgOQtACTq0J+rIlGucrEz0CSLXzetaD15HgUb+GJmIf+9AoQwmMpKONiw/qgzqDuIlqWodZG2JiJT7LtwvxlEqfKYrJMKDDasUItOX4OXwG5XK0oZg+f+Mm1NQpljFLNf0hgYAQ31pOM6kghtdaZlmNVi5MxoYi3UHCVETOhnQHUKSt952+DITHotay9P5gDOZ4y+C/1wayGOGErMNBopAWN2cV4K2/UAemHa9DsJPFoG4CKrYR06nRLQoJnluJ+Wm/RC4sEmIZY+AENXUZGDiRRCqErlXzP+QDvsKrKFWdc18V3koXT+MuDhvsI/GaunVO0DAPSwD1eeq4Lb/SjSXeohp1bKTTW9egLJw0g4D2sKdwFpfiPtkffw+MurDV0nzAhJpqOmcbgtWm/PX+Z19XuWXkva8BW9AtU+LmtEG5ZOeHAalaIDNRKPoVeEAn9qaAAAGUNElHmlCCUyJhUwMXrzCG2BPRoRDWQG1lhCl0wgAAlqExczNcFjJ9oYRYRSBcAkQ1hzhKAiRAMWdudWUl5oohB9pS0r4SCWM+AN82QqgSgW4xUOdclthqRFBZAlw+CfIGhWCENRlAQMZ75Y1kAqdw01hBCD8UJk1kN51KBEBwNZh/o+ASsysx0PAX0uNdcMFr1cFdhJRdIpFqhUARc3IwB89OJ0APZoQ4p18GVmhSM2Ym9YY+tFpZ0UM25L96lZQVVJkwoCIog18/5KstNJ8S5ZAL8z5lAfBpMccZpa5GUqFfd9EZDc0ZcX5Op6FokGR/AxB/JIiy9VdBDUDfAbDxcPV00g9HkR1QYzJZQX1wZ6oip0hUs+dqc1gutEd6tjsRsQVDshs+toV1txsCZJswxptdtUVLpscpjrRT9vBQhYR3ER18Ac8LUSdoQ99ZRujnZpDei5DO1q0KdkAtiqFcs0ZaBkBjjNA1Q+jcA7NOcniucOi8YipZCBcM1SIrRIAbjsQABeL0Q0UEvQSAZia8AADQ0BcTOnYCLQuigHSD1wlw8FhAz22AtwiAxDOP+M3THglGiUKTqJQzULRLlG2Jq0d3SG8loGgBmUJPMxBOvHj0JPSzimkBpIxOMKMlbSuIllVgcgeMn0UML3GTm29Vc2xBXwE1MJIFeV5JqQZVhGgk5NFExFqNzmDx3FlCjxj2ACeI0AAGl9IpJ+hKA9AWcVQ2ZWDOsFsMUohNT6gyRn9X9dTMC+Mmj405QgCsQiBP8PBFCaTXTpQq82ZnAqB4iAT69BhsC+kkZEBiw7NIj3CWNc4PZIpsQ2s8ilT1T+9d96iaAIyLY+k08UQOUs9aBdTVCKAoVIYEDthVtioXMjprJWCcyyzDwoBIy4RCDiDTI9FyDphKDvjzRwoMxfU582RECdpaD9ojZSCWD1I2D5Bk5hD1zAMKzMU4RqiMDRdEBQSABvMJA5aAFxGwA5KqQAgAfTQJPhPnNOvAAF9MRCkdp5zYChlnSdUAcwAjBwoGA3ImiNAhAK0MB4dglEcDU+F9FUczF4ks5McUlQUVSOEkJ5Boh/AGcXchk8htcslogAA9WODQEYDQQsPIfHOkqIUsx3JQCQLY93JQcGObEVcRcVD6HlUC8C0gSC6ClneASIY4HLE5PgJQdipCWUh0ueECbkYbd5T5ZbY+BxbrKqIYlS/rCsUQcYjrUbFYzbKbJFBYubIwI5cgOVf7CAYCgwRACgBgdYBZWgWQdYTxBIBwfwBEFBGHRAOHP7BVeC5HJCmJFCs1dSrHEeMZXoN4O0XBbyH6P6XyT4cKKgNgOkINOELyooA8PynwHPFgV407G1c5fY/A6s/EDPQkqkeEDAPlVIcc2AMkJJNXdRTQkcF+TuJ2ReSXNYSgQnbEvKnykgQqrwQVfAP0ZMoSdonnLADKhKukJ0A6HSfcVyT4HKv4iNS/XPLwfPMC24e4SuLZLMYvISd0kgQAuabqFxR2cRH00XMWJAzs69LyQ4NK/yccLGHERq3NFqtq85TEZoK0BIThP6pqmqutICGc/jffBKsdIgRwHOTUNmOIyfO3XwVgssRbfgQKDDXQhS+1B4JUErQ2FGKhBkXTDShxQY3rIy0YwbCFIyyY+XOFWY7bGbPbebKAKwL2LKhoHpZSPY24XK7ygqlBKama2hPWXkwlaqtIDlLgTUOIrgM0y02QRjQDQLG0igSE6E+4YkTEQAJMJIaAaNygbSAVa1baTUsLSrSw9YBdaWpKADbIAjb6yFsdQqCsklrBa+BhbyrSB6AzIxtVjmwz9wDfbzQo8JbfLe1CUzy/VNagJFbarIB3yuBRrJafBpbhVIAzbYRk6kZU7JgobCRLaLVM7s747xqpahVYRgrFUHKnKXK3KPKc7/AbADYAqgqEc9UEKolrQTU4kor0KrVYrpr4q2BMbDgUrDIdwqTIQY6sA/1HMyAureklQDjzb0860doGqK7AaLVKRYBoRsBQJupLqu6SAe7bMiTdrOr3MUgnQhIeTRY478qE687G7pN5rWV/bVYGhVqKB1ruRRxpN9rDqPJmgTrhtbhGZg1U8MA5lqBLhaqGywQIQNDrJvy4aogTN8gpgaYeVb6JrdixKuISrziL9rUdCkVFo21oRfAsFddzhipwY9i7sVhvqZgekdwv19488C9vzFpVk/Sbh16BhN7E8GkCdIhnZrJsVi90YaaKABi9UdK+smaDKWaTs2aNsZitt5iUVLKFsfc4Q27XL+DPK6776+7YRpMP6Rq66Jr866VxYqbrtEJ/EhJoHRGxlOl5Aj7c1aqbb9J1a5hNAy7WCXaBh9bIAoSPaOp6yXqt7fVQn+UT6kkImCU7axAHatanb4m3aknDbUn60FtrU1j/lct2bGLV7xbv677TN28XRqAKFak3rV5ZhVTRY8GBbgHwt06D7yjFacngazVrIhpZ6KUJpYRrGO67GWmHHYcqnAL7KjAlnbHcM+7YKQrB6wrolR70c0LbUMKFAPwzDeS+Ix40kTQKBMsis+KL04qmGONYJQgMbhaqz/r96kM6UNSJmq72qxbHcO7ir+cn6vxGlX79dMKrQwGxAIGX4hG20vmPbMJggoHPmO0YkBB1kWUsk4j1DJ88G4qCHenHdb776oXXiJLjkCaGHytiaDpSa2HNEhjabfltKGaTtdGjtdLDHpjaszKdszHLUoActoq9LMKhWJi+AkxOmfpjKGnjHxXubUUyrJZbKFUgLtnnL1gdQoDaAMCnJKA1VqN9nm7QrDVwrTnULg7LVscHrnYbCWZ78JTfCGKGDIAFxrYNovADsktzIwa9FPwwyqwHgHwOM1z0nvGabemX7mlsTiieKVgzNH8ZLsLPdjhBUJCBJEAH1rJmw+r2IsBeH4lwYPBzQqF8pB8uIlk+hj9zR8p63+jFtsE956VSSSB818pJ9/A7Dy55YgRQgmhw2RDFI7xLr02Fqvy4roqRlNoDxS15JS3x251sGGhoI/XHmXgNj536pMQJBsX9CVR1kY3hGTREEOtfZ6b+FGbSH5XDKDGWxw7TK5jzLJX5trLDxNmnFrG0DwbLWQObcJqbWB7wljmR60cnXoqjAo1sVPiAGfjY3oXgRYRwPZEKHJkvtFAfsgInQcJfUXhZF0MQ1rcKOsa1INJprOjfwA0X4ZZwo1AmhUVvceovIVTnx7WkV5mTdRBPqWT4JZqvmOEZAihv0x48VtXIjXtGPpT/Q4RS79JMRVb9IUAOLxBpwC4/UGM4RCKrdNRk4aUSHkVeDFTDPYR3gWqNP3gOxHAnawYkXzhcBDPzMkBrxo2fA0GKAC2JI6g8PNRyJHlbgK5Ml8jXnxCguZD1NNE1oWGDrnBcbrUdrgQ930N0wCA98PWrqJrMGdp7X00t0kNt211ehFAlC4bl9h0z3gQgHfg7UPN9P0bHbZQzPm2t9JBGLd7YQu86zF3prgn8JxCu9GARSkXIGkuY389bd1MwuiBvpiVeCluNDHPmBnPRDL8fp1i6vyuqSquPxNEPZsLqWZh7DsS8OMvQhk9LqY92KjklBhvuArYEAZpfp8K0q6tfApKW1fAKSxDbvQiTKcohJanQhw7pnThCPxLNLH3hj2yBs9Gke1WjGxXv2JXZspXstNdH7gQ2s6BCU0PzQcPKAJrTThOfJROSA9BNQKSuByeKB3GhUqemTae9B9RYsweuhGViZ1id78DgPQOKB1hmfIP1nm6DXHKjXmfxfRe1nAqDmtKh6UcIrTUMcLnJ6xQw0FchH+PyteVe0CfQh6LMSh2VTzCS95AQpH5YUzVZQqFx14IGAfGjeJeTfbvvdzqPxHdme6XTegI5g2RaPyOEIX50isvsPRe8PQa/cIbjeirI1o0+DzOybwuUDEAfPkv/PAvJDEA4+cilg8BfVVHdOy4YuD3QZaPUAOxel2h70tzmx/50Mr2RGFv7dh45wh8YvoR8hI1xMlOKS9CeBlVMnPeirCU1PZANPZFevKq992v4ibPvPfOvA8//A4uKGgIiU0RXdNRUxthQ6q/cjEv2+Uv9aNDbPmh7OvQmL1xcivCMA3s0uWsRbbUvWojMLTJ64AfD15wA0VWNFGoCygPmJNXwKMRqA24/ABsTQvPw+Cw1nA4gW9s4H8jOA4MzkdfvNwq43QiyoeRUpox6xPsBWL7MYvoxGwisOaJjH9jj15p41ZWVIT9hqyx5at5AzNJHndn96K82mIPZVhtXXhnBQanDdSr9kA6t05eovdYNBEK4cooOcFI5iVzg6RUte5yebMh3x6fF8uMglBEVzr5g5mig1Xpk/Aups534nwUnv8HUDyA18rRP8vkhoYC4uOnkZCLWE5BDNmucLZpG11yJxExuXXBIN8DBAiwouW1PvtuiO6aJu+yKCGojB/ToZHs43FTGnU2S84lut8S9tgJJjLkrQo0H1vv3Y7WCNCTvWGFtz3w9lASLcH4GIQ9aAkUa08fbrjiNiYsz2KQfsKWVhDQBtgI5L5iKh0hshxY7aUIMezxhARq+wIR0huTqKksrIMkX4o4NBisExuBOV8DWzlZc4x4VHOLGsCAgX8cBSGDQgEzAoZC+As6JLM6R14WhnqjREPNUT7L9YqAR1QNgTUVKTJUsvXcljMFejsYSCgPd0KymZi9R0IRUEjCxmcFZcCc7ZK0K32sjeF2g2NDcjD0TSpBpMBmWSPWzlhwl2o+weqLgwGq4wioE+S9LxVfjboj0zgpQL8HeAItQobrCRIhiyAqEd27eD8FdwJjNohhRoEoqygdw8okAJrFoENwz5EBT4QQgkVXGUIe12gf8bWEQwwAB5QgiWcdgLAF51NOR9QRRriJvbeBRQfrOEUVGJHmgICMwUEbujJL0j1hIaYobSBcL9gMRDFSfPaKFChQt2k7NGGoXWFA4UawIZOO5TEL2i9cuA05JhFQE0A/W2KHsmyMjYyi5YeuPCMih3hu9uCb4Uodt0RGVCqAPwDQnIxpGmiL0/wrJHFCZKjhuwvsAkIpCEhOjj8obZVrfnli99Cy0mD1s3mwjohwx+PHspuhij0F78sUeKKzFyJOkUAMXAgJxhc6oAtUckZtF/G0CSghk9gvHBuWI6MgsoeAfTmnGMJKtQKwaMgeQHxbwot+BfUPOLEe5jJqwooZwbOAuBYw/WWTGskhiFFHCPIkRayDmOLLh4ahvpTCHfgOggRSATZP6hnlHBW1CST49suXBCFdkTRzHT4OGUuYet/AG1EbLKFhJYioQjyUaG2nOCGlJRR3BkBIDo5sh3KAjcrM9n7BRjzQIw80ItD2EkxEs9QGthtyLZzgt2y9KEVsAVyEDIA5YsSgyJTSID0MeYyZOH14z3cji0TdqMUiKig0LqRMV9FsORLAgqQkCQwhBMrjIM+JhpBaqfHPjJEhIHrJCDHgcA+o9Rg1R4RaLMH8TPgLLQidKRgisT50M3CoUCiqFnhiOsgEiR6knQ7glMVEqwV0g0IqTdwdAGBkQL5YkCRiZAjgcKw/a894UrAiyrjx9pTksARPPxgV10Eco0auaTWlE3tpl1+RKmOslwACGYBYaBOFTAiFvxcBpuAktfrn2cD58i2E1AAPwlTFkgQlbgUMiBtS0+zbICHZw3K9S+grtfWlwFQmIlFJoQAAD69AfwINLAIs0kE25pBHpTKdDil7iDDWLlLoUMnkGHMYOSg41PB3Hra9rUu0hwZh1wCCER+LjUHvcQiIMpWk+PBjuhxdGgxl6e9e8YyKFFLwSi76SRJSNnF8Rk4gkYjBymoZJoSSsbJNE6R96/AGoxTZ6SYi5KHlEAQEj4CDTtTstHUFhQGI8OfE1ACaxkXIrOhG7DF8Oi1aEPQmkB0NH+SaUlpPiHHnpRSVCRkYRFb6JY3eGo+QELk+A4lomGgaCF5SoRAsz0kAIQB1DzRRic2HuBgDOHzKe1OG5AZCBmDHolEQxOoyFGIVgiMg6cozQFsIxS5HUhwvzQ+iC0AwgT7StuScNYLEJZ8MZRAOPOmkFAOEZQtUBIW6km7KpLRVnahFDymn0hUWnwLielzxZ3dz2heNCAeSpCVgOE9oDRMgDCL/Rk24MeFnCAMJeALpd9ZsE41U4PBEALVYVLv2SCIBNaxc/OV4CLl5zlG+PO8dDQfHZ4jZMDYoQPjpBKYHZMEjTg1UdlWy3+0gO0EPyMqFJHk6acGezlgmozFobExlFhT4A/AyBIPA6BtGD6vBEUL8ZvKcg4wsNJ8A8d3ggwSSkyyR12UQLIAnAsSNQYU7Rs+wh6o8Yp9TDHvFK5qJT6Bg5V6bzm/L1ylajc2gL1M1DNBlQXAEujlMiYFMYm+kO7HEzmmjS7sSMIuUApTqgKNaECkptAoSaZ0AA2gAF1M67tT2pSDIGdDtgHjWWsNTFpLSdpcBdZvyWHDb07hT4oXnvi/lFd6qFs0kKfXBY8ps59Lc4uQusbZzHG+5KINiilIqo6QPcmCSBLymFN3ESAcKLgEuBU97at4XANqRoBVQFqwAUqRgD0B2l1hGLfFq0OCBRzi8lQEJtwr4VGsBF1Cl0pWVT4GLFRQTYpLKQG4/hs56QWINIs0AeKT4YiMQMADQLQBPEgBWRRICRKGDcAdpEuQXPgWQBo83AJRYUzLojSEmUSyuWXP0gqdkFsgbBXnOrQPBYlmoFJQ0Fmn5Rn+dAfULkuv4GyfpTchhaMQcVYs2hJig8qXgsVmQKF6waxYFQ2Z2UgORrAAGphZ9wmEbOTY3coABxasHzFhwq87WiFE5idNUErZLmliPptbzuZ/cvI3IZ5rXn8ZYwYGXxBajPWxI1L0QYstkF/MmYUhCJOVWEFMuNqm8RkKbN+ijyRbgNNqSI5oYYsjkdDs5PQjtLNVhF3A0kCDGSS0jhDQR7qfVJ6h5CXjqAjUUKXWJXNSCFyNyHVdcNXV6riI/WobT6ftQiIVjJhgGBvLUB6a7CR8lwHybvWsgPA/mFdFhbuLrlsLWqHCtfNfUwi/BDSGAeJMy1KxIo2WO8rBFfP5aRTb5CrVmrFPVaY9n5v7S6DK0xyei75irdpq8AEF7LmBMq0xnQJ1bnY9WLdbaRDnDldLuh4c/aar1g7HSVB5zNQZczulEKhkAK3ACQu6b1IyOtCjSQQO3QMKOhZyuqlWhZVWzB+7WSTA+nqC6TU+cnWUuaN9SWTuV0oXgqAWvofZB5mKadBLDwBWdmw6wzOQuNCiByu0mc9xbnM869lD5DMzJTtCHFdpS51czzqlKeZzQoqg4qYQmSrlTC+0XwMdHGWbUVr4yNagueXM7UhR350uBhcwtrJNyl4Jgt+kDN4mh0yI+ZUGdEJbEwzNwnYnAq2hbUkr0A9MBoIqVbnjqVgvcjhW5mCHqSFIm9V4ZojFQOYVQzQd4VIAQytYh5J2CTs1kYJDDBCrHFQGJWsEPCC8+Q1KjtGJUaRZW+Q8wfcOd4eBCifQScKWIR5aNRVyPfShKvfYPzRWT87VTzUuheVpgigVVSqzJVur0pfqlWjPy8VFNta0wUpok2Sb4LC6X0/ENcpIDkaQF+TbJdRudpoKym9GypmLXtX/Lw5JCjpdYwcUmrHVZqqXnzScXas0pO0QTaasGodoRNi0sTcaqE3KbNA6zAJJAF0AZy3F2wDxZRs8SZqhkPivxbgACVBKQlkgcJU+DtIGA9NUAfJbfliXxLEl4C4psUooCObnNlc2JT5tyVOb9NrmjJfEUo2a1gt/midT/L/kAL8ACCijWAqKaQKNytG2BRbRJVJb2NkWlBVAp82YKcF75PBZUxC0ubj1kii1CrSMWsa+pgQ0rcbWl5bNZeLlFxgFTmWKCFlygzXjapWWXCk+Wc1kgtN+DDVBCrm1IK92CZhBWS6Td9THOxAvLEq/AVIdLkWZZCKAmIbRcKODVvYsYxTR3BXVp4jahqvJdJs9Ebg8x1S4s7FKOqKjba5OITYzsMnVxyxwNHsrKiAK2AgaYCTDFBAgnlKzcO+4hBiaLA+ZJpXhP6woQFK3Cu96RD6dlZTC5UvxdZ+WF+FGqKx8Asq4pC4by2vmkDxVb7SgVKsfmc1sNixBbNLWm2Cc3x0/XNL1IrqIBae7PETqyT0AYKfNWC02iivxAM768zOxkqzvgjs7OdkATNJAGTq0SKAvU7bZ+QE1mSyFg2gXdT2ZJs6FpVjI1u1o5BN0ZN5MiZGlMJTPaZdHU2lPLtG1nbeUuaZXRzzV2WK2tCu3kgFSbpbSDAYY1VLiT2m/RRA5q+ZcPStW9bnWMVVANijd0xIEVAZR3BYpB53x6gzZD2ghD07Jjk0vBNmJYOwhdJnBJaDso+nkpYB3EJ8TxHZOcX9gmgJcHEI7BVT81D2s1eEBXtVh38qQ+wLbj6lmhgEwYIarMGITd3FAnOLekqLLXeEnYqgumT5faPelngdotAKgJ8EslMi10dRX8SGX3XbpBA9QCgMirAk7Qcx/jBYcCDgmXCHA4epbaWn8BnYykioGWLHoCQGBBgxwOiCBPHGVt/m30zPGCA4BsRIAIWyAGElCAiTH8VHF8VXme1+oyWnBMXC51lZmRFCgUhPbKT+kwTsuuRHMX62clPNxE6AojIlH/G3i/Vj4g5QXhfEG44I4iYRR2KmHODvxNMEIFpAnn75hOSVXItFgaA5DZIkBJspoCMDFg79NERnViDHE9lJxwUC4LvrN7paP9X+zqqHsuDP4ZAJAcSBjBYIVjrIo4+YbDMRETjaZU4nfUwQjY7cf97eZvbqKWiuR84PVY8bgl1g+N9cG7GYMzO7FAkixn1Esbbw/XNyC8/03rvu3nriIOyJGp2mSxeVaSmADbHyZkOS44DRCRgSildBoieJUx5QxEWQETERL39NEPTV/v0Pd7PWjuQaRQSL0TJqJoeIcF7rECENg5hZBtBWOoA0AlgrBhUtuhJlJoBg5NdkNPHiNO1pMPZVAOCiWC+prIm3RwHiNrYE0kYghTsfYefCOGfIzh4HvgZNnIBLDSbHaB4YcyIxvDJxFyZmPxj+HfYIHLwEUiOV9ZYQi+/8UV3MwmZPEzEy41IBFS9700ZMwlpQGRXnDHRzE+kNPurwKga2NBuHb11LGX4sj2sT4tABCA7hAC8ARsGPUWhDLQ9SmESTNxrF3GtRm6Wcs4qBRiFD9R0VdqqyXjjyzcDg/lK9TdX+Gi9D6FKj4YzHucyW4jEFWXs30Kdtl+iSUQlooBnB6oIqiKShtfYUCNVcUsnbQJw0LYDk+PUPZidTXE84QmUCEyQE1ALgBFz2hcEBE1Du1k6GgNU7gvV3HHqD6wD3eJRKOON0j0rfHjUH2MNBLBfEOxUUu2jMD9QXAT/TFqKAeTyslgsIFgcoC1VNQw6LgPZvYDc90jMWl0xcauPGFPTU0701NN2EcSjEPm1eX4xjPKZ/Alx6CAAFVj84JNaiQG57Nb7EjidhA2O0SWrqG6oIRMYg15j0LE1XORGoBsRKJ7EbCPnGUFwAPliQiAB8oeM1x0AHyaIuxCwnrMkBiwCcAQIWELACBiwgwEgAAE5BgOYEYMWBzDEwJzAgQYBOYnMjm0A8cYsJudGD55aADAWOAwAEA9ncz9+NALHELC0BiwYwEYCMHjjxwLzyEEgFeeihjAGAxYCc6ediATmRghYMYKecLBoAxgOYHuEeePOPh1AzZh4m2YkIdnaAD5DhD2aAA=== -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=react-component/table&utm_content=1106):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (7)
README.md (1)

136-136: 清晰地记录了新的resizable属性

文档中添加了列属性resizable的说明,使开发者能够了解列宽可调整的功能。

不过,描述信息相对简单,建议扩展说明以包含更多详情,例如:

  • minWidth属性的交互关系
  • 调整列宽的行为描述(根据PR评论中提到的用户体验问题)
  • 可能的使用限制
-| resizable | Boolean |  | column resize |
+| resizable | Boolean |  | Enable column resize functionality. When enabled, users can drag the edge of the column header to adjust its width. Works in conjunction with `minWidth` to control minimum column width. |
src/Header/useCellResize.tsx (4)

59-60: 删除遗留调试日志,避免污染生产环境
console.log 会在生产包中留下无意义的输出,既影响性能也影响日志可读性。建议在合并前移除或用受控的 debug 方案替代。

-    console.log('colsWidths', colsWidths);-      console.log('componentWidth', componentWidth);

Also applies to: 90-91


55-67: 高频 mousemove 回调建议节流/合并更新
onResize 在拖拽过程中会非常高频地触发,每次都会 setLineLeft 引发组件重渲染,可能导致卡顿。可考虑:

  1. 使用 requestAnimationFrame 将更新合并到下一帧;
  2. 或使用 lodash/throttle 节流;
  3. 亦可通过 useRef 直接操作 DOM,待 mouseup 时再一次性 setState

48-52: 事件清理函数健壮性可提升
mouseMoveRef.current 初始为 null 时直接传给 removeEventListener 等同于传入 null,不同浏览器实现略有差异。可加判空保护,示例:

-    document.body.removeEventListener('mousemove', mouseMoveRef.current);
-    document.body.removeEventListener('mouseup', mouseUpRef.current);
+    mouseMoveRef.current && document.body.removeEventListener('mousemove', mouseMoveRef.current);
+    mouseUpRef.current && document.body.removeEventListener('mouseup', mouseUpRef.current);

115-118: 监听目标与选项需再确认
目前把事件加到 document.body 上,当鼠标移出窗口或在不同 iframe 中拖拽时可能丢失事件。通常将监听器注册到 window 更稳妥:

-    document.body.addEventListener('mousemove', onResize);
-    document.body.addEventListener('mouseup', onResizeEnd);
+    window.addEventListener('mousemove', onResize);
+    window.addEventListener('mouseup', onResizeEnd);

同时可加 { capture: true }{ passive: false } 以避免默认行为。请确认兼容性需求后决定。

tests/Resizable.spec.tsx (1)

58-60: 伪造计时器后需恢复,避免串扰其它用例
vi.useFakeTimers() 会影响后续 test 文件,建议在 afterEachafterAll 调用 vi.useRealTimers(),确保测试隔离。

docs/examples/column-resize.tsx (1)

70-76: parseInt 结果可能为 NaN,需提供默认值
borderInlineStartWidth 为空字符串时 parseInt 返回 NaN,后续计算会导致列宽为 NaN。可做兜底:

-          const mergedWidth = width - parseInt(borderWidth, 10);
+          const mergedWidth = width - (parseInt(borderWidth, 10) || 0);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d999347 and e237b55.

📒 Files selected for processing (16)
  • README.md (1 hunks)
  • assets/index.less (3 hunks)
  • docs/examples/column-resize.tsx (1 hunks)
  • package.json (0 hunks)
  • src/Body/MeasureCell.tsx (1 hunks)
  • src/Body/MeasureRow.tsx (2 hunks)
  • src/Body/index.tsx (3 hunks)
  • src/FixedHolder/index.tsx (1 hunks)
  • src/Header/HeaderCell.tsx (1 hunks)
  • src/Header/HeaderRow.tsx (3 hunks)
  • src/Header/useCellResize.tsx (1 hunks)
  • src/Table.tsx (9 hunks)
  • src/VirtualTable/BodyGrid.tsx (3 hunks)
  • src/context/TableContext.tsx (2 hunks)
  • src/interface.ts (2 hunks)
  • tests/Resizable.spec.tsx (1 hunks)
💤 Files with no reviewable changes (1)
  • package.json
🧰 Additional context used
🧬 Code Graph Analysis (6)
src/Header/HeaderRow.tsx (1)
src/interface.ts (1)
  • ColumnType (108-124)
src/Header/HeaderCell.tsx (3)
src/Cell/index.tsx (1)
  • CellProps (19-58)
src/interface.ts (1)
  • Key (21-21)
src/Header/useCellResize.tsx (1)
  • useCellResize (7-153)
src/Body/MeasureRow.tsx (2)
src/interface.ts (1)
  • Key (21-21)
src/Body/MeasureCell.tsx (2)
  • MeasureCellProps (5-8)
  • MeasureCell (10-26)
src/Body/MeasureCell.tsx (2)
src/interface.ts (1)
  • Key (21-21)
src/Body/MeasureRow.tsx (1)
  • MeasureCellProps (6-10)
src/context/TableContext.tsx (1)
src/interface.ts (1)
  • Key (21-21)
src/Header/useCellResize.tsx (1)
src/interface.ts (1)
  • Key (21-21)
🔇 Additional comments (29)
src/FixedHolder/index.tsx (1)

112-112: 修复方向变更导致的滚动计算错误问题

这个修改解决了一个潜在的bug,在useEffect依赖数组中添加了direction。由于effect内部逻辑(92-98行)使用了direction变量来计算滚动行为,如果这个属性在组件挂载后动态改变,没有这个依赖项会导致滚动方向逻辑不正确。

修改后,当direction属性变化时,事件监听器会被正确地移除和重新添加,确保使用最新的方向值进行滚动计算。

src/Body/index.tsx (1)

28-28: 属性命名更改,使其更具描述性

onColumnResize重命名为onColumnWidthChange是一个好的改进,更准确地反映了此回调的用途 - 它在列宽度变化时被调用,而不仅仅是在调整大小操作期间。

这个更改在整个代码库中保持一致,使API更加直观且符合其实际功能。

Also applies to: 37-37, 106-106

src/VirtualTable/BodyGrid.tsx (1)

26-26:

✅ Verification successful

属性命名更改,使其更具描述性

同样,在VirtualTable/BodyGrid.tsx中也将onColumnResize重命名为onColumnWidthChange,保持了整个代码库的一致性。这个命名更好地描述了此回调的实际功能 - 在列宽度发生变化时通知相关组件。

Also applies to: 35-35, 73-73


🏁 Script executed:

#!/bin/bash
# 检查代码库中是否还有其他的onColumnResize未被替换,确保命名一致性

echo "检查是否还有任何遗漏的onColumnResize引用:"
rg "onColumnResize" --type=typescript --type=tsx

Length of output: 294


下面 rg--type=typescript 无效,我们改用扩展名过滤重新搜索:


🏁 Script executed:

#!/bin/bash
echo "再次检查是否还有遗漏的 onColumnResize 引用:"
rg "onColumnResize" -n -g '*.ts' -g '*.tsx'

Length of output: 1757


已验证命名一致性,无残留 onColumnResize 引用
已确认 onColumnResize 已全部替换为 onColumnWidthChange,代码库中无残留引用,命名保持一致,建议批准此次更新。

src/interface.ts (2)

56-56: 表格结构中添加了滚动条标记

通过在 CellType 接口的 column 属性中添加可选的 scrollbar 布尔标志,使单元格能够携带滚动条存在的元数据信息。这一改进有助于在 HeaderRow 中识别靠近滚动条的单元格,从而确保正确处理列宽调整功能。


120-120: 新增列宽可调整功能

ColumnType 接口添加了新的可选布尔属性 resizable,用于指示列是否支持调整大小。这与 PR 标题中提到的"feat: columnResizable"功能相符,为表格组件提供了重要的交互增强。

src/Header/HeaderRow.tsx (4)

13-13: 导入专用表头单元格组件

从通用的 Cell 组件切换到专用的 HeaderCell 组件导入,提高了代码的可读性和组件的专业化程度。这种变化符合关注点分离的原则,为表头单元格提供了更专业的实现。


62-64: 添加滚动条前单元格检测逻辑

添加了逻辑来确定单元格是否位于滚动条前面。这对于正确处理调整大小的行为至关重要,特别是在滚动条附近的单元格,确保用户体验的一致性。


67-67: 使用专用的表头单元格组件

从通用的 Cell 组件切换到专用的 HeaderCell 组件,与第13行的导入变更相对应。


78-81: 传递额外的列调整属性

HeaderCell 组件传递了重要的额外属性:

  • columnKey:列的唯一标识符
  • isScrollBarPreviousCell:指示此单元格是否位于滚动条之前
  • resizable:确定列是否可调整大小(对于滚动条列设置为 false)
  • minWidth:列的最小宽度

这些属性的传递确保了列宽调整功能的正确实现,特别是对于边缘情况(如滚动条附近的单元格)的处理。

src/Body/MeasureCell.tsx (3)

7-7: 更新回调函数名称以提高描述性

将属性从 onColumnResize 重命名为 onColumnWidthChange,使其更准确地描述回调函数的目的和行为。这符合 PR 目标中提到的"重命名内部事件处理程序以更好地区分其目的"。


10-10: 更新参数解构以匹配新的属性名

对函数参数解构进行相应更新,以使用新的属性名 onColumnWidthChange。这与第7行的接口变更保持一致。


15-15: 更新回调函数调用

将回调函数调用从 onColumnResize 更新为 onColumnWidthChange,保持了API的一致性,同时提高了代码的可读性和可维护性。

src/Body/MeasureRow.tsx (4)

8-8: 更新接口中的回调函数名称

MeasureCellProps 接口中的属性从 onColumnResize 更新为 onColumnWidthChange,使其更准确地描述回调的目的。这与 MeasureCell 组件中的更改保持一致,确保了整个代码库中命名的一致性。


12-16: 更新函数参数解构

更新组件参数解构以使用新的属性名 onColumnWidthChange,确保与接口定义保持一致。这种改变简单明了,保持了代码的一致性。


30-30: 更新批量调整大小回调中的函数调用

onBatchResize 处理函数中,将回调函数调用从 onColumnResize 更新为 onColumnWidthChange,保持了API的一致性。


36-40: 更新传递给 MeasureCell 的属性

将传递给 MeasureCell 子组件的属性从 onColumnResize 更新为 onColumnWidthChange,确保与子组件接口的一致性。这完成了组件树中属性传递的一致性更改。

assets/index.less (2)

58-60: 添加列宽调整时的光标样式

新增的 column-resizing 类可以在用户调整列宽时提供视觉反馈,设置鼠标为 col-resize 光标。这种交互设计符合用户期望。


102-102: 防止阴影元素干扰鼠标事件

添加 pointer-events: none 可以确保阴影元素不会干扰用户的鼠标交互,这是一个很好的改进。

src/Header/HeaderCell.tsx (2)

1-12: 组件接口设计合理

新增的 HeaderCell 组件接口设计合理,扩展了 CellProps 并添加了与列宽调整相关的必要属性。特别是 resizable 属性用于控制是否允许调整列宽,minWidth 用于限制最小宽度,这些设计很好地支持了列宽调整功能。


13-30: 实现简洁且功能完整

组件实现逻辑清晰:

  1. 从 props 中提取与列宽调整相关的属性
  2. 调用 useCellResize 钩子生成调整手柄节点
  3. 通过 appendNode 属性将调整手柄附加到基础 Cell 组件

这种实现方式保持了原有 Cell 组件的所有功能,同时优雅地添加了列宽调整能力。

src/context/TableContext.tsx (2)

60-60: 更准确的回调函数命名

onColumnResize 更名为 onColumnWidthChange 使其名称更加准确地反映了其功能 - 在列宽发生变化时触发回调。这符合 PR 的目标,使命名更加明确。


73-82: 增加必要的上下文属性支持列宽调整功能

新增的上下文属性合理且必要,用于支持列宽调整功能:

  • fullTableRef: 引用完整表格元素,用于定位调整线
  • colsWidthscolWidthscolsKeys: 跟踪列宽信息
  • onColumnResizeEnd: 提供列宽调整结束时的详细信息
  • onResizingChange: 通知调整状态变化

这些属性共同构成了完整的列宽调整功能所需的状态和回调机制。

src/Table.tsx (7)

129-133: 添加列宽调整结束回调接口

新增的 onColumnResizeEnd 回调提供了丰富的信息,包括调整后的列键、宽度以及所有列的宽度信息。这种设计允许消费者在列宽调整完成时执行必要的操作,增强了组件的可用性。


359-359: 跟踪列宽调整状态

添加 isResizing 状态可以跟踪列宽是否正在调整中,这对于提供视觉反馈和限制某些操作很有用。


363-364: 优化列键的记忆化逻辑

使用 join('_') 作为依赖项来记忆化 colsKeys 是一种优化方式,但需要注意列键中如果包含下划线可能导致意外的记忆化失效。

请考虑使用不太可能出现在列键中的分隔符,或使用其他记忆化策略:

-  const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys.join('_')]);
+  const colsKeys = React.useMemo(() => pureColsKeys, [pureColsKeys.join('|')]);

或者考虑使用更可靠的方式比较数组内容。


413-422: 更新回调函数命名,保持一致性

onColumnResize 改为 onColumnWidthChange,与上下文中的命名保持一致,增强了代码的可读性和可维护性。实现逻辑保持不变,仅是命名更新。


795-795: 添加调整时的样式类

当列宽调整进行时,添加 rc-table-column-resizing 类可以改变光标样式,提供视觉反馈,这与 CSS 文件中定义的样式配合良好。


866-872: 完善上下文值,支持列宽调整功能

扩展 TableContextValue 以包含所有与列宽调整相关的属性和回调,这确保了子组件可以访问所需的信息来实现列宽调整功能。


909-913: 更新依赖数组,确保上下文适当更新

依赖数组中增加了新的列宽调整相关属性,确保当这些值变化时上下文会重新计算,这对于维护组件的正确行为至关重要。

@afc163
Copy link
Member

afc163 commented May 14, 2025

看看 ai 的 review

@linxianxi
Copy link
Contributor Author

看看 ai 的 review

没问题,在对应的下面回复了,命名的话要改也可以改

@afc163 afc163 changed the title feat: columnResizable feat: support column.resizable May 14, 2025
Comment on lines +115 to +116
document.body.addEventListener('mousemove', onResize);
document.body.addEventListener('mouseup', onResizeEnd);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

start 前也可以先卸载一下。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

end 时、组件 unmount 的时候都有卸载了。start 前要卸载是什么情况下需要?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我担心一些情况下未触发 onDragEnd,比如拖到屏幕外 or iframe 外?

@@ -133,6 +133,7 @@ React.render(<Table columns={columns} data={data} />, mountNode);
| fixed | String \| Boolean | | this column will be fixed when table scroll horizontally: true or 'left' or 'right' |
| align | String | | specify how cell content is aligned |
| ellipsis | Boolean | | specify whether cell content be ellipsized |
| resizable | Boolean | | column resize |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
| resizable | Boolean | | column resize |
| resizable | Boolean | | set column to be resizable |

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants