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

React-bootstrap Table点击编辑按钮仅激活指定单元格输入框问题

问题解决:实现React-Bootstrap表格单行编辑功能

你当前的问题根源在于用布尔值editRow控制所有行的编辑状态,导致点击任意Edit按钮时,所有行都会同步切换为输入框模式。要实现仅单行编辑,只需将editRow改为存储当前编辑行的ID,而非简单的布尔值,具体修改步骤如下:


1. 修改状态变量定义

将editRow的初始值从false改为null,用来存储当前正在编辑的行ID:

const [grid, setGrid] = useState([])
const [editRow, setEditRow] = useState(null) // 改为存储编辑行ID,初始为null

2. 更新Edit函数逻辑

点击Edit按钮时,将当前行的ID存入editRow,而非设置为true:

function Edit(itemID) {
    setEditRow(itemID) // 传入当前行的ID,标记该行进入编辑状态
}

3. 调整表格行的渲染判断

在表格行循环中,新增isEditing变量判断当前行是否处于编辑状态,替换原有的editRow布尔判断:

<tbody>
{
    modifiedData.map((item, index) => {
        const isEditing = item.id === editRow // 判断当前行是否为编辑行
        return (
            <Fragment key={item.id}>
                <tr>
                    <td>{item.id}</td>
                    {/* 仅当前编辑行显示输入框,添加defaultValue填充原有数据 */}
                    <td>{isEditing ? <Form.Control type="text" defaultValue={item.name}/> : item.name}</td>
                    <td>{isEditing ? <Form.Control type="text" defaultValue={item.email}/> : item.email}</td>
                    <td>{isEditing ? <Form.Control as="textarea" defaultValue={item.comment}/> : item.comment}</td>
                    <td className="d-flex justify-content-md-evenly">
                        {/* 非编辑状态的行显示Delete按钮 */}
                        {
                            !isEditing &&
                            <Button
                                style={{width: "75px"}}
                                variant="danger"
                                onClick={() => Delete(index)}
                            >
                                Delete
                            </Button>
                        }
                        {/* 当前编辑行显示Save/Cancel,非编辑行显示Edit */}
                        {
                            isEditing ? <EditableCell cancelUpdate={cancelUpdate}/> :
                                <Button
                                    style={{width: "75px"}}
                                    className="ms-1"
                                    variant="secondary"
                                    onClick={() => Edit(item.id)}>
                                    Edit
                                </Button>
                        }
                    </td>
                </tr>
            </Fragment>
        )
    })
}
</tbody>

4. 修改EditableCell组件

接收父组件传入的取消编辑回调,点击Cancel时触发:

function EditableCell({ cancelUpdate }) { // 接收父组件的回调函数
    return (
        <>
            <Button
                style={{width: "75px"}}
                variant="secondary"
            >
                Save
            </Button>
            <Button
                style={{width: "75px"}}
                variant="warning"
                onClick={cancelUpdate}
            >
                Cancel
            </Button>
        </>
    )
}

5. 实现取消编辑函数

在父组件中添加cancelUpdate函数,点击Cancel时清空当前编辑行的标记:

function cancelUpdate() {
    setEditRow(null) // 退出编辑状态,清空当前编辑行ID
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:20:34