Javascript 将JSX元素作为数组中另一个JSX元素的子元素推送(ReactJS)

Javascript 将JSX元素作为数组中另一个JSX元素的子元素推送(ReactJS),javascript,reactjs,Javascript,Reactjs,我正在编写一个react应用程序来打印嵌套对象数组中的树视图。默认情况下,每个节点都应该是可折叠打开的。一个节点可以有任意数量的子节点。以下是我试图实现的一个示例: 我正在收集数组中的所有节点组件,然后在render方法中访问该集合。现在,所有节点组件都以相同的继承人身份打印,因为它们彼此不嵌套。在下面的代码中,我如何添加这里是一个更新的解决方案。我希望这能帮助您理解如何递归地构建JSX对象 我还提供了一个示例供您查看,以便您可以看到工作代码 function createTree(data)

我正在编写一个react应用程序来打印嵌套对象数组中的树视图。默认情况下,每个节点都应该是可折叠打开的。一个节点可以有任意数量的子节点。以下是我试图实现的一个示例:


我正在收集数组中的所有节点组件,然后在render方法中访问该集合。现在,所有节点组件都以相同的继承人身份打印,因为它们彼此不嵌套。在下面的代码中,我如何添加这里是一个更新的解决方案。我希望这能帮助您理解如何递归地构建JSX对象

我还提供了一个示例供您查看,以便您可以看到工作代码

function createTree(data) {
    return (
        <ul>
            {
                data.map((node) => {
                    return createNode(node);
                })
            }
        </ul>
    );
}

function createNode(data) {
    if (data.nodes) {
        return (
      <li>
        <PrintNode text={ data.text }>{createTree(data.nodes)}</PrintNode>
      </li>
    );
    } else {
        return <PrintNode text={ data.text } />
    }
}

const PrintNode = (props) => {
    return <li>{ props.text }{ props.children }</li>
};

const App = (props) => {
    return createTree(props.data);
}

ReactDOM.render(<App data={ data } />, document.getElementById("app"));

const data = [
    {
        text: 'Parent 1',
        nodes: [
            {
                text: 'Child 1',
                nodes: [
                    {
                        text: 'Grandchild 1'
                    },
                    {
                        text: 'Grandchild 2'
                    }
                ]
            },
            {
                text: 'Child 2'
            }
        ]
    },
    {
        text: 'Parent 2'
    },
    {
        text: 'Parent 3'
    },
    {
        text: 'Parent 4'
    },
    {
        text: 'Parent 5'
    }
];

这里是一个更新的解决方案。我希望这能帮助您理解如何递归地构建JSX对象

我还提供了一个示例供您查看,以便您可以看到工作代码

function createTree(data) {
    return (
        <ul>
            {
                data.map((node) => {
                    return createNode(node);
                })
            }
        </ul>
    );
}

function createNode(data) {
    if (data.nodes) {
        return (
      <li>
        <PrintNode text={ data.text }>{createTree(data.nodes)}</PrintNode>
      </li>
    );
    } else {
        return <PrintNode text={ data.text } />
    }
}

const PrintNode = (props) => {
    return <li>{ props.text }{ props.children }</li>
};

const App = (props) => {
    return createTree(props.data);
}

ReactDOM.render(<App data={ data } />, document.getElementById("app"));

const data = [
    {
        text: 'Parent 1',
        nodes: [
            {
                text: 'Child 1',
                nodes: [
                    {
                        text: 'Grandchild 1'
                    },
                    {
                        text: 'Grandchild 2'
                    }
                ]
            },
            {
                text: 'Child 2'
            }
        ]
    },
    {
        text: 'Parent 2'
    },
    {
        text: 'Parent 3'
    },
    {
        text: 'Parent 4'
    },
    {
        text: 'Parent 5'
    }
];

您要做的不是附加组件,而是将数据放在应用程序状态对象上,然后更新应用程序组件内的数据状态。React会处理剩下的部分。要完成之后的工作,您需要递归地深入数据,并将新的PrintNodes附加到有子节点的PrintNodes上。@Kyle Richardson:这就是我在问题中提到的!但是如何在代码中实现呢?您需要做的不是附加组件,而是将数据放在应用程序状态对象上,然后更新应用程序组件中的数据状态。React会处理剩下的部分。要完成之后的工作,您需要递归地深入数据,并将新的PrintNodes附加到有子节点的PrintNodes上。@Kyle Richardson:这就是我在问题中提到的!但是如何在代码中实现呢?我添加了一个提琴。你能把你的代码合并进去吗?我能。。。但是如果你自己做,你会记得下次遇到这种情况时该怎么做。你为什么不尝试一下,如果它对你不起作用,发布你的进度,我可以从那里帮助你。我做了,但它给出了一个错误,无法读取undefined.data.mapnode=>{return createNodedata;};可能应该读取data.mapnode=>createNodenodeI我喜欢包装我的参数,并显式返回。显性总是比隐性好。编程的核心概念。我添加了一个提琴。你能把你的代码合并进去吗?我能。。。但是如果你自己做,你会记得下次遇到这种情况时该怎么做。你为什么不尝试一下,如果它对你不起作用,发布你的进度,我可以从那里帮助你。我做了,但它给出了一个错误,无法读取undefined.data.mapnode=>{return createNodedata;};可能应该读取data.mapnode=>createNodenodeI我喜欢包装我的参数,并显式返回。显性总是比隐性好。编程的核心概念。
function createTree(data) {
    return (
        <ul>
            {
                data.map((node) => {
                    return createNode(node);
                })
            }
        </ul>
    );
}

function createNode(data) {
    if (data.nodes) {
        return (
      <li>
        <PrintNode text={ data.text }>{createTree(data.nodes)}</PrintNode>
      </li>
    );
    } else {
        return <PrintNode text={ data.text } />
    }
}

const PrintNode = (props) => {
    return <li>{ props.text }{ props.children }</li>
};

const App = (props) => {
    return createTree(props.data);
}

ReactDOM.render(<App data={ data } />, document.getElementById("app"));

const data = [
    {
        text: 'Parent 1',
        nodes: [
            {
                text: 'Child 1',
                nodes: [
                    {
                        text: 'Grandchild 1'
                    },
                    {
                        text: 'Grandchild 2'
                    }
                ]
            },
            {
                text: 'Child 2'
            }
        ]
    },
    {
        text: 'Parent 2'
    },
    {
        text: 'Parent 3'
    },
    {
        text: 'Parent 4'
    },
    {
        text: 'Parent 5'
    }
];