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 相关文章推荐
ASP SQL防注入的方法
Dec 25 Javascript
基于Jquery的简单图片切换效果
Jan 06 Javascript
javascript 内存回收机制理解
Jan 17 Javascript
js对字符的验证方法汇总
Feb 04 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
浅谈jQuery为哪般去掉了浏览器检测
Aug 29 Javascript
jQuery获取选中单选按钮radio的值
Dec 27 Javascript
jQuery实现简单的手风琴效果
Apr 17 jQuery
实例详解Vue项目使用eslint + prettier规范代码风格
Aug 20 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 Javascript
JavaScript编写开发动态时钟
Jul 29 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
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
Python中字符串的格式化方法小结
2016/05/03 Python
简单实现python聊天程序
2018/04/01 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
20年同学聚会邀请函
2014/02/04 职场文书
物流专业自荐信
2014/05/23 职场文书
人力资源求职信
2014/05/25 职场文书
2014年科普工作总结
2014/12/06 职场文书
老乡聚会通知
2015/04/23 职场文书
卫生主题班会
2015/08/14 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP