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 有趣而诡异的数组
Apr 06 Javascript
jquery控制listbox中项的移动并排序
Nov 12 Javascript
使用 js+正则表达式为关键词添加链接
Nov 11 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
vue-router 学习快速入门
Mar 01 Javascript
JavaScript调试之console.log调试的一个小技巧分享
Aug 07 Javascript
Javascript中 toFixed四舍六入方法
Aug 21 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
May 08 Javascript
使用angular-cli webpack创建多个包的方法
Oct 16 Javascript
详解VSCode配置启动Vue项目
May 14 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 jQuery
微信小程序授权登陆及每次检查是否授权实例代码
Sep 18 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
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python中标准模块importlib详解
2017/04/16 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
python定义类的简单用法
2020/07/24 Python
python跨文件使用全局变量的实现
2020/11/17 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
荷兰超市:DEEN
2018/03/14 全球购物
护士感人事迹
2014/05/01 职场文书
任命书格式
2014/06/05 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
历史博物馆观后感
2015/06/05 职场文书
村主任当选感言
2015/08/01 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
SQL基础的查询语句
2021/11/11 MySQL