好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

React+Antd 实现可增删改表格的示例

最近写了一个小东西,模仿自己原先用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实现可增删改表格的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/6947969446501679117

查看更多关于React+Antd 实现可增删改表格的示例的详细内容...

  阅读:81次