Первое решение
Компонент-обертка, который управляет состоянием двух Tables
:
- Таблица ввода с одной строкой.
- Таблица данныхбез заголовка.
function TableWrapper() {
...
return (
<Flexbox>
<Table
size="medium"
rowSelection={rowSelection}
columns={columnsInput}
dataSource={[{}]}
pagination={false}
/>
<Table
size="medium"
showHeader={false}
rowSelection={rowSelection}
columns={columns}
dataSource={dataSource}
/>
<Button onClick={handleAdd} type="primary" style={{ margin: '3%' }}>
Add a row
</Button>
</Flexbox>
);
}
Для сортировки, выполненной оберткой, вам нужно как минимум два элемента, чтобы можно было вызвать сортировку:dataSource={[{},{}]}
// columnsInput
{
title: 'Age',
dataIndex: 'age',
render: () => <Input />,
sort: () => // setDataSource...
}
Второе решение
В dataSource
значении, которое передано в Table
, добавьте передний макет элемента и затем соответственно отобразите строку дляпример:
const initial = {
key: 'initial',
name: 'initial',
age: 'initial',
address: 'initial'
};
Затем при рендеринге строки:
const columns = [
{
title: 'Name',
dataIndex: 'name',
render: value => (value === 'initial' ? <Input /> : value)
},
{
title: 'Age',
dataIndex: 'age',
render: value => (value === 'initial' ? <Input /> : value),
sorter: (a, b) => a.age - b.age
},
{
title: 'Address',
dataIndex: 'address',
render: value => (value === 'initial' ? <Input /> : value)
},
{
title: '',
dataIndex: 'action',
width: '50px',
render: (_, record) => (
<>
{record.name === 'initial' && <Button icon="plus" shape="circle" />}
{record.name !== 'initial' && (
<Button icon="delete" shape="circle" type="danger" />
)}
</>
)
}
];
Результат:
inследующий компонент:
function TweakedTable() {
const [dataSource, setDataSource] = useState([makeRow(0)]);
const [counter, setCounter] = useState(1);
const handleAdd = () => {
setDataSource([...dataSource, makeRow(counter)]);
setCounter(prev => prev + 1);
};
return (
<Flexbox>
<Table
size="small"
rowSelection={rowSelection}
columns={columns}
dataSource={[initial, ...dataSource]}
/>
<Button onClick={handleAdd} type="primary" style={{ margin: '3%' }}>
Add a row
</Button>
</Flexbox>
);
}
Нет затрат на сортировку, просто добавьте sorter
в столбцы таблицы.
Кроме того, ваш dataSource
отделен от первой строки.
Примечание: я не делал никакого управления состоянием в демо, я уверен, что вы сможете справиться с этим, даже если вы хотитеубрать инвалида Checkbox
не стоитиспользуйте rowSelection={rowSelection}
и визуализируйте Checkbox
в каждом ряду и управляйте ими самостоятельно.