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 09 Javascript
javascript自定义右键弹出菜单实现方法
May 25 Javascript
jquery判断输入密码两次是否相等
Apr 22 Javascript
js 获取站点应用名的简单实例
Aug 18 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
Angular2 PrimeNG分页模块学习
Jan 14 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
Apr 25 Javascript
checkbox:click事件触发span元素内容改变的方法
Sep 11 Javascript
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
解决vue项目使用font-awesome,build后路径的问题
Sep 01 Javascript
用Golang运行JavaScript的实现示例
Nov 25 Javascript
vue使用require.context实现动态注册路由
Dec 25 Vue.js
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
php 函数使用方法与函数定义方法
2010/05/09 PHP
PHP函数microtime()用法与说明
2013/12/04 PHP
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
2020/09/22 Javascript
详解Python3.6的py文件打包生成exe
2018/07/13 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
服装设计专业毕业生推荐信
2013/11/09 职场文书
消防安全汇报材料
2014/02/08 职场文书
办公室副主任职责范本
2014/03/08 职场文书
开学典礼主持词
2014/03/19 职场文书
买房协议书
2014/04/11 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
七一建党日演讲稿
2014/09/05 职场文书
三方股份合作协议书
2014/10/13 职场文书
刑事撤诉申请书
2015/05/18 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书