React+Antd 实现可增删改表格的示例
导读:收集整理的这篇文章主要介绍了React+Antd 实现可增删改表格的示例,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录@H_126_4@Table/index.jsTable/...
收集整理的这篇文章主要介绍了React+Antd 实现可增删改表格的示例,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录
- @H_126_4@Table/index.js
- Table/model/index.js
- Table/model/modules/base.js
- @L_304_3@
最近写了一个小东西,模仿自己原先用vue写的项目改成react语法。写了一个可编辑的表格,期间磕磕碰碰的,打算把bug记录下。先把效果图和代码贴上去,主要用的是react+antd
table表格,点击编辑,打开弹窗,弹窗内是tab切换显示不同的form表单+可编辑表格,表格内操作栏"+",表格内新增一行可编辑的数据,编辑,保存,删除这些操作就不细说也不贴效果图了
Table/index.js
import React, { usestate } From 'react'import { Row,Col,Card, Table, Tag, Divider, Modal, Button } from 'antd'; import ModalData from './model'const App = (PRops) => { console.LOG(props,'----') const [isModalVisible, setIsModalVisible] = useState(false); const columns = [ { tITle: 'Name', dataindex: 'name', key: 'name', render: text => a> { text} /a> , } , { title: 'Age', dataIndex: 'age', key: 'age', } , { title: 'Address', dataIndex: 'address', key: 'address', } , { title: 'Tags', key: 'tags', dataIndex: 'tags', render: tags => ( label> { tags.map(tag => { let color = tag.length > 5 ? 'geekblue' : 'green'; if (tag === 'loser') { color = 'volcano'; } return ( Tag color={ color} key={ tag} > { tag.toUpPErCase()} /Tag> ); } )} /label> ), } , { title: 'Action', key: 'action', align:'center', render: (record) => ( label> a onClick={ () => showModal(record)} > 编辑/a> Divider type="vertical" /> { /* Button onClick={ ()=> showModal(record)} > 删除/Button> */} a onClick={ ()=> showModal(record)} > 删除/a> /label> ), } , ]; const data = [ { key: '1', name: 'John brown', age: 32, address: 'New York No. 1 Lake Park', tags: ['nice', 'developer'], } , { key: '2', name: 'Jim Green', age: 42, address: 'London No. 1 Lake Park', tags: ['loser'], } , { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park', tags: ['cool', 'teacher'], } ]; const showModal = (row) => { setIsModalVisible(true); } ; const handleCancel = () => { setIsModalVisible(false); } const handleOk = (form={ } ,data) => { setIsModalVisible(false); console.log(form,data,'pp---') } return ( label> Row gutter={ 16} classname="gutter-row"> Col md={ 24} > Card title="基本表格+简单弹框" bordered={ false} > Table columns={ columns} dataSource={ data} /> /Card> /Col> /Row> { isModalVisible & & modalData close={ ()=> { handleCancel() } } saveOk={ (form,data)=> { handleOk(form,data) } } /> } { /* { isModalVisible & & ModalData /> } */} /label> ); } ; const la = '111'export default () => ( App/> )
Table/model/index.js
import React from 'react'import Basic from './modules/base'import EditTableData from './modules/editTableData'import { Modal, Tabs, Spin } from "antd"; export default class ModalData extends React.component{ constructor(){ super() this.state = { isModalVisible:true, currentTab:'basicColumns', tableData:[] } } componentWillmount(){ this.setState({ isModalVisible:this.props.isModalVisible } ) this.basicColumns = [ { title:'操作类型',editable:true,dataIndex:'name'} , { title:'名称',editable:true,dataIndex:'age'} , { title:'描述',editable:true,dataIndex:'address'} ] this.associationColumns = [ { title:'前置操作',editable:true,dataIndex:'name'} , { title:'关联权限',editable:true,dataIndex:'age'} , { title:'关联操作',editable:true,dataIndex:'address'} ] this.dataViewColumns = [ { title:'字段',editable:true,dataIndex:'name'} , { title:'描述',editable:true,dataIndex:'address'} ] } componentWillUpdate(){ console.log(22) } componentDidMount(){ console.log(11) } handleOk = () => { // console.log(this.tabData,'this.formRefThree.props') const form = this.formRef.props.form; form.validateFields((err, fieldsValue) => { if (!err) { console.log(this.tabData,'pp---00---'); this.props.saveOk(fieldsValue,this.tabData) } } ); } saveTable(data){ console.log(data,this.state.currentTab,'data---') this.tabData = { [this.state.currentTab]:data } } changeTab(key){ console.log(key,'key---') this.setState({ currentTab:key } ) } render(){ return ( Modal title="编辑" width={ 650} destroyOnClose visible onOk={ () => this.handleOk() } onCancel={ () => this.props.close()} > Tabs onChange={ (key)=> this.changeTab(key)} > Tabs.TabPane tab="基本信息" key="basicColumns"> span> Basic wrappedComponentRef={ (form) => this.formRef = form} /> EditTableData basicColumns={ this.basicColumns} saveTable={ (data)=> this.saveTable(data)} /> /span> /Tabs.TabPane> Tabs.TabPane tab="关联权限" key="associationColumns"> EditTableData associationColumns={ this.associationColumns} saveTable={ (data)=> this.saveTable(data)} /> /Tabs.TabPane> Tabs.TabPane tab="数据视图" key="dataViewColumns"> EditTableData dataViewColumns={ this.dataViewColumns} saveTable={ (data)=> this.saveTable(data)} /> /Tabs.TabPane> /Tabs> /Modal> ) } }
Table/model/modules/base.js
import React from 'react'import { Form, Input, Select, Radio } from 'antd'; const { Option } = Select; // const Basic = (props) => { class Basic extends React.COMponent{ formRef = React.createRef(); // const [form] = Form.useForm(); onGenderChange(value){ switch (value) { case 'male': this.props.form.setFieldsValue({ note: 'Hi, man!', } ); return; case 'female': this.props.form.setFieldsValue({ note: 'Hi, lady!', } ); return; case 'other': this.props.form.setFieldsValue({ note: 'Hi there!', } ); return; } } onFinish(values){ console.log(values); console.log(this.props.form.getFieldsValue,'09900--') } render(){ console.log(this.props.form.getFieldValue('gender'),'990----') const { form } = this.props; const { getFieldDecorator, getFieldValue} = form; return ( div> Form ref={ this.formRef} layout="inline" name="control-hooks" onFinish={ this.onFinish.bind(this)} > Form.Item label="权限标识" required> { getFieldDecorator("note")(Input placeholder="请输入"/> )} /Form.Item> Form.Item label="权限名称" required> { getFieldDecorator("name")(Input placeholder="请输入"/> )} /Form.Item> Form.Item label="requiredMark" name="状态" required> { getFieldDecorator("requiredMark")( Radio.Group> Radio.Button value="optional"> 启用/Radio.Button> Radio.Button value="disabled"> 禁用/Radio.Button> /Radio.Group> )} /Form.Item> Form.Item name="gender" label="分类" required> { getFieldDecorator("gender")( Select style={ { width: '250px'} } placeholder="请选择" onChange={ this.onGenderChange.bind(this)} allowClear > Option value="male"> api借口/Option> Option value="female"> 租户/Option> Option value="other"> 系统/Option> /Select> )} /Form.Item> { getFieldValue('gender') == 'other' & & Form.Item name="customizeGender" label="备注"> { getFieldDecorator("customizeGender")(Input /> )} /Form.Item> } /Form> /div> ) } } export default Form.create()(Basic)
Table/model/modules/editTable.js
import React, { useState } from 'react'; import { Table, Input, InputNumber,Divider, Popconfirm, Form, Typography } from 'antd'; import { PlusSquareOutlined} from '@ant-design/icons'; const { Provider, Consumer } = React.createContext()//组件之间传值const originData = []; for (let i = 0; i 5; i++) { originData.push({ key: i.toString(), name: `Edrward ${ i} `, age: 32, address: `London Park no. ${ i} `, } ); } class EditableCell extends React.Component{ renderCell = ({ getFieldDecorator} ) => { const { editing, dataIndex, title, Inputs, record, index, children, ...restProps } = this.props return ( td { ...restProps} > { editing ? ( Form.Item style={ { margin: 0, } } > { getFieldDecorator(dataIndex,{ rules: [{ required: true, message: '请输入' } ], initialValue: record[dataIndex] } )( Inputs /> )} /Form.Item> ) : ( children )} /td> ); } render(){ return Consumer> { this.renderCell} /Consumer> } } class EditTableData extends React.Component{ constructor(props){ super(props) this.state = { data:originData, editingKey:'' } } // 判断是否可编辑 isEditing = record => record.key == this.state.editingKey // 初始化 init(){ console.log(this.props,'pp--') const data = this.props.basicColumns || this.props.dataViewColumns || this.props.associationColumns || [] this.columns = [ ...data, { title: ()=> { return span> 操作Divider type="vertical" /> PlusSquareOutlined style={ { color:"#333"} } onClick={ ()=> this.addColumns()} /> /span> } , width:'20%', dataIndex: 'operation', render: (_, record) => { const { editingKey } = this.state const editable = this.isEditing(record); return editable ? ( span> Consumer> { form => ( a onClick={ () => this.save(form,record.key)} > 保存 /a> ) } /Consumer> Divider type="vertical" /> Popconfirm okText="确认" cancelText="取消" title="是否确定取消?" onConfirm={ this.cancel} > a> 取消/a> /Popconfirm> /span> ) : ( span> a disabled={ editingKey != ''} onClick={ ()=> this.edit(record.key)} > 编辑/a> Divider type="vertical" /> Popconfirm okText="确认" cancelText="取消" title="是否确定取消?" onConfirm={ ()=> this.delete(record.key)} > a> 删除/a> /Popconfirm> /span> ); } , } , ]; } // 添加 addColumns = () => { const newData = [...this.state.data] newData.push({ key: newData.length, name: ``, age: '', address: `` } ) this.setState({ data:newData } ) } // 编辑 edit = (key) => { this.setState({ editingKey:key } ) } // 删除 delete = (key) => { const newData = [...this.state.data] const index = newData.findIndex(item=> item.key == key) newData.splice(index,1) this.setState({ data:newData } ) } // 保存 save = (form,key) => { form.validateFields((error,row)=> { if(error){ return } const newData = [...this.state.data] const index = newData.findIndex(item=> item.key == key) if(index > -1){ const item = newData[index] newData.splice(index,1,{ ...item,...row } ) } this.setState({ editingKey:'', data:newData } ) this.props.saveTable(newData) } ) } // 取消 cancel = () => { this.setState({ editingKey: '' } ) } render(){ this.init() console.log(this.columns,'columns') const columns = this.columns.map(col => { if(!col.editable){ return col } return { ...col, onCell:record => ({ record, Inputs:Input, dataIndex:col.dataIndex, title:col.title, editing:this.isEditing(record) } ) } } ) return ( Provider value={ this.props.form} > Table bordered style={ { marginTop:'30px'} } components={ { body:{ cell:EditableCell } } } columns={ columns} dataSource={ this.state.data} pagination={ false} /> /Provider> ) } } export default Form.create()(EditTableData)
以上就是React+Antd实现可增删改表格的示例的详细内容,更多关于React+Antd实现可增删改表格的资料请关注其它相关文章!
您可能感兴趣的文章:- 详解对于React结合Antd的Form组件实现登录功能
- React antd tabs切换造成子组件重复刷新
- react+antd 递归实现树状目录操作
- react使用antd表单赋值,用于修改弹框的操作
- react antd表格中渲染一张或多张图片的实例
- 在react-antd中弹出层form内容传递给父组件的操作
- 在react项目中使用antd的form组件,动态设置input框的值
- 解决React在安装antd之后出现的Can''t resolve ''./locale''问题(推荐)
- react实现antd线上主题动态切换功能
- React+Antd+Redux实现待办事件的方法
- create-react-app使用antd按需加载的样式无效问题的解决
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: React+Antd 实现可增删改表格的示例
本文地址: https://pptw.com/jishu/595114.html