【问题标题】:React jsx array component does not re-render when state changesReact jsx数组组件在状态更改时不会重新渲染
【发布时间】: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


【解决方案1】:

你在 deleteNode 内部变异 teams

即使您将teams 分配给tempNodes,这仍然是同一个对象引用。

您可以通过创建teams 的副本并使用扩展运算符... 将其分配给tempNodes 来快速解决此问题

你需要做的就是改变

const tmpNodes = teams;

// Create a copy of teams as a new array
const tmpNodes = [...teams];

【讨论】:

  • 你告诉我的方法是对的。在我更改代码后,它起作用了。我为您节省了很多时间和精力。非常感谢。
  • 对不起..你救了我... ^^
猜你喜欢
  • 2019-02-27
  • 2018-03-17
  • 1970-01-01
  • 2020-03-03
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多