javascript - 使用 useState 添加一个 child 到树

标签 javascript reactjs react-hooks

我有一个简单的 React 树,树的数据来自根节点,它递归地渲染它的子节点 -

<div className="Tree">
  <div>{props.name}</div>
  <div className="children">
    {props.children &&
      props.children.map((item) => {
        return <TreeNode name={item.name} children={item.children} />;
      })}
  </div>
</div>

通过更改 TreeNode 组件并使用 useState 我怎样才能为将子节点添加到树中的任何节点的操作做出选择?

这是我目前的代码 - Demo

(您可以在按钮中实现添加 child 的操作,并为新 child 起任何您想要的名字)

最佳答案

这是一个演示。我将每个子节点存储在父节点的组件状态中。输入显示单击添加时正在创建的节点的名称。

https://codesandbox.io/s/react-hooks-counter-demo-forked-b9mx5

import React, { useState } from "react";
import ReactDOM from "react-dom";
import "./styles.css";

const TreeNode = (props) => {
  const [children, setChildren] = useState([]);
  const [input, setInput] = useState(props.name + "-0");

  function addNode(e) {
    e.preventDefault();
    setChildren((children) => [...children, { name: input, children: [] }]);
    setInput(`${props.name}-${children.length + 1}`);
  }

  return (
    <div className="Tree">
      <div>
        <span>{props.name}</span>
        <form onSubmit={addNode}>
          <input
            type="text"
            value={input}
            onChange={(e) => setInput(e.target.value)}
          />
          <button type="submit">Add child</button>
        </form>
      </div>
      <div className="children">
        {children &&
          children.map((item, index) => {
            return <TreeNode key={index} name={item.name} />;
          })}
      </div>
    </div>
  );
};

const rootElement = document.getElementById("root");
ReactDOM.render(<TreeNode name="Node" />, rootElement);

关于javascript - 使用 useState 添加一个 child 到树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65313836/

相关文章:

javascript - jquery-ui-tabs 内容干扰

javascript - 如何在 React Final Form 之外管理状态?

javascript - 用于显示 html 内容的 WebView 与 TextView

javascript - 长轮询 : Why do some messages come in twice?

reactjs - 使用 UUID 作为列表键会导致 React 中不必要的重新渲染吗?

javascript - 在不插入另一个对象的情况下更新 useState

javascript - 带有 React Router 的 ReactJS - Chrome 上的奇怪路由行为

reactjs - 滚动后如何检查元素是否可见? (跟踪展示次数和点击次数)

reactjs - 将获取功能放在单独的组件中

javascript - react Hook : How to read & update state in hooks without infinite loops with react-hooks/exhaustive-deps rule