Существует компонент GenericTable
, который принимает данные в качестве атрибутов.
в компоненте, который имеет данные:
const headers = ['ID', 'Name', 'City'];
const rows = [{cells: ['1', 'John', 'Paris']},
{cells: ['3', 'Ben', 'Berlin']},
{cells: ['2', 'Helen', 'Barcelona']}
];
const idList = ['1', '3', '2'];
<GenericTable
headers={headers}
rows={rows}
idList={idList}
/>
в GenericTable:
import { Table } from 'semantic-ui-react';
export default class GenericTable extends React.PureComponent {
constructor(props) {
super(props);
}
render() {
const { headers, rows, idList } = this.props;
return (
<Table>
<Table.Header>
<Table.Row>
{headers.map(header => (
<Table.HeaderCell key={headers.indexOf(header)}>
{header}
</Table.HeaderCell>
)}
</Table.Row>
</Table.Header>
<Table.Body>
{rows.map((row, rowIndex) => (
<Table.Row key={idList && idList[rowIndex]}>
<Table.Cell>
...
</Table.Cell>
</Table.Row>
)}
</Table.Body>
</Table>
);
}
}
Есть ли способ сделать таблицу сортированной? Например, добавьте кнопку рядом с заголовком name , и при ее нажатии отсортировать таблицу в алфавитном порядке на основе этого столбца?
Я пытался решить эту проблему, но она не работает. Я добавил значение по умолчанию в состояние, кнопку для каждого заголовка столбца, на которую можно щелкнуть, и при нажатии она должна отсортировать данные на основе этого столбца:
import { Table } from 'semantic-ui-react';
export default class GenericTable extends React.PureComponent {
constructor(props) {
super(props);
this.state = { // added state
currentSort: 'default',
};
}
onSortChange = () => { // added method
const { currentSort } = this.state;
let nextSort;
if (currentSort === 'down') nextSort = 'up';
else if (currentSort === 'up') nextSort = 'default';
else if (currentSort === 'default') nextSort = 'down';
this.setState({
currentSort: nextSort,
});
};
render() {
const { currentSort } = this.state; // added state
const sortTypes = { // added constant
up: {
class: 'sort-up',
fn: (a, b) => a.name - b.name,
},
down: {
class: 'sort-down',
fn: (a, b) => b.name - a.name,
},
default: {
class: 'sort',
fn: (a, b) => a,
},
};
const { headers, rows, idList } = this.props;
return (
<Table>
<Table.Header>
<Table.Row>
{headers.map(header => (
<Table.HeaderCell key={headers.indexOf(header)}>
{header}
// added button
<button onClick={this.onSortChange} type="button">
<i className={`fas fa-${sortTypes[currentSort].class}`} />
</button>
</Table.HeaderCell>
)}
</Table.Row>
</Table.Header>
<Table.Body>
// added below
{[...rows].sort(sortTypes[currentSort].fn).map((row, rowIndex) => (
<Table.Row key={idList && idList[rowIndex]}>
<Table.Cell>
...
</Table.Cell>
</Table.Row>
)}
</Table.Body>
</Table>
);
}
}