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

Grommet DataTable如何实现单选,自定义选中逻辑出现双击问题如何解决

Grommet DataTable单选功能实现及双击选中异常修复

Grommet的DataTable组件是否内置了仅允许单选或多选的能力?我自行编写了useState处理选中逻辑,在赋值选中数组前先清空原有内容,但出现了需要用户双击才能选中的异常问题:当选中数组长度大于1时,点击操作会先将选中数组设为[],导致用户需要再次点击才能完成选中。

最初的实现代码如下:

import React from "react";
import ReactDOM from "react-dom";
import {Grommet, DataTable, Text, Meter, Box} from 'grommet';


const GridExample = () => {
    const [select, setSelect] = React.useState([])

    function handleRowSelect(selection) {
        console.log(`You picked ${selection}`);
        if (selection.length > 1) {
            setSelect(selection[selection.length - 1].toArray)
        } else {
            setSelect(selection)
        }

    }

    return (
        <Grommet>
            <DataTable
                select={select}
                onSelect={handleRowSelect}
                columns={[
                    {
                        property: 'name',
                        search: true,
                        header: <Text>Name</Text>,
                        primary: true,
                    },
                    {
                        property: 'percent',
                        search: true,
                        header: 'Complete',
                        render: datum => (
                            <Box pad={{vertical: 'xsmall'}}>
                                <Meter
                                    values={[{value: datum.percent}]}
                                    thickness="small"
                                    size="small"
                                />
                            </Box>
                        ),
                    },
                ]}
                data={[
                    {name: 'Alan', percent: 20},
                    {name: 'Bryan', percent: 30},
                    {name: 'Chris', percent: 40},
                    {name: 'Eric', percent: 80},
                ]}
            />
            <Text>Selected: {select}</Text>
        </Grommet>
    )
}

export default GridExample;

ReactDOM.render(
    <GridExample/>,
  document.getElementById("root")
);

修复方案

Grommet DataTable默认支持多选能力,要实现单选无需修改组件内置属性,只需调整onSelect回调的选中数组处理逻辑即可,原问题的双击异常是选中项取值逻辑错误导致的,使用slice方法截取最后一个选中项即可解决问题,修复后的代码如下:

function handleRowSelect(selection) {
    if (selection.length > 1) {
        setSelect(selection.slice(-1))
    } else {
        setSelect(selection)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:00:03