【REACT】嵌套组件的生成

今天写了一个利用递归的方法,在页面上展示出一个树状的collapse, 样式如下:

样式

原始数据长下面这样,其中parent值为该行数据父亲的code值

   const data = [{ "code": 1000, "title": "一", "parent": 0 },
    { "code": 2000, "title": "二", "parent": 0 },
    { "code": 3000, "title": "三", "parent": 0 },
    { "code": 4000, "title": "四", "parent": 0 },
    { "code": 5000, "title": "五", "parent": 0 },
    { "code": 3010, "title": "3.1", "parent": 3000 },
    { "code": 3020, "title": "3.2", "parent": 3000 },
    { "code": 3030, "title": "3.3", "parent": 3000 },
    { "code": 3040, "title": "3.4", "parent": 3000 },
    { "code": 3050, "title": "3.5", "parent": 3000 },
    { "code": 3060, "title": "3.6", "parent": 3000 },
    { "code": 3041, "title": "3.4.1", "parent": 3040 },
    { "code": 3042, "title": "3.4.2", "parent": 3040 },
    { "code": 3043, "title": "3.4.3", "parent": 3040 }]

接下来我们用迭代的方法把这组数变个样,形成一个树状结构

const sortData = (data) => {
        let dataMap = new Map();

        data.forEach(element => {
            element.child = [];
            dataMap.set(element.code, element)
        });//将数据转变成map类型,key值为原始数据的code

        let newData = []
        data.forEach(element => {
            if (element.parent !== 0) {//如果这个值有父节点,就将他放到相对应父节点的child中
                dataMap.get(element.parent).child.push(element)
            }
            else {
                newData.push(element)//如果是父节点,就存进先前定义的cards数组里
            }
        });
        return newData;
    }

const newData = sortData(data)
我们console出来的树状结构的data是这样的:

结果

我的思路及页面设计是这样的:首先判断他是不是最外层父节点,如果是最外层父节点,且其下没有子节点(即parent=0 &&child.length==0),则生成一个panel,里面嵌套一个Card组件;如果是父节点,且有子节点,则在外面套一个panel,在panel里面再进行loop方法;如果是叶子结点,那个他没有child,且parent!=0,因此只需要输出一个Card组件就行啦。
代码如下:

const loop = data => data.map((item) => {
        const index = item.child;
        const content = index.length > 0 ? (
            <Collapse key={item.code}>
                <Panel key={item.code} header={item.title}>
                    {loop(item.child)}
                </Panel>
            </Collapse>

        ) : (
                item.parent == '0' ? (
                    <Collapse key={item.code}>
                        <Panel key={item.code} header={item.title}>
                            <Card key={item.code}>
                                <Row>
                                    {item.title}
                                </Row >
                            </Card >
                        </Panel>
                    </Collapse>
                ) : (
                        <Card key={item.code}>
                            <Row>
                                {item.title}
                            </Row >
                        </Card >)
            );
        return <div key={item.code} >{content}</div>;
    });

我使用的前端框架是ANTD,所以在return中这么写:

<Collapse key="father">
       {loop(newData)}
 </Collapse>

记住!在loop()外一定要套上<Collapse>,不然其中panel显示不出来。
另外,key值也是需要的,因为在递归过程中会形成多个组件,如果不写会报错。

【完】

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容