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