在react js中渲染具有n个级别的目录结构数据
Render directory structure data with n numbers of levels in react js
我有一个目录结构的样本数据集如下
http://www.jsoneditoronline.org/?id=f9ce34de42f1a395e172f81c0c850da1
类似于目录,级别可以是n个数字。
在 React 中,我想使用此数据和 onClick 事件创建一个目录结构。
例如在第一页上应该显示根目录 children,当我点击第一个 child 时,应该显示第一个 child 的 children。
这就是我想要的,最初只有 3 个文件夹在根级别可见。
当我在第 1 层点击 child2 时,其他两个 children 可见,
当再次点击 child 2 时,它的 2 children 是可见的。
现在,如果我单击任何其他目录,它的 children 应该是可见的。
你能建议我用 redux 在 reactJs 中实现它的正确方法吗?
谢谢
您可以创建一个 Directory
组件,该组件将通过 props 将其子项传递给新的 Directory
组件来递归呈现。我创建了一个 JS fiddle here 来演示,代码如下。这个例子没有使用 redux,但是你仍然可以应用这个方法。
var DirectoryRoot = React.createClass({
getInitialState: function(){
var sample_dir = {
"id": 1,
"name": "P1",
"children": [{
"id": 2,
"name": "C1_P1",
"children": [{
"id": 3,
"name": "C1_C1_P1"
}, {
"id": 4,
"name": "C2_C1_P1",
"children": [{
"id": 5,
"name": "C1_C2_C1_P1"
}, {
"id": 9,
"name": "C2_C2_C1_P1"
}]
}]
}, {
"id": 6,
"name": "C2_P1"
}, {
"id": 7,
"name": "C3_P1",
"children": [{
"id": 8,
"name": "C1_C3_P1",
"children": [{
"id": 10,
"name": "C1_C1_C3_P1",
"children": [{
"name": "C1_C1_C1_C3_P1"
}]
}]
}]
}]
}
return {dirs: sample_dir, clicked: false};
},
handleClick: function(){
this.setState({clicked: !this.state.clicked});
},
render: function() {
var sub_dirs = this.state.dirs.children.map(function(dir){
return <Directory dirs={dir}/>
}.bind(this));
console.log(this.state.dirs)
return (<div onClick={this.handleClick}>
<div>Root {this.state.dirs.name} </div>
{this.state.clicked ?
<div style={{marginLeft:10}}> {sub_dirs} </div> : null
}
</div>)
//return <div> {this.recursiveDirRender(this.state.dirs)}</div>;
}
});
var Directory = React.createClass({
getInitialState: function(){
return {clicked: false}
},
handleClick: function(event){
event.stopPropagation();
this.setState({clicked: !this.state.clicked})
},
render: function(){
console.log(this.props.dirs)
var sub_dirs = this.props.dirs.children ?this.props.dirs.children.map(function(dir){
return (<div key={dir.key}>
<Directory dirs={dir}/>
</div>)
}.bind(this)) : null;
return (
<div onClick={this.handleClick}>
{this.props.dirs.name}
<div style={{marginLeft: 20, display: (this.state.clicked ? null: "none")}}> {sub_dirs} </div>
</div>
)
}
});
ReactDOM.render(
<DirectoryRoot/>,
document.getElementById('container')
);
我有一个目录结构的样本数据集如下
http://www.jsoneditoronline.org/?id=f9ce34de42f1a395e172f81c0c850da1
类似于目录,级别可以是n个数字。
在 React 中,我想使用此数据和 onClick 事件创建一个目录结构。 例如在第一页上应该显示根目录 children,当我点击第一个 child 时,应该显示第一个 child 的 children。
这就是我想要的,最初只有 3 个文件夹在根级别可见。
当我在第 1 层点击 child2 时,其他两个 children 可见,
当再次点击 child 2 时,它的 2 children 是可见的。 现在,如果我单击任何其他目录,它的 children 应该是可见的。
你能建议我用 redux 在 reactJs 中实现它的正确方法吗? 谢谢
您可以创建一个 Directory
组件,该组件将通过 props 将其子项传递给新的 Directory
组件来递归呈现。我创建了一个 JS fiddle here 来演示,代码如下。这个例子没有使用 redux,但是你仍然可以应用这个方法。
var DirectoryRoot = React.createClass({
getInitialState: function(){
var sample_dir = {
"id": 1,
"name": "P1",
"children": [{
"id": 2,
"name": "C1_P1",
"children": [{
"id": 3,
"name": "C1_C1_P1"
}, {
"id": 4,
"name": "C2_C1_P1",
"children": [{
"id": 5,
"name": "C1_C2_C1_P1"
}, {
"id": 9,
"name": "C2_C2_C1_P1"
}]
}]
}, {
"id": 6,
"name": "C2_P1"
}, {
"id": 7,
"name": "C3_P1",
"children": [{
"id": 8,
"name": "C1_C3_P1",
"children": [{
"id": 10,
"name": "C1_C1_C3_P1",
"children": [{
"name": "C1_C1_C1_C3_P1"
}]
}]
}]
}]
}
return {dirs: sample_dir, clicked: false};
},
handleClick: function(){
this.setState({clicked: !this.state.clicked});
},
render: function() {
var sub_dirs = this.state.dirs.children.map(function(dir){
return <Directory dirs={dir}/>
}.bind(this));
console.log(this.state.dirs)
return (<div onClick={this.handleClick}>
<div>Root {this.state.dirs.name} </div>
{this.state.clicked ?
<div style={{marginLeft:10}}> {sub_dirs} </div> : null
}
</div>)
//return <div> {this.recursiveDirRender(this.state.dirs)}</div>;
}
});
var Directory = React.createClass({
getInitialState: function(){
return {clicked: false}
},
handleClick: function(event){
event.stopPropagation();
this.setState({clicked: !this.state.clicked})
},
render: function(){
console.log(this.props.dirs)
var sub_dirs = this.props.dirs.children ?this.props.dirs.children.map(function(dir){
return (<div key={dir.key}>
<Directory dirs={dir}/>
</div>)
}.bind(this)) : null;
return (
<div onClick={this.handleClick}>
{this.props.dirs.name}
<div style={{marginLeft: 20, display: (this.state.clicked ? null: "none")}}> {sub_dirs} </div>
</div>
)
}
});
ReactDOM.render(
<DirectoryRoot/>,
document.getElementById('container')
);