【发布时间】:2021-06-13 03:13:25
【问题描述】:
在similar question 中,解决方案是在遍历数组以呈现组件时使用唯一值而不是映射索引作为“键”道具。但是,它对我不起作用,因为在我从数组中删除一个元素后,remaning 组件仍然会重新呈现。我在这里错过了什么?
这是我的尝试,但没有按预期工作:
App.js
import { useState } from "react";
import Column from "./Column.js";
export default function App() {
const data = [
{
name: "lebron",
age: 36,
team: "lakers"
},
{
name: "chris",
age: 36,
team: "suns"
},
{
name: "james",
age: 32,
team: "nets"
}
];
const [players, setPlayers] = useState(data);
const handleClick = () => {
return function () {
const p = [...players];
p.splice(0, 1);
setPlayers(p);
};
};
return (
<>
<table>
<tr>
<td>name</td>
<td>age</td>
<td>team</td>
</tr>
{players.map((p) => (
<Column key={p.name} player={p} onClick={handleClick(p.name)} />
))}
</table>
<button onClick={handleClick()}>Delete</button>
</>
);
}
Column.js:
import React from "react";
export default function Column({ player, onClick }) {
console.log(player.name, "update", Date());
return (
<tr>
<td>{player.name}</td>
<td>{player.age}</td>
<td>{player.team}</td>
</tr>
);
}
【问题讨论】:
-
您正在更改组件的状态,这会导致重新渲染。我要说的唯一想法是将您的数据数组移到组件之外,这样就不会在每次重新渲染时都定义它
-
你需要记住 Column 组件。 es.reactjs.org/docs/react-api.html 但你需要有一些反应性能背景。
-
不得不说你的handleClick功能不对。当您使用 splice 时,您正在修改播放器数组,并且在 React 状态下只能使用调度函数 (setPlayers) 进行修改。在您的情况下,您应该使用 .filter 方法,因为它返回一个新数组。
标签: javascript reactjs