zoukankan      html  css  js  c++  java
  • Ant Design编辑表格(类组件)

    Ant Design官网编辑表格--类组件写法

    import React,{Component} from "react";
    import ReactDOM from "react-dom";
    import "antd/dist/antd.css";
    import { Table, Input, Button, Popconfirm, Form } from "antd";
    
    const EditableContext = React.createContext(null); 
    
    class EditableRow extends Component {
      returnForm = React.createRef();
      render() {
        return (
          <Form ref={this.returnForm} component={false}>
            <EditableContext.Provider value={this.returnForm}>
              <tr {...this.props} />
            </EditableContext.Provider>
          </Form>
        );
      }
    }
    
    class EditableCell extends Component {
      state = {
        editing: false
      };
    
      toggleEdit = () => {
        const editing = !this.state.editing;
        this.setState({ editing }, () => {
          if (editing) {
            this.input.focus();
          }
        });
      };
    
      save = (e) => {
        const { record, handleSave } = this.props;
        let values = this.form.current.getFieldsValue();
        this.toggleEdit();
        handleSave({ ...record, ...values });
      };
    
      renderCell = (form) => {
        this.form = form;
        const { children, dataIndex, record, title } = this.props;
        const { editing } = this.state;
        let formParams = {
          one: {
            name: dataIndex,
            rules: [
              {
                required: true,
                message: `${title} is required.`
              }
            ],
            initialValue: record[dataIndex]
          }
        };
        return editing ? (
          <Form.Item {...formParams.one} style={{ margin: 0 }}>
            <Input
              ref={(node) => (this.input = node)}
              onPressEnter={this.save}
              onBlur={this.save}
            />
          </Form.Item>
        ) : (
          <div
            className="editable-cell-value-wrap"
            style={{ paddingRight: 24 }}
            onClick={this.toggleEdit}
          >
            {children}
          </div>
        );
      };
    
      render() {
        const {
          editable,
          dataIndex,
          title,
          record,
          index,
          handleSave,
          children,
          ...restProps
        } = this.props;
        return (
          <td {...restProps}>
            {editable ? (
              <EditableContext.Consumer>{this.renderCell}</EditableContext.Consumer>
            ) : (
              children
            )}
          </td>
        );
      }
    }
    
    class EditableTable extends Component {
      constructor(props) {
        super(props);
        this.columns = [
          {
            title: "name",
            dataIndex: "name",
             "30%",
            editable: true
          },
          {
            title: "age",
            dataIndex: "age"
          },
          {
            title: "address",
            dataIndex: "address"
          },
          {
            title: "operation",
            dataIndex: "operation",
            render: (_, record) =>
              this.state.dataSource.length >= 1 ? (
                <Popconfirm
                  title="Sure to delete?"
                  onConfirm={() => this.handleDelete(record.key)}
                >
                  <a>Delete</a>
                </Popconfirm>
              ) : null
          }
        ];
        this.state = {
          dataSource: [
            {
              key: "0",
              name: "Edward King 0",
              age: "32",
              address: "London, Park Lane no. 0"
            },
            {
              key: "1",
              name: "Edward King 1",
              age: "32",
              address: "London, Park Lane no. 1"
            }
          ],
          count: 2
        };
      }
    
      handleDelete = (key) => {
        const dataSource = [...this.state.dataSource];
        this.setState({
          dataSource: dataSource.filter((item) => item.key !== key)
        });
      };
      handleAdd = () => {
        const { count, dataSource } = this.state;
        const newData = {
          key: count,
          name: `Edward King ${count}`,
          age: "32",
          address: `London, Park Lane no. ${count}`
        };
        this.setState({
          dataSource: [...dataSource, newData],
          count: count + 1
        });
      };
      handleSave = (row) => {
        const newData = [...this.state.dataSource];
        const index = newData.findIndex((item) => row.key === item.key);
        const item = newData[index];
        newData.splice(index, 1, { ...item, ...row });
        this.setState({
          dataSource: newData
        });
      };
    
      render() {
        const { dataSource } = this.state;
        const components = {
          body: {
            row: EditableRow,
            cell: EditableCell
          }
        };
        const columns = this.columns.map((col) => {
          if (!col.editable) {
            return col;
          }
    
          return {
            ...col,
            onCell: (record) => ({
              record,
              editable: col.editable,
              dataIndex: col.dataIndex,
              title: col.title,
              handleSave: this.handleSave
            })
          };
        });
        return (
          <div>
            <Button
              onClick={this.handleAdd}
              type="primary"
              style={{
                marginBottom: 16
              }}
            >
              Add a row
            </Button>
            <Table
              components={components}
              rowClassName={() => "editable-row"}
              bordered
              dataSource={dataSource}
              columns={columns}
            />
          </div>
        );
      }
    }
    
    export default EditableTable;
    
  • 相关阅读:
    安卓证书获取sha1的方法 实测有效 原创!!!
    KafKa_原理及项目整合
    微服务-小结
    bd——kafka
    Zookeeper应用——
    idea使用小结
    服务管理框架——Zookeeper
    中间件汇总——了解
    新篇章:大数据——Flume
    70-71中期10道基石
  • 原文地址:https://www.cnblogs.com/lhongsen/p/14580032.html
Copyright © 2011-2022 走看看