【发布时间】:2019-08-20 21:35:09
【问题描述】:
我做了一个 jsx 数组反应组件。这个组件应该根据状态值改变,但是即使状态改变和 jsx 数组改变,react 也不会重新渲染。
如果我使用console.log显示状态,状态会发生变化,items(jsx数组组件)值也会发生变化,但不会发生重新渲染。
const Teams = () => {
const [teams, setTeams] = useState([
{
id: "sldkfjsdf",
level: 0,
name: "test1",
children: [{ id: "kjhckjhs", level: 1, name: "test1-1", children: [] }]
},
{ children: [], id: "sdlkfjsdf234", level: 0, name: "test2" }
]);
var items = [];
const deleteNode = id => {
const tmpNodes = teams;
// check level 0
var index = tmpNodes.findIndex(tmpNode => tmpNode.id === id);
if (index >= 0) {
tmpNodes.splice(index, 1);
} else {
// check level 1
tmpNodes.forEach(tmpTeam => {
index = tmpTeam.children.findIndex(child => child.id === id);
if (index >= 0) {
tmpTeam.children.splice(index, 1);
}
});
}
setTeams(tmpNodes);
};
if (teams) {
teams.forEach(team => {
items.push(
<div
onClick={() => {
deleteNode(team.id);
}}
key={team.id}
>
{team.name}
</div>
);
team.children.forEach(child => {
items.push(
<div
onClick={() => {
deleteNode(team.id);
}}
key={child.id}
>
{child.name}
</div>
);
});
});
}
return <>{items}</>;
};
export default Teams;
我希望当我删除节点时,反应重新渲染“项目”。
【问题讨论】:
-
如果您为每个以节点 ID 作为值的项目添加“键”属性,它是否会重新渲染?对于动态填充的内容数组,如果没有 key 属性,react 无法区分两个这样的值。如果您查看开发者工具,您可能会看到警告。
-
能否包含组件的完整源代码?
-
您的
deleteNode怎么样?这看起来是可能导致这些问题的重要部分 -
我上传了所有的代码。请告诉我解决方案
标签: javascript reactjs