我们不知道你的对象数组是什么样的,所以我们必须猜测:
所以我猜这个输入:
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
我使用了一个功能组件,但它与基于类的组件非常相似。
注意:您还可以创建一个行组件,然后通过状态数组在地图内调用该组件。在此行组件内,您将像我一样映射对象键并输出表数据元素。这是组件死亡(即将所有内容分解为彼此嵌套的越来越小的组件)和过于复杂的更少组件之间的平衡。
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>