效果图:

目录结构:(目分为主页面BookTable,以及两个组件,表格组件和添加书籍组件)

主页面:主要是将两个组件引入进页面,并将添加书籍事件、删除书籍事件传递给子组件,由子组件触发。

import styles from './index.less';
import React, { useState, useEffect } from 'react';
import {PageContainer} from '@ant-design/pro-components';
import BookList from '@/components/BookTable/index';
import AddBook from '@/components/AddBook/index';
import {DataType} from '@/components/BookTable';
import {BookType} from '@/components/AddBook';
import {cloneDeep} from 'lodash';
const BookTable: React.FC = () => {const [tableData, setTableData] = useState<DataType[]>([{id:1,title:'水浒传',author:'施耐庵',price:'30'},{id:2,title:'西游记',author:'罗贯中',price:'20'},{id:3,title:'红楼梦',author:'曹雪芹',price:'23'}]);function deleteBook(obj:DataType){const data:DataType[]= tableData.filter((item:DataType) => item.id !== obj.id);setTableData(data);}function addBook(obj:BookType){const addObj:DataType={id: tableData.length? tableData[tableData.length - 1]?.id + 1: 1,...obj}const data:DataType[]=cloneDeep(tableData);data.push(addObj)setTableData(data)}return (<PageContainer ghost>//可以去掉,不是必须的<div className={styles.container}><BookList tableData={tableData} deleteBook={deleteBook}/><AddBook addBook={addBook}/></div></PageContainer>);
};export default BookTable;

表格组件:

import React, { useState } from 'react'
import type { ColumnsType } from 'antd/es/table';
import {Table,Button} from 'antd'export interface DataType {id: number;title: string;author: string;price: string;
}interface BookTableProps{tableData:DataType[],deleteBook:Function
}const BookTable: React.FC<BookTableProps> = (props) => {const {tableData,deleteBook}=props;const columns: ColumnsType<DataType> = [{title: '书名',dataIndex: 'title',key: 'title',},{title: '作者',dataIndex: 'author',key: 'author',},{title: '价格',dataIndex: 'price',key: 'price',},{title: '操作',key: 'action',width:'200',render: (_, record) => (<Button type='primary' size="middle" onClick={()=>deleteBook(record)}>删除</Button>),},];return (<Table columns={columns} dataSource={tableData} rowKey="id" pagination={false} scroll={{ y: 300 }} />)
};export default BookTable;

添加书籍组件:
主要是对form进行数据的校验和获取表单数据getFieldsValue,以及更改表单数据setFieldsValue(对数据进行添加后,清空处理)。
const [form]=Form.useForm();

import React, { useState } from 'react'
import {Form, Input,Button} from 'antd'
import './index.less'
export interface BookType {title:string,author:string,price:string
}
interface AddBookProps{addBook:Function
}
const AddBook: React.FC<AddBookProps> = (props) => {const {addBook}=props;const [form]=Form.useForm();const formTmp=[{label:"书名",name:"title",rules: [{required: true, message: '请输入书籍名称!'}]},{label:"作者",name:"author",rules: [{required: true, message: '请输入作者名称!'}]},{label:"价格",name:"price",rules: [{required: true, message: '请输入价格!'}]}]function btnClick(){form.validateFields().then(async values => {addBook(form.getFieldsValue())form.setFieldsValue({title:'',author:'',price:''})}).catch(info => {console.log('Validate Failed:', info);})}return (<div className='addBox'><div className='title'>添加书籍</div><Formname="basic"size='large'form={form}initialValues={{ remember: true }}autoComplete="off"layout='vertical'>{formTmp.map(item=>(<Form.Itemkey={item.name}label={item.label}name={item.name}rules={item.rules}><Input /></Form.Item>))}<Form.Item><Button type="primary" onClick={()=>btnClick()}>添加</Button></Form.Item></Form></div>)
};export default AddBook;

react+hook函数组件实现表单添加数据,表格展现相关推荐

  1. vue表单的数据验证

    1.在el-form中通过属性:rules进行绑定,它的值为验证规则对象rules <el-form :model="ruleForm" :rules="rules ...

  2. 使用 Netlify Forms 将联系表单添加到 React 应用程序

    将联系表单添加到 React 应用程序可能需要编写服务器端代码来处理表单提交,但是使用 Netlify Forms,您可以从逻辑中解脱出来,因​为当您的网站运行时,它会为您完成所有幕后工作部署在Net ...

  3. 《uni-app》表单组件-form表单

    本文分享的Form组件为uni-app的内置组件Form,非扩展组件,两者在用法上其实大同小异,只是扩展组件的属性以及事件更多-没有本质上的区别- <uni-app>表单组件-form表单 ...

  4. html表单输入框添加验证码,织梦Dedecms为自定义表单添加验证码功能

    使用织梦Dedecms自定义表单的时候,即使你做了字段的验证,也很有可能被人刷很多垃圾的内容,更加安全的一个方法是为自定义表单添加上验证码功能.今天我就来为大家分享一下怎样给自定义表单添加验证码! 一 ...

  5. php v9 上传_phpcms v9 表单添加文件上传字段

    phpcms v9 表单添加文件上传字段 1.打开目录 ./phpcms/modules/content/fields/ ;把 文件夹downfile,拷贝到目录./phpcms/modules/fo ...

  6. web元件库/常用web组件/常用表单/导航栏/边框/图标/日期时间选择器/评分组件/穿梭框/输入框/步骤条/计数器/输入框/Axure原型/axure元件库/rp原型/交互控件/五星评分器/导航框架

    web元件库/axure元件库/常用web组件/常用表单/导航栏/边框/图标/日期时间选择器/评分组件/穿梭框/输入框/步骤条 /交互控件:单/多选框.输入框.计数器.选择器.级联选择.滑动开关.滑块 ...

  7. web元件库/axure元件库/常用web组件/常用表单/导航栏/边框/图标/日期时间选择器/评分组件/穿梭框/输入框/步骤条/

    web元件库/axure元件库/常用web组件/常用表单/导航栏/边框/图标/日期时间选择器/评分组件/穿梭框/输入框/步骤条/ Axure原型演示及下载地址请点击:https://www.pmdan ...

  8. React+ant中的Form表单的刷新

    我们使用ant组件库的Form表单提交之后不刷新整个页面,表单中的内容有时候是不会刷新,如何解决这个问题? 首先定义一个[form]通过 Form.useForm 对表单数据域进行交互, const ...

  9. HTML form表单添加enctype属性后获取不到input值

    HTML form表单添加enctype属性后获取不到input值 问题如图所示, 在servlet中输出获取的属性值,发现全部为null 最后结论 enctype修改了form表单提交时的格式,不再 ...

最新文章

  1. 『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)
  2. linux 定时重启mysql_Linux下定时自动重启apache及mysql
  3. mflac文件解析工具_9 个爱不释手的 JSON 工具
  4. java语言怎么建立窗口awt,java.awt.Frame类:创建窗口
  5. iOS中XML解析 (二) libxml2(实例:打印xml内容及存储到数组)
  6. js放到head中失效的原因与解决方法
  7. VMware Workstation安装RedHat Linux 9
  8. arp扫描工具_ARP扫描与ARP欺骗--Python的Scapy/Kamene模块学习之路
  9. 吞食天地2完全版乱码怎么解决_PDF转Word如何转换?PDF转Word乱码怎么解决?
  10. Vue项目上线的基本流程
  11. JindoFS解析 - 云上大数据高性能数据湖存储方案
  12. POJ 3388 Japanese Puzzle(二分法)
  13. 调和级数相关极限合集
  14. 区块链基本概念和名词解释
  15. 浙江海發進出口股份有限公司官网上线|LTD五金技术行业案例分享
  16. 如何去除软件内嵌广告_iphone如何一键去除app内置小广告?
  17. 几何畸变的类型_halcon图像畸变 论述遥感数字图像畸变类型及其产生的原因
  18. Python爬虫入门一(爬虫基础)
  19. 机器视觉(七):图像分割
  20. 网络舆情数据分析系统技术方案

热门文章

  1. 学习MEF系列(2):导入(Import)和导出(Export)
  2. 语音学发音语音学笔记
  3. 2018软考上半年(错题总结)
  4. java实现微信支付与支付宝支付接口
  5. 2021 技术展望 | AV1 在 RTC 应用实践中的现状与展望
  6. java充值_Java实现支付宝充值
  7. Unity运行中修改物体的颜色
  8. DirectX版本说明
  9. 我的autohotkey脚本案例
  10. centos7 gnome 关闭黑屏和屏保