使用 React JS 从 JSON 数据创建树视图

Make a Tree view from JSON data using React JS

首先我是 React JS 的新手。所以我正在写这个问题。我正在尝试这个三天。 我要做的是,列出类别,比如-

Category1
->Sub-Category1
->Sub-Category2
Categroy2
Category3
.
.
.
CategoryN

我有这个 json 数据来制作列表

[
    {
        Id: 1,
        Name: "Category1",
        ParentId: 0,
    },
    {
        Id: 5,
        Name: "Sub-Category1",
        ParentId: 1,
    },
    {
        Id: 23,
        Name: "Sub-Category2",
        ParentId: 1,
    },
    {
        Id: 50,
        Name: "Category2",
        ParentId: 0,
    },
    {
        Id: 54,
        Name: "Category3",
        ParentId: 0,
    },
];

我试过很多开源例子,但是他们的json数据格式和我的不一样。所以那对我没有用。我已经构建了一些东西,但这并不像我预期的结果。这是我的 jsfiddle link 我所做的。 https://jsfiddle.net/mrahman_cse/6wwan1fn/

注意:每个子分类都会根据“ParentId”归入一个分类,如果有一个“ParentId”:0 那么,它实际上是一个分类,而不是子分类。请参阅 JSON

提前致谢。

您可以使用此代码jsfiddle

此示例允许添加新的嵌套类别,并进行嵌套搜索。

带注释的代码:

var SearchExample = React.createClass({
    getInitialState: function() {
        return {
            searchString: ''
        };
    },
    handleChange: function(e) {
        this.setState({
            searchString: e.target.value.trim().toLowerCase()
        });
    },
    isMatch(e,searchString){
        return e.Name.toLowerCase().match(searchString)
    },
    nestingSerch(e,searchString){
        //recursive searching nesting
        return this.isMatch(e,searchString) || (e.subcats.length && e.subcats.some(e=>this.nestingSerch(e,searchString)));
    },
    renderCat(cat){
        //recursive rendering
        return (
            <li key={cat.Id}> {cat.Name}
                {(cat.subcats && cat.subcats.length) ? <ul>{cat.subcats.map(this.renderCat)}</ul>:""}
            </li>);
    },
    render() {
        let {items} = this.props;
        let {searchString} = this.state;
         //filtering cattegories
        if (searchString.length) {
            items = items.filter(e=>this.nestingSerch(e,searchString))
            console.log(items);
        };
        //nesting, adding to cattegories their subcatigories
        items.forEach(e=>e.subcats=items.filter(el=>el.ParentId==e.Id));
        //filter root categories
        items=items.filter(e=>e.ParentId==0);
        //filter root categories
        return (
            <div>
                <input onChange={this.handleChange} placeholder="Type here" type="text" value={this.state.searchString}/>
                <ul>{items.map(this.renderCat)}</ul>
            </div>
        );
    }
});