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 相关文章推荐
JS中判断null、undefined与NaN的方法
Mar 24 Javascript
$(document).ready(function() {})不执行初始化脚本
Jun 19 Javascript
使用Javascript写的2048小游戏
Nov 25 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
Dec 16 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
JS原型与原型链的深入理解
Feb 15 Javascript
JS实现图片放大镜插件详解
Nov 06 Javascript
JavaScript引用类型RegExp基本用法详解
Aug 09 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
Jan 27 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 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
日本十大惊悚动漫
2020/03/04 日漫
基于php无限分类的深入理解
2013/06/02 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
jQuery之网页换肤实现代码
2011/04/30 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
理解JS绑定事件
2016/01/19 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
python 全局变量的import机制介绍
2017/09/07 Python
Python常用的json标准库
2019/02/19 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Python csv模块使用方法代码实例
2019/08/29 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Python @property原理解析和用法实例
2020/02/11 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
大一自我鉴定范文
2013/10/04 职场文书
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
春节联欢会策划方案
2014/05/16 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
学校会议通知范文
2015/04/15 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript
nginx rewrite功能使用场景分析
2022/05/30 Servers