--- order: 23 title: en-US: Editable Rows zh-CN: 可编辑行 --- ## zh-CN 带行编辑功能的表格。 ## en-US Table with editable rows. ```jsx import { Table, Input, InputNumber, Popconfirm, Form, } from 'antd'; const data = []; for (let i = 0; i < 100; i++) { data.push({ key: i.toString(), name: `Edrward ${i}`, age: 32, address: `London Park no. ${i}`, }); } const FormItem = Form.Item; const EditableContext = React.createContext(); const EditableRow = ({ form, index, ...props }) => ( ); const EditableFormRow = Form.create()(EditableRow); class EditableCell extends React.Component { getInput = () => { if (this.props.inputType === 'number') { return ; } return ; }; render() { const { editing, dataIndex, title, inputType, record, index, ...restProps } = this.props; return ( {(form) => { const { getFieldDecorator } = form; return ( {editing ? ( {getFieldDecorator(dataIndex, { rules: [{ required: true, message: `Please Input ${title}!`, }], initialValue: record[dataIndex], })(this.getInput())} ) : restProps.children} ); }} ); } } class EditableTable extends React.Component { constructor(props) { super(props); this.state = { data, editingKey: '' }; this.columns = [ { title: 'name', dataIndex: 'name', width: '25%', editable: true, }, { title: 'age', dataIndex: 'age', width: '15%', editable: true, }, { title: 'address', dataIndex: 'address', width: '40%', editable: true, }, { title: 'operation', dataIndex: 'operation', render: (text, record) => { const editable = this.isEditing(record); return (
{editable ? ( {form => ( this.save(form, record.key)} style={{ marginRight: 8 }} > Save )} this.cancel(record.key)} > Cancel ) : ( this.edit(record.key)}>Edit )}
); }, }, ]; } isEditing = record => record.key === this.state.editingKey; cancel = () => { this.setState({ editingKey: '' }); }; save(form, key) { form.validateFields((error, row) => { if (error) { return; } const newData = [...this.state.data]; const index = newData.findIndex(item => key === item.key); if (index > -1) { const item = newData[index]; newData.splice(index, 1, { ...item, ...row, }); this.setState({ data: newData, editingKey: '' }); } else { newData.push(row); this.setState({ data: newData, editingKey: '' }); } }); } edit(key) { this.setState({ editingKey: key }); } render() { const components = { body: { row: EditableFormRow, cell: EditableCell, }, }; const columns = this.columns.map((col) => { if (!col.editable) { return col; } return { ...col, onCell: record => ({ record, inputType: col.dataIndex === 'age' ? 'number' : 'text', dataIndex: col.dataIndex, title: col.title, editing: this.isEditing(record), }), }; }); return ( ); } } ReactDOM.render(, mountNode); ``` ```css .editable-row .ant-form-explain { position: absolute; font-size: 12px; margin-top: -4px; } ```