material-ui 列表中的动态 nestedItems 来自 JSON 数据
material-ui dynamic nestedItems in List from JSON data
我正在使用 'material-ui/List' 中的 {List, ListItem, MakeSelectable} 在 React.js 中构建节点树。我最终会连接来自内部 Web 服务调用的 JSON 数据。我以声明方式创建嵌套列表没有问题:
<List>
...
<ListItem
...
nestedItems={[
<ListItem
...
我想要做的是以编程方式从JSON数据创建这个嵌套结构。实例化单个 <ListItem>
组件并将它们推送到数组中进行渲染非常容易,但我无法即时将嵌套项放入节点结构中。
到目前为止我能做的最好的事情是从下往上工作,找到 JSON 个节点的底层,将它们推入一个数组,创建 parent 组件,将我的 previously-created 数组分配为 parent 的 children,等等。
例如
var Children = [
<ListItem key={1} primaryText='Child 1' />
<ListItem key={2} primaryText='Child 2' />
]
然后...
var Parents = [
<ListItem key={0} primaryText='Parent 1' nestedItems={Children} />
]
这个有点麻烦;有没有更优雅的方式将嵌套 children 的 parent 映射到 material-ui <List>
?
我遇到了同样的问题,唯一的区别是我有一个 XML 中描述的菜单层次结构而不是 JSON。
我创建了一个主要组件 ConfigurationNav,您可以使用 <ConfigurationNav nav={this.state.nav}/>
:
对其进行实例化
var ConfigurationNav = React.createClass({
render: function() {
var items = [];
var _this = this;
this.props.nav.find('> navitem').each(function(i) {
items.push(<ConfigurationNavItem item={this} />);
});
return (
<List>
{items}
</List>
);
}
});
然后有一个子组件创建 ListItem
s:
var ConfigurationNavItem = React.createClass({
render: function() {
var nested = [];
for (var i=0; i<this.props.item.children.length; i++) {
nested.push(<ConfigurationNavItem item={this.props.item.children[i]} />);
}
return (
<ListItem key={this.props.item.id}
primaryText={this.props.item.getAttribute('label')}
nestedItems={nested}
/>
);
}
});
这种方法对我有用,但不知何故我失去了嵌套项目的缩进,仍在努力。
卢卡
假设我们有一个类似于下面的对象...
RootObject = {
children: [
{
children: [
{
children: [ {...props}, {...props}]
},
...props,
]
},
{
children: [...],
},
...
{
children: [],
},
],
...props,
}
现在我们需要创建一个将递归调用自身的树节点:
const mapStructure = (nodes) => {
if (nodes) {
return nodes.map(node => (
<ListItem
key={node.id}
primaryText={node.primaryText}
initiallyOpen //optional
nestedItems={mapStructure(node.children)}
/>
));
}
};
最后:
const DynamicNestedItems = ({ RootObject }) => {
return (
<List>
{mapStructure(RootObject)}
</List>
);
};
export default DynamicNestedItems;
我正在使用 'material-ui/List' 中的 {List, ListItem, MakeSelectable} 在 React.js 中构建节点树。我最终会连接来自内部 Web 服务调用的 JSON 数据。我以声明方式创建嵌套列表没有问题:
<List>
...
<ListItem
...
nestedItems={[
<ListItem
...
我想要做的是以编程方式从JSON数据创建这个嵌套结构。实例化单个 <ListItem>
组件并将它们推送到数组中进行渲染非常容易,但我无法即时将嵌套项放入节点结构中。
到目前为止我能做的最好的事情是从下往上工作,找到 JSON 个节点的底层,将它们推入一个数组,创建 parent 组件,将我的 previously-created 数组分配为 parent 的 children,等等。 例如
var Children = [
<ListItem key={1} primaryText='Child 1' />
<ListItem key={2} primaryText='Child 2' />
]
然后...
var Parents = [
<ListItem key={0} primaryText='Parent 1' nestedItems={Children} />
]
这个有点麻烦;有没有更优雅的方式将嵌套 children 的 parent 映射到 material-ui <List>
?
我遇到了同样的问题,唯一的区别是我有一个 XML 中描述的菜单层次结构而不是 JSON。
我创建了一个主要组件 ConfigurationNav,您可以使用 <ConfigurationNav nav={this.state.nav}/>
:
var ConfigurationNav = React.createClass({
render: function() {
var items = [];
var _this = this;
this.props.nav.find('> navitem').each(function(i) {
items.push(<ConfigurationNavItem item={this} />);
});
return (
<List>
{items}
</List>
);
}
});
然后有一个子组件创建 ListItem
s:
var ConfigurationNavItem = React.createClass({
render: function() {
var nested = [];
for (var i=0; i<this.props.item.children.length; i++) {
nested.push(<ConfigurationNavItem item={this.props.item.children[i]} />);
}
return (
<ListItem key={this.props.item.id}
primaryText={this.props.item.getAttribute('label')}
nestedItems={nested}
/>
);
}
});
这种方法对我有用,但不知何故我失去了嵌套项目的缩进,仍在努力。
卢卡
假设我们有一个类似于下面的对象...
RootObject = {
children: [
{
children: [
{
children: [ {...props}, {...props}]
},
...props,
]
},
{
children: [...],
},
...
{
children: [],
},
],
...props,
}
现在我们需要创建一个将递归调用自身的树节点:
const mapStructure = (nodes) => {
if (nodes) {
return nodes.map(node => (
<ListItem
key={node.id}
primaryText={node.primaryText}
initiallyOpen //optional
nestedItems={mapStructure(node.children)}
/>
));
}
};
最后:
const DynamicNestedItems = ({ RootObject }) => {
return (
<List>
{mapStructure(RootObject)}
</List>
);
};
export default DynamicNestedItems;