Мы не знаем, как выглядит ваш массив объектов, поэтому мы должны угадать:
Итак, я предполагаю, что этот ввод:
const initState = [
{ id: 1, name: "bread", quantitiy: 50 },
{ id: 2, name: "milk", quantitiy: 20 },
{ id: 3, name: "water", quantitiy: 10 }
];
И я получаю этот вывод:
Это полностью гибко, поэтому, если у нас есть ввод:
const initState = [
{ id: 1, name: "bread", quantitiy: 50, location: "cupboard" },
{ id: 2, name: "milk", quantitiy: 20, location: "fridge" },
{ id: 3, name: "water", quantitiy: 10, location: "fridge" }
];
Тогда мы получим этот вывод:
Наиболее важным является сопоставление значений объекта внутри карты, которая сопоставляется с массивом состояний:
{state.map((item) => (
<tr key={item.id}>
{Object.values(item).map((val) => (
<td>{val}</td>
))}
</tr>
))}
полная демонстрация ниже и на codePen : https://codepen.io/Alexander9111/pen/zYvEbML
Я использовал функциональный компонент, но он был бы очень похож на компонент на основе классов.
ПРИМЕЧАНИЕ: вы также можете создать компонент строки и затем вызовите этот компонент внутри карты через массив состояний. Внутри этого компонента строки вы должны отобразить ключи Object, как я, и вывести элементы данных таблицы. Это баланс между смертью по компонентам (т.е. разбивкой всего на все более мелкие компоненты, вложенные друг в друга) и меньшим количеством слишком сложных компонентов.
function MyTable() {
const initState = [
{ id: 1, name: "bread", quantitiy: 50, location: "cupboard" },
{ id: 2, name: "milk", quantitiy: 20, location: "fridge" },
{ id: 3, name: "water", quantitiy: 10, location: "fridge" }
];
const [state, setState] = React.useState(initState);
return (
<table>
<tr key={"header"}>
{Object.keys(state[0]).map((key) => (
<th>{key}</th>
))}
</tr>
{state.map((item) => (
<tr key={item.id}>
{Object.values(item).map((val) => (
<td>{val}</td>
))}
</tr>
))}
</table>
);
}
ReactDOM.render(<MyTable />, document.getElementById("target"));
th,
td {
border: 1px solid black;
margin: 0px 0px;
padding: 5px 5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
<div id="target"></div>