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


Posted in Javascript onAugust 05, 2022

如何实现在当前表格直接更改数据

需求

用户点击修改按钮时直接在弹出框的当前页面内直接再次修改点击行相关信息:

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

效果如下

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为数据源,

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

功能实现。

useState修改对象的字段

首先定义一个空对象

const [dataSelect, setDataSelect] = React.useState({})

给这个对象附上不同值,但不会把原来的覆盖的掉

const select = (e, item, type) => {
    const data = { ...dataSelect }
    if (type == 'price') {
      setSelectNO(e)
      data.min_price = item.min_price
      data.max_price = item.max_price
      setDataSelect(data)
      console.log(data)
      return
    }
    if (type == 'optionsCity') {
      setCity(e)
      data.city = item.text
      setDataSelect(data)
      console.log(data)
      return
    }
  }

原理用一个第三方的值,作为中间变量。每次都是附上最新的data。

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 对象的定义方法
Jan 10 Javascript
什么是json和jsonp,jQuery json实例详详细说明
Dec 11 Javascript
浅析JavaScript中的delete运算符
Nov 30 Javascript
JavaScript 事件绑定及深入
Apr 13 Javascript
js基于cookie方式记住返回页面用法示例
May 27 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
Jan 16 Javascript
JavaScript中递归实现的方法及其区别
Sep 12 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 Javascript
vue实现的下拉框功能示例
Jan 29 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 jQuery
pnpm对npm及yarn降维打击详解
Aug 05 #Javascript
JS前端可视化canvas动画原理及其推导实现
Aug 05 #Javascript
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 #Javascript
JS前端canvas交互实现拖拽旋转及缩放示例
Aug 05 #Javascript
canvas 中如何实现物体的框选
Aug 05 #Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 #Javascript
前端canvas中物体边框和控制点的实现示例
Aug 05 #Javascript
You might like
实用函数10
2007/11/08 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
简单实现PHP留言板功能
2016/12/21 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python编程之属性和方法实例详解
2015/05/19 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
总经理秘书的岗位职责
2013/12/27 职场文书
企业车辆管理制度
2014/01/24 职场文书
计算机专业求职信
2014/06/02 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
微信小程序实现录音Record功能
2021/05/09 Javascript
Python爬取某拍短视频
2021/06/11 Python