如何使用 object 和 n 个子元素来创建组件?

How to create a component using an object with n number of childrens in react?

我有一个 object,我想将其发送到组件并创建 <ul> <li> 列表,如菜单。

    const Data = [
  {
    name: "Item 1",
    children: []
  },
  {
    name: "Item 2",
    children: []
  },
  {
    name: "Item 3",
    show: false,
    children: [
      {
        name: "Child Item 1",
        children: []
      },
      {
        name: "Child Item 2",
        children: []
      },
      {
        name: "Child Item 3",
        show: false,
        children: [
          {
            name: "Child Child Item 1",
            children: []
          }
        ]
      }
    ]
  }
];

现在我想将此数据解析为一个组件,并想创建一个包含 n 个数字的列表的菜单,而不使用任何静态值,它应该如下所示 html。

<ul>
  <li>
    <a>Item 1</a>
  </li>
  <li>
    <a>Item 2</a>
  </li>
  <li>
    <a>Item 3</a>
    <ul>
      <li>
        <a>Child Item 1</a>
      </li>
      <li>
        <a>Child Item 2</a>
      </li>
      <li>
        <a>Child Item 3</a>
        <ul>
          <li>
            <a>Child Child Item 1</a>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>;

我已经使用多个 map 函数完成了此操作,但如果我不知道 children 的数量,那将无法工作。

您可以像这样创建递归组件:

const TreeMenu = ({ data }) => {
    if (!data.children) // If it has no children just return its name
        return (
            <li>
                <a>{data.name}</a>
            </li>
        );

    return (
        <ul style={{ marginLeft: '1rem' }}>
            <a>{data.name}</a>
            {data.children.map((item) => (
                <TreeMenu data={item} />
            ))}
        </ul>
    );
};

我稍微修改了初始数据以使递归函数更容易:

const Data = {
    children: [
        {
            name: 'Item 1',
            children: [],
        },
        {
            name: 'Item 2',
            children: [],
        },
        {
            name: 'Item 3',
            show: false,
            children: [
                {
                    name: 'Child Item 1',
                    children: [],
                },
                {
                    name: 'Child Item 2',
                    children: [],
                },
                {
                    name: 'Child Item 3',
                    show: false,
                    children: [
                        {
                            name: 'Child Child Item 1',
                            children: [],
                        },
                    ],
                },
            ],
        },
    ],
};