React结合antd实现表格的增删改查

前言

初次接触react,通过学习react官方文档、学习B站上“张sir手摸手带你学前端”这位老师的视频,采用 React + Antd + JavaScript + axios ,终于完成了简单Table的增删改查功能

新建一个 CRUDDemo.js 的文件,插入完成代码,在 App.js 中引入 CRUDDemo.js,并下载好 axios、antd 等需要用到的库,然后就可以启动项目啦

importTablefrom'./CRUDDemo';


1. 使用axios读取数据

```javascript

//读取数据——get

readData() {

        axios.get('http://....你的url')

            .then(res => {

                // console.log('调用成功')

                this.setState({

                    data: res.data,

                })

                res.data.forEach((r, i) => {

                    r.key = i;

                });

            }).catch(error => {

                console.log(error)

            })

    }

```


2. 新增数据

```javascript

//实现新增数据——post

postData = () => {

        axios.post('http://....你的url', {

            name: this.state.name,

            age: this.state.age,

            sex: this.state.sex,

            address: this.state.address,

            phone: this.state.phone

        }).then(res => {

            message.success('添加成功');

            // console.log('添加成功')

            this.readData()

            this.setState({

                visible: false

            });

        }).catch(error => {

            message.error("按照格式要求输入")

        });

        this.formRef.current.resetFields() //新增成功后清空输入框中的数据,避免下次点击新增时出现上次输入的数据

    }

```


3. 删除数据

```javascript

//实现删除数据——delete

deleteData = (id) => {

//id前面的 / 不能省略,这里使用反引号

        axios.delete(`http://...你的url/${id}`)

            .then(res => {

                message.success('删除成功');

                // console.log('删除成功')

                this.readData()

            })

    };

```


4. 修改数据

```javascript

//实现修改数据——put或patch

    updateData = () => {

    //rowid前面的 / 不能省略,这里使用反引号

    axios.patch(`http:....你的url/${this.state.rowid}`, {

            name: this.state.name,

            age: this.state.age,

            sex: this.state.sex,

            address: this.state.address,

            phone: this.state.phone

        }).then(res => {

            message.success('修改成功');

            // console.log('修改成功')

            this.readData()

            this.setState({

                visible1: false

            });

        }).catch(error => {

            message.error("按照格式要求输入")

        })

        this.formRef1.current.resetFields() //修改成功后清空输入框中的数据

    }

```


5. 查询数据

```javascript

//实现按照姓名查询数据

    queryfn = (e) => {

        let keyword = e.target.value

        clearTimeout(window.timer)  //防抖查询

        window.timer = setTimeout(() => {

            let data = this.state.data.filter(r => r.name === keyword)

            if (data.length !== 0) {

                this.setState({

                    data

                })

            }

        }, 500)

    }

```


完整代码

```javascript

import './App.css';

import React, { Component } from 'react';

import { Space, Table, Popconfirm, Button, Input, Divider, Form, Drawer, message } from 'antd';

import axios from 'axios';

class CRUDDemo extends Component {

    formRef = React.createRef() //清空输入框内容

    formRef1 = React.createRef()

    constructor(props) {

        super(props);

        this.state = {

            visible: false,

            visible1: false,

            rowid: null,

            columns: [

                { title: '姓名', dataIndex: 'name', key: 'name', },

                { title: '性别', dataIndex: 'sex', key: 'sex', },

                { title: '年龄', dataIndex: 'age', key: 'age', },

                { title: '家庭住址', dataIndex: 'address', key: 'address', },

                { title: '联系电话', dataIndex: 'phone', key: 'phone' },

                {

                    title: '操作',

                    key: 'action',

                    render: (_, record) => (

                        <Space size="middle">

                            <a className="action-link" onClick={this.showDrawer1.bind(this, record)}>修改</a>

                            <Popconfirm title="确定要删除吗?" onConfirm={this.deleteData.bind(this, record.id)} onCancel={this.onClose.bind(this)} okText="确定" cancelText="取消" >

                                <a className="action-link" style={{ color: record.obsoleted ? '#1890ff' : '#fa8c16' }} >删除</a>

                            </Popconfirm>

                        </Space>

                    ),

                },

            ],

            data: [], //储存axios获取到的数据

        }

    }


    //关闭新增信息对话框

    onClose = () => {

        this.setState({

            visible: false

        });

        message.error('取消操作');

    };

    //关闭修改信息对话框

    onClose1 = () => {

        this.setState({

            visible1: false

        });

        message.error('取消操作');

    };

    //显示新增信息抽屉

    showDrawer = () => {

        this.setState({

            visible: true

        });

    };

    //显示修改信息抽屉

    showDrawer1 = (r) => {

        this.setState({

            visible1: true,

            rowid: r.id,       

        })

        setTimeout(() => {this.formRef1.current.setFieldsValue(r) }, 0);}; //设置 0 毫秒延迟回显数据


    //将数据显示在初始页面

    componentDidMount() {

        this.readData()

    }


    //实现读取数据——————get

    readData() {

        axios.get('http://....你的url')

            .then(res => {

                // console.log('调用成功')

                this.setState({

                    data: res.data,

                })

                res.data.forEach((r, i) => {

                    r.key = i;

                });

            }).catch(error => {

                console.log(error)

            })

    }


    //新增信息时的Input输入框事件

    handleChange = (e) => {

        this.setState({

            [e.target.id]: e.target.value

        })

    }

    //修改信息时的Input输入框事件

    handleChange1 = (e) => {

        this.setState({

            [e.target.id]: e.target.value

        })

    }


    //新增数据——————post

    //新增、修改数据时提交失败时的提示信息

    onFinishFailed = (errorInfo) => {

        console.log('Failed:', errorInfo);

        message.error("按照格式要求输入")

    };


    postData = () => {

        axios.post("http://....你的url", {

            name: this.state.name,

            age: this.state.age,

            sex: this.state.sex,

            address: this.state.address,

            phone: this.state.phone

        }).then(res => {

            message.success('添加成功');

            // console.log('添加成功')

            this.readData()

            this.setState({

                visible: false

            });

        }).catch(error => {

            message.error("按照格式要求输入")

        });

        this.formRef.current.resetFields() //新增成功后清空输入框中的数据,避免下次点击新增时出现上次输入的数据

    }


    // // 实现删除————————delete

    deleteData = (id) => {

        axios.delete(`http://....你的url/${id}`) //id前面的 / 不能省略

            .then(res => {

                message.success('删除成功');

                // console.log('删除成功')

                this.readData()

            })

    };


    //实现按照姓名查询数据

    queryfn = (e) => {

        let keyword = e.target.value

        clearTimeout(window.timer)  //防抖查询

        window.timer = setTimeout(() => {

            let data = this.state.data.filter(r => r.name === keyword)

            if (data.length !== 0) {

                this.setState({

                    data

                })

            }

        }, 500)

    }


    //实现修改数据——put或patch

    updateData = () => {

        axios.patch(`http://....你的url/${this.state.rowid}`, {

            name: this.state.name,

            age: this.state.age,

            sex: this.state.sex,

            address: this.state.address,

            phone: this.state.phone

        }).then(res => {

            message.success('修改成功');

            // console.log('修改成功')

            this.readData()

            this.setState({

                visible1: false

            });

        }).catch(error => {

            message.error("按照格式要求输入")

        })

        this.formRef1.current.resetFields() //修改成功后清空输入框中的数据

    }


