开发者社区> 问答> 正文

Ant-Design Table 嵌入下拉框,可整行删除

需求如下图。antD 提供带输入框的,每一个单元格都用如何做 代码如下:

import { Table, Input, Button, Popconfirm, Form } from 'antd';

const EditableContext = React.createContext();

const EditableRow = ({ form, index, ...props }) => ( <EditableContext.Provider value={form}> <tr {...props} /> </EditableContext.Provider> );

const EditableFormRow = Form.create()(EditableRow);

class EditableCell extends React.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; this.form.validateFields((error, values) => { if (error && error[e.currentTarget.id]) { return; } this.toggleEdit(); handleSave({ ...record, ...values }); }); };

renderCell = form => { this.form = form; const { children, dataIndex, record, title } = this.props; const { editing } = this.state; return editing ? ( <Form.Item style={{ margin: 0 }}> {form.getFieldDecorator(dataIndex, { rules: [ { required: true, message: ${title} is required., }, ], initialValue: record[dataIndex], })(<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} ); };

render() { const { editable, dataIndex, title, record, index, handleSave, children, ...restProps } = this.props; return ( <td {...restProps}> {editable ? ( <EditableContext.Consumer>{this.renderCell}</EditableContext.Consumer> ) : ( children )} ); } }

class EditableTable extends React.Component { constructor(props) { super(props); this.columns = [ { title: 'name', dataIndex: 'name', width: '30%', editable: true, }, { title: 'age', dataIndex: 'age', }, { title: 'address', dataIndex: 'address', }, { title: 'operation', dataIndex: 'operation', render: (text, record) => this.state.dataSource.length >= 1 ? ( <Popconfirm title="Sure to delete?" onConfirm={() => this.handleDelete(record.key)}> Delete ) : 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: EditableFormRow, 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 (

<Button onClick={this.handleAdd} type="primary" style={{ marginBottom: 16 }}> Add a row <Table components={components} rowClassName={() => 'editable-row'} bordered dataSource={dataSource} columns={columns} />
); } }

ReactDOM.render( , mountNode);

展开
收起
问问小秘 2020-01-09 15:59:25 2827 0
1 条回答
写回答
取消 提交回答
  • 推荐你把代码放到像CodePen之类的工具上,能让大家进行查看实际效果和修改,直接给这么长的代码看起来太繁琐而且不好理解。

    根据你上面的代码,你关注一下columns ,在这个里面操作列既然能用render渲染一个带气泡确认框的删除按钮,那么其它列当然也能使用render渲染出下拉框,当然除此之外,基本只要是你平常用到的,基本都能渲染,各中细节,你可以仔细研究一下官方文档

    2020-01-09 16:01:30
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载