一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語(yǔ)言 - JavaScript - React - React+Antd 實(shí)現(xiàn)可增刪改表格的示例

React+Antd 實(shí)現(xiàn)可增刪改表格的示例

2022-02-24 16:44用戶320228579782 React

這篇文章主要介紹了React+Antd實(shí)現(xiàn)可增刪改表格的示例,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下

最近寫了一個(gè)小東西,模仿自己原先用vue寫的項(xiàng)目改成react語(yǔ)法。寫了一個(gè)可編輯的表格,期間磕磕碰碰的,打算把bug記錄下。先把效果圖和代碼貼上去,主要用的是react+antd

table表格,點(diǎn)擊編輯,打開彈窗,彈窗內(nèi)是tab切換顯示不同的form表單+可編輯表格,表格內(nèi)操作欄"+",表格內(nèi)新增一行可編輯的數(shù)據(jù),編輯,保存,刪除這些操作就不細(xì)說也不貼效果圖了

React+Antd 實(shí)現(xiàn)可增刪改表格的示例

React+Antd 實(shí)現(xiàn)可增刪改表格的示例

React+Antd 實(shí)現(xiàn)可增刪改表格的示例

React+Antd 實(shí)現(xiàn)可增刪改表格的示例

React+Antd 實(shí)現(xiàn)可增刪改表格的示例

 

