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第一课
Feb 27 Javascript
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
文本框只能选择数据到文本框禁止手动输入
Nov 22 Javascript
JavaScript实现的经典文件树菜单效果
Sep 08 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
Mar 30 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
JavaScript实现显示函数调用堆栈的方法
Apr 21 Javascript
vue.js入门教程之基础语法小结
Sep 01 Javascript
layui表格内放置图片,并点击放大的实例
Sep 10 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
Nov 01 Javascript
linux服务器快速卸载安装node环境(简单上手)
Feb 22 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
实用函数3
2007/11/08 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
python文字转语音实现过程解析
2019/11/12 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
python 实现控制鼠标键盘
2020/11/27 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
致铅球运动员广播稿精选
2014/01/12 职场文书
洗手间标语
2014/06/23 职场文书
小学四年级学生评语
2014/12/26 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL