react中useState的使用:实现在当前表格直接更改数据

需求:用户点击修改按钮时直接在弹出框的当前页面内直接再次修改点击行相关信息:
在这里插入图片描述
效果如下:
在这里插入图片描述
点击修改当事人信息时,直接将当前改为输入框,并将信息展示,同时操作栏内的内容变为保存和取消;
具体做法:
我这里是使用的antd组件内的可编辑表格;当然原生的也可以做,以前也做过;
这里的关键是点击修改按钮时,令当前行的表格变为输入框,并展示数据;
给数据每一项加上 editable: true属性,并通过该属性控制 渲染的是数据还是可修改的输入框
这里是使用的useState()方法来进行状态控制的;

  • 关于 useState 的用法是,需要传入一个参数作为状态的初始值,当函数执行后会返回两个值,一个是当前状态的属性,一个是修改状态的方法
  • 使用方法更新数据后会触发render()重新渲染数据
 const [editingKey, setEditingKey] = useState('');
    // 是否正在修改
    const isEditing = (record: Item) => record.key === editingKey;
    // 修改按钮
    const edit = (record: Item) => {
        form.setFieldsValue({ ...record });
        setEditingKey(record.key);
    };
    // 取消
    const cancel = () => {
        setEditingKey('');
    };
    // 保存
    const save = async (id: React.Key) => {
        try {
            const row = (await form.validateFields())
            console.log('row', row)
            row.id = id
            onSave(row)
            setEditingKey('');
        } catch (err) {
            console.log(err)
        }
    };

我这里给useState一个初始值为空,点击修改后使用setEditingKey()方法(useState返回的方法)将useState数据的值赋值为当前行的唯一key值,这样二者相等,就可以区别点击的是哪一条数据的按钮了;点击取消setEditingKey(’’)重新置空;

判断逻辑:

 // 是否正在修改
    const isEditing = (record: Item) => record.key === editingKey;

渲染数据前进行判断:

 const mergedColumns = columns.map(col => {
        if (!col.editable) {
            return col;
        }
        return {
            ...col,
            onCell: (record: Item) => ({
                record,
                dataIndex: col.dataIndex,
                title: col.title,
                editing: isEditing(record),
            }),
        };
    });

根据数据状态判断渲染的是表格合适输入框:

const EditableCell: React.FC<EditableCellProps> = ({
    editing,
    dataIndex,
    title,
    record,
    index,
    children,
    ...restProps
}) => {
    return (
        <td {...restProps}>
            {editing ? (
                <Form.Item
                    name={dataIndex}
                    style={{ margin: 0 }}
                    rules={[
                        {
                            required: true,
                            message: `请填写${title}!`,
                        },
                    ]}
                >
                    <Input />
                </Form.Item>
            ) : (
                    children
                )}
        </td>
    );
};

导出:

 return (
        <Form form={form} component={false}>
            <Table
                components={{
                    body: {
                        cell: EditableCell,
                    },
                }}
                bordered
                pagination={false}
                dataSource={dataSource}
                {...otherProps}
                columns={mergedColumns}
                rowClassName="editable-row"
            />
        </Form>
    );

其中dataSource为数据源,
在这里插入图片描述
功能实现;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果没有后端接口,而是直接给了数据,那么可以在前端使用 mock 数据来模拟接口请求,然后将数据渲染到表格。下面是一个使用 React 和 Ant Design 制作查询表格的示例代码: ```jsx import React, { useState } from 'react'; import { Table, Input, Button } from 'antd'; const data = [ { id: 1, name: '张三', age: 18, gender: '男' }, { id: 2, name: '李四', age: 20, gender: '女' }, { id: 3, name: '王五', age: 22, gender: '男' }, { id: 4, name: '赵六', age: 24, gender: '女' }, ]; function SearchTable() { const [searchText, setSearchText] = useState(''); const [searchedColumn, setSearchedColumn] = useState(''); const [dataSource, setDataSource] = useState(data); const handleSearch = (selectedKeys, confirm, dataIndex) => { confirm(); setSearchText(selectedKeys[0]); setSearchedColumn(dataIndex); }; const handleReset = clearFilters => { clearFilters(); setSearchText(''); }; const getColumnSearchProps = dataIndex => ({ filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( <div style={{ padding: 8 }}> <Input placeholder={`Search ${dataIndex}`} value={selectedKeys[0]} onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])} onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)} style={{ width: 188, marginBottom: 8, display: 'block' }} /> <Button type="primary" onClick={() => handleSearch(selectedKeys, confirm, dataIndex)} icon="search" size="small" style={{ width: 90, marginRight: 8 }} > Search </Button> <Button onClick={() => handleReset(clearFilters)} size="small" style={{ width: 90 }}> Reset </Button> </div> ), filterIcon: filtered => ( <Icon type="search" style={{ color: filtered ? '#1890ff' : undefined }} /> ), onFilter: (value, record) => record[dataIndex] .toString() .toLowerCase() .includes(value.toLowerCase()), onFilterDropdownVisibleChange: visible => { if (visible) { setTimeout(() => this.searchInput.select()); } }, render: text => searchedColumn === dataIndex ? ( <Highlighter highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }} searchWords={[searchText]} autoEscape textToHighlight={text.toString()} /> ) : ( text ), }); const columns = [ { title: 'ID', dataIndex: 'id', sorter: (a, b) => a.id - b.id, ...getColumnSearchProps('id'), }, { title: '姓名', dataIndex: 'name', sorter: (a, b) => a.name.localeCompare(b.name), ...getColumnSearchProps('name'), }, { title: '年龄', dataIndex: 'age', sorter: (a, b) => a.age - b.age, ...getColumnSearchProps('age'), }, { title: '性别', dataIndex: 'gender', sorter: (a, b) => a.gender.localeCompare(b.gender), ...getColumnSearchProps('gender'), }, ]; return <Table dataSource={dataSource} columns={columns} />; } export default SearchTable; ``` 这里的 `data` 变量存储了我们需要展示的数据,可以根据际情况进行修改。在 `SearchTable` 组件,我们使用了 `useState` hook 来管理搜索框的状态和数据源,`getColumnSearchProps` 函数用于生成带搜索功能的列配置。最后,我们将数据源和列配置传递给 `Table` 组件即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值