Table/index.js

  1. import React, { useState }from 'react' 
  2. import { Row,Col,Card, Table, Tag, Divider, Modal, Button } from 'antd'
  3. import ModalData from './model' 
  4.  
  5.  
  6. const App = (props) => { 
  7.  console.log(props,'----'
  8.  const [isModalVisible, setIsModalVisible] = useState(false); 
  9.  const columns = [ 
  10.   { 
  11.    title: 'Name'
  12.    dataIndex: 'name'
  13.    key: 'name'
  14.    render: text => <a>{text}</a>, 
  15.   }, 
  16.   { 
  17.    title: 'Age'
  18.    dataIndex: 'age'
  19.    key: 'age'
  20.   }, 
  21.   { 
  22.    title: 'Address'
  23.    dataIndex: 'address'
  24.    key: 'address'
  25.   }, 
  26.   { 
  27.    title: 'Tags'
  28.    key: 'tags'
  29.    dataIndex: 'tags'
  30.    render: tags => ( 
  31.     <label> 
  32.      {tags.map(tag => { 
  33.       let color = tag.length > 5 ? 'geekblue' : 'green'
  34.       if (tag === 'loser') { 
  35.        color = 'volcano'
  36.       } 
  37.       return ( 
  38.        <Tag color={color} key={tag}> 
  39.         {tag.toUpperCase()} 
  40.        </Tag> 
  41.       ); 
  42.      })} 
  43.     </label> 
  44.    ), 
  45.   }, 
  46.   { 
  47.    title: 'Action'
  48.    key: 'action'
  49.    align:'center'
  50.    render: (record) => ( 
  51.     <label> 
  52.      <a onClick={() => showModal(record)}>編輯</a> 
  53.      <Divider type="vertical" /> 
  54.      {/* <Button onClick={()=>showModal(record)} > 刪除</Button> */
  55.      <a onClick={()=>showModal(record)} > 刪除</a> 
  56.     </label> 
  57.    ), 
  58.   }, 
  59.  ]; 
  60.  const data = [ 
  61.   { 
  62.    key: '1'
  63.    name: 'John Brown'
  64.    age: 32, 
  65.    address: 'New York No. 1 Lake Park'
  66.    tags: ['nice''developer'], 
  67.   }, 
  68.   { 
  69.    key: '2'
  70.    name: 'Jim Green'
  71.    age: 42, 
  72.    address: 'London No. 1 Lake Park'
  73.    tags: ['loser'], 
  74.   }, 
  75.   { 
  76.    key: '3'
  77.    name: 'Joe Black'
  78.    age: 32, 
  79.    address: 'Sidney No. 1 Lake Park'
  80.    tags: ['cool''teacher'], 
  81.   } 
  82.  ]; 
  83.   
  84.  const showModal = (row) => { 
  85.   setIsModalVisible(true); 
  86.  }; 
  87.  const handleCancel = () => { 
  88.   setIsModalVisible(false); 
  89.  } 
  90.  const handleOk = (form={},data) => { 
  91.   setIsModalVisible(false); 
  92.   console.log(form,data,'pp---'
  93.  } 
  94.  
  95.   
  96.  
  97.  return ( 
  98.   <label> 
  99.    <Row gutter={16} className="gutter-row"
  100.     <Col md={24}> 
  101.      <Card title="基本表格+簡(jiǎn)單彈框" bordered={false}> 
  102.       <Table columns={columns} dataSource={data} /> 
  103.      </Card> 
  104.     </Col> 
  105.    </Row> 
  106.    {isModalVisible && <ModalData close={()=>{ 
  107.     handleCancel() 
  108.    }} saveOk={(form,data)=>{ handleOk(form,data) }}/>} 
  109.    {/* {isModalVisible && <ModalData />} */
  110.   </label> 
  111.  ); 
  112. }; 
  113. const la = '111' 
  114. export default () => ( 
  115.  <App/> 

Table/model/index.js

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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:'關(guān)聯(lián)權(quán)限',editable:true,dataIndex:'age'},
   {title:'關(guān)聯(lián)操作',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="關(guān)聯(lián)權(quán)限" key="associationColumns">
      <EditTableData associationColumns={this.associationColumns} saveTable={(data)=>this.saveTable(data)}/>
     </Tabs.TabPane>
     <Tabs.TabPane tab="數(shù)據(jù)視圖" key="dataViewColumns">
      <EditTableData dataViewColumns={this.dataViewColumns} saveTable={(data)=>this.saveTable(data)}/>
     </Tabs.TabPane>
    </Tabs>
   </Modal>
  )
 }
}

 

Table/model/modules/base.js

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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="權(quán)限標(biāo)識(shí)" required>
      {getFieldDecorator("note")(<Input placeholder="請(qǐng)輸入"/>)}
     </Form.Item>
     <Form.Item label="權(quán)限名稱" required>
     {getFieldDecorator("name")(<Input placeholder="請(qǐng)輸入"/>)}
     </Form.Item>
     <Form.Item label="requiredMark" name="狀態(tài)" 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="請(qǐng)選擇" onChange={this.onGenderChange.bind(this)} allowClear >
        <Option value="male">api借口</Option>
        <Option value="female">租戶</Option>
        <Option value="other">系統(tǒng)</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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
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: '請(qǐng)輸入'
      }],
      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="確認(rèn)" cancelText="取消" title="是否確定取消?" onConfirm={this.cancel}>
        <a>取消</a>
       </Popconfirm>
      </span>
     ) : (
       <span>
        <a disabled={editingKey != ''} onClick={()=>this.edit(record.key)}>編輯</a>
        <Divider type="vertical" />
        <Popconfirm okText="確認(rèn)" 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實(shí)現(xiàn)可增刪改表格的示例的詳細(xì)內(nèi)容,更多關(guān)于React+Antd實(shí)現(xiàn)可增刪改表格的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 给我视频免费看 | 毛片a区| 青青草原伊人网 | 欧美日韩一区二区综合在线视频 | 91成人免费观看 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 亚洲无限观看 | 国产高清在线精品一区二区三区 | 国产精品美女久久久久网站 | 国产成人亚洲精品乱码在线观看 | 99re8在线精品视频免费播放 | 日本一道高清不卡免费 | 精品国产乱码久久久久久人妻 | 欧美一级特黄刺激大片视频 | 91香蕉导航| 亚洲精品午夜久久aaa级久久久 | 动漫美女被羞羞产奶 | 狠狠综合视频精品播放 | 五月天久久久 | 99re思思 | 日本一区二区视频免费播放 | 亚洲狠狠婷婷综合久久久久网站 | 成人看片免费无限观看视频 | 国产成人手机在线好好热 | 久久www免费人成_看片高清 | 99久久免费视频 | 久久理论片迅播影院一级 | 国产成人福利色视频 | 175m美女被网友灌醉啪啪玩脚 | 丫鬟粗大狠狠贯穿h | 亚洲欧美日韩综合在线播放 | a亚洲天堂| 亚洲免费在线视频 | 97国产自拍| 国产一区二区在线看 | 成人久久18免费网站入口 | 欧美精品久久久久久久免费观看 | 精品亚洲一区二区三区在线播放 | 欧美另类杂交a | 激情影院免费 | 潘甜甜在线观看 |