    render() {

        let data = this.state.data;

        let columns = this.state.columns;

        let { name, age, sex, address, phone } = this.state;

        return (

            <div className="App">

                <Button type="primary" onClick={this.showDrawer.bind(this)} >添加信息 </Button>

                <Input placeholder="请根据姓名查找信息" style={{ marginLeft: '10px', width: '20%' }} onInput={this.queryfn} />

                <Divider plain>人员信息表格</Divider>

                <Table columns={columns} dataSource={data} >  </Table>

                <Drawer title="添加个人信息" onClose={this.onClose} visible={this.state.visible}>

                    <Form ref={this.formRef} onFinish={this.postData} onFinishFailed={this.onFinishFailed} autoComplete="off" >

                        <Form.Item

                            name="name"

                            label="姓名"

                            rules={[{ required: true, message: '请输入您的姓名', }, ] } >

                            <Input placeholder="请输入您的姓名" id="name" value={name} onChange={this.handleChange} pattern="[\u4e00-\u9fa5]{2,6}$" title='输入2-6位中文汉字'/>

                        </Form.Item>

                        <Form.Item

                            name="sex"

                            label="性别"

                            rules={[{ required: true, message: '请输入您的性别', },]}  >

                            <Input placeholder="请输入您的性别" id="sex" value={sex} onChange={this.handleChange} pattern="^[男|女]{1}$" title='输入男或女' />

                        </Form.Item>

                        <Form.Item

                            name="age"

                            label="年龄"

                            rules={[{ required: true, message: '请输入您的年龄', },]} >

                            <Input placeholder="请输入您的年龄" id="age" value={age} onChange={this.handleChange} pattern="^(?:[1-9][0-9]?|1[01][0-9]|120)$" title='输入1-120之间的数字'/>

                        </Form.Item>

                        <Form.Item

                            name="address"

                            label="家庭住址"

                            rules={[{ required: true, message: '请输入您的家庭住址', },]} >

                            <Input placeholder="请输入您的家庭住址" id="address" value={address} onChange={this.handleChange} pattern="[\u4e00-\u9fa5]{1,100}$" title='输入有效中文汉字'/>

                        </Form.Item>

                        <Form.Item

                            name="phone"

                            label="联系电话"

                            rules={[{ required: true, message: '请输入您的联系电话', },]} >

                            <Input placeholder="请输入11位联系电话" id="phone" value={phone} onChange={this.handleChange} pattern="^1[0-9]{10}$" title='输入1开头的11位有效手机号'/>

                        </Form.Item>

                        <Button onClick={this.onClose.bind(this)}>取消</Button>

                        <Button  htmlType="submit" type="primary">完成 </Button>

                    </Form>

                </Drawer>

                <Drawer title="修改个人信息" onClose={this.onClose1} visible={this.state.visible1}>

                    <Form ref={this.formRef1} onFinish={this.updateData} onFinishFailed={this.onFinishFailed} autoComplete="off" >

                        <Form.Item

                            name="name"

                            label="姓名"

                            rules={[{ required: true, message: '请输入您的姓名', },]}    >

                            <Input placeholder="请输入您的姓名" id="name" value={name} onChange={this.handleChange1} pattern="[\u4e00-\u9fa5]{2,6}$" title='输入2-6位中文汉字'/>

                        </Form.Item>

                        <Form.Item

                            name="sex"

                            label="性别"

                            rules={[{ required: true, message: '请输入您的性别', },]}  >

                            <Input placeholder="请输入您的性别" id="sex" value={sex} onChange={this.handleChange1} pattern="^[男|女]{1}$" title='输入男或女'/>

                        </Form.Item>

                        <Form.Item

                            name="age"

                            label="年龄"

                            rules={[{ required: true, message: '请输入您的年龄', },]} >

                            <Input placeholder="请输入您的年龄" id="age" value={age} onChange={this.handleChange1} pattern="^(?:[1-9][0-9]?|1[01][0-9]|120)$" title='输入1-120之间的数字'/>

                        </Form.Item>

                        <Form.Item

                            name="address"

                            label="家庭住址"

                            rules={[{ required: true, message: '请输入您的家庭住址', },]}  >

                            <Input placeholder="请输入您的家庭住址" id="address"  onChange={this.handleChange1} pattern="[\u4e00-\u9fa5]{1,100}$" title='输入有效中文汉字'/>

                        </Form.Item>

                        <Form.Item

                            name="phone"

                            label="联系电话"

                            rules={[{ required: true, message: '请输入您的联系电话', },]} >

                            <Input placeholder="请输入11位联系电话" id="phone" value={phone} onChange={this.handleChange1}  pattern="^1[0-9]{10}$" title='输入1开头的11位有效手机号'/>

                        </Form.Item>

                        <Button onClick={this.onClose1.bind(this)}>取消</Button>

                        <Button  htmlType="submit" type="primary">完成 </Button>

                    </Form>

                </Drawer>

            </div>

        );

    }

}

export default CRUDDemo;

```


效果图示

完整页面

新增信息

修改信息

删除信息

查询信息

本文为原创,转载请注明出处

参考资料

我的CSDN博客地址【React+antd】React结合antd实现表格的增删改查_qq_46105844的博客-CSDN博客

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容