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 相关文章推荐
Dom操作之兼容技巧分享
Sep 20 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 Javascript
JavaScript版TAB选项卡效果实例
Aug 16 Javascript
Javascript学习指南
Dec 01 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 Javascript
JS实现简单的二维矩阵乘积运算
Jan 26 Javascript
对javascript继承的理解
Oct 11 Javascript
jquery删除数组中重复元素
Dec 05 Javascript
微信小程序实现漂亮的弹窗效果
May 26 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 Javascript
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 Javascript
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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
PHP5.2下preg_replace函数的问题
2015/05/08 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python中正则表达式的详细教程
2015/04/30 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
Python程序暂停的正常处理方法
2019/11/07 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
python Zmail模块简介与使用示例
2020/12/19 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
《雨霖铃》教学反思
2014/02/22 职场文书
大学军训感言1000字
2014/02/25 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
保健品市场营销方案
2014/03/31 职场文书
2014中考励志标语
2014/06/05 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
党员剖析材料范文
2014/12/18 职场文书
情感电台广播稿
2015/08/18 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python