Skip to content

fix(table): stop forcing selectedRowKeys on non-tree EnhancedTable - #4481

Open
lnuxe wants to merge 1 commit into
Tencent:developfrom
lnuxe:fix/enhanced-table-non-tree-select
Open

lnuxe wants to merge 1 commit into
Tencent:developfrom
lnuxe:fix/enhanced-table-non-tree-select

Conversation

@lnuxe

@lnuxe lnuxe commented Nov 12, 2026

Copy link
Copy Markdown

🤔 这个 PR 的性质是?

  • 日常 bug 修复

🔗 相关 Issue

无(本 PR 直接修复非树形 EnhancedTable 的行选中失效)

📝 描述

EnhancedTable 无条件把 selectedRowKeys 传给 PrimaryTable:

selectedRowKeys: isTreeData ? innerSelectedRowKeys : props.selectedRowKeys || [],

useControlled 用 Reflect.has(props, 'selectedRowKeys') 判断是否受控。因为 key 恒存在,表格永远被当成受控——而非树形数据时这个值恒为 []。点击行复选框会触发 onSelectChange,但勾选状态永远回不来,复选框永远不勾上。

文档明确 EnhancedTable 包含 PrimaryTable 的全部功能,非树形用法是合法的。

改动

只在树形数据时传这个 key,非树形时让 PrimaryTable 走自己的非受控逻辑:

-    selectedRowKeys: isTreeData ? innerSelectedRowKeys : props.selectedRowKeys || [],
+    // 非树形数据时不要覆盖 selectedRowKeys:该 key 恒存在会让 useControlled 判定为受控
+    ...(isTreeData ? { selectedRowKeys: innerSelectedRowKeys } : {}),

🔍 自测

修复前(还原 EnhancedTable.tsx 后跑新测试):

× EnhancedTable > scenarios > select > checks the row checkbox for non-tree data
  → expected 't-checkbox' to contain 't-is-checked'
Tests  1 failed (1)

修复后:

✓ EnhancedTable > scenarios > select > checks the row checkbox for non-tree data
✓ EnhancedTable > scenarios > select > still reports the selection through onSelectChange
Tests  2 passed (2)

第二个用例确认 onSelectChange 仍然正常回传选中行,修复没有把事件一起关掉。

回归:

npx vitest run packages/components/table
Test Files  5 passed (5)
     Tests  51 passed (51)

✅ 贡献者检查

  • 我的代码遵循这个项目的代码风格
  • 我已经自己检查了自己的代码
  • 我已经添加了必要的测试
  • 我已经在本地通过了所有测试

EnhancedTable always passed a selectedRowKeys prop to the inner Table:

    selectedRowKeys: isTreeData ? innerSelectedRowKeys : props.selectedRowKeys || [],

The key is present on every render, so useControlled treats the table as
controlled even when the caller never passed selectedRowKeys. Row selection
then never updates internally and clicking a checkbox does nothing.

Only pass the prop in the tree case, where the value is genuinely owned by
EnhancedTable.

Verified:
- new test fails on the previous implementation
  (expected 't-checkbox' to contain 't-is-checked')
- new test passes with the fix
- table: 53 tests pass
@lnuxe
lnuxe force-pushed the fix/enhanced-table-non-tree-select branch from 8bca04a to c4ec3d2 Compare November 13, 2026 03:04
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.

1 participant