You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何获取表格的所有选中行数据?

解决表格选中项在父组件获取的问题

不用状态管理库的话,有几种React原生方案可以实现,最常用的是状态提升,另外还有用useRef的方式,具体如下:

方案一:状态提升(推荐)

把选中项的状态统一放在父组件TableComp中维护,子组件TableRowItem只负责接收选中状态和触发状态更新的回调,完全遵循React的单向数据流。

修改后的代码如下:

父组件 TableComp

import { useState } from 'react';

export default function TableComp() {
    // 用Set存储选中的item id(假设item有唯一id属性)
    const [selectedIds, setSelectedIds] = useState(new Set());

    // 处理子组件的选中状态切换
    const handleRowToggle = (itemId) => {
        setSelectedIds(prev => {
            const newSet = new Set(prev);
            newSet.has(itemId) ? newSet.delete(itemId) : newSet.add(itemId);
            return newSet;
        });
    };

    // 点击按钮时处理选中项
    function handleSelectedRows() {
        // 筛选出所有选中的条目
        const selectedItems = items.filter(item => selectedIds.has(item.id));
        console.log('选中的项:', selectedItems);
        // 在这里执行你的业务操作
    }

    return (
        <>
            <Table>
                ...
                {items.map(item => (
                    <TableRowItem 
                        key={item.id}
                        item={item}
                        isActive={selectedIds.has(item.id)}
                        onToggle={() => handleRowToggle(item.id)}
                    />
                ))}
            </Table>
            <Button onClick={handleSelectedRows}>处理选中项</Button>
        </>
    )
}

子组件 TableRowItem

function TableRowItem({item, isActive, onToggle}) {
    // 子组件不再维护自身选中状态,完全由父组件控制
    return (
        <TableRow onClick={onToggle} active={isActive}>...</TableRow>
    )
}

这种方式的优势是状态集中管理,逻辑清晰,父组件能随时获取最新选中状态,还能方便扩展全选、反选等功能。

方案二:使用useRef存储选中状态

如果你的场景不需要根据选中状态实时更新UI(仅在点击按钮时一次性获取选中项),可以用useRef在父组件中存储选中状态,子组件点击时直接更新ref内容:

父组件 TableComp

import { useRef } from 'react';

export default function TableComp() {
    // 用对象存储选中状态,键为item id,值为是否选中
    const selectedRef = useRef({});

    const handleRowToggle = (itemId) => {
        selectedRef.current[itemId] = !selectedRef.current[itemId];
    };

    function handleSelectedRows() {
        // 筛选出所有选中的条目
        const selectedItems = items.filter(item => selectedRef.current[item.id]);
        console.log('选中的项:', selectedItems);
        // 执行你的业务操作
    }

    return (
        <>
            <Table>
                ...
                {items.map(item => (
                    <TableRowItem 
                        key={item.id}
                        item={item}
                        onToggle={() => handleRowToggle(item.id)}
                    />
                ))}
            </Table>
            <Button onClick={handleSelectedRows}>处理选中项</Button>
        </>
    )
}

子组件 TableRowItem

import { useState } from 'react';

function TableRowItem({item, onToggle}) {
    // 子组件自身维护选中状态用于UI展示
    const [active, setActive] = useState(false);

    function handleClick() {
        const newActive = !active;
        setActive(newActive);
        onToggle(item.id); // 通知父组件更新ref
    }

    return (
        <TableRow onClick={handleClick} active={active}>...</TableRow>
    )
}

这种方式的缺点是ref更新不会触发组件重渲染,父组件无法实时感知选中状态变化,仅适合不需要实时同步UI的场景。

总结

优先选择状态提升方案,它符合React设计理念,代码可维护性高;如果是特殊场景(无需实时同步UI),可以考虑useRef的方式。

内容的提问来源于stack exchange,提问作者Catherine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:12:09