Vue递归组件实现树结构

1.应用场景

实现树结构,点击当前部门实现子部门的动态加载

效果:

图片描述

2.代码描述:

为了简便没有搭建Vue环境,模拟数据实现动态加载

代码:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<div class='box'>
    <ul v-for="(item,index) in $store.state.department" :key="index">
        <tree-folder-contents :model="item"></tree-folder-contents>
    </ul>
</div>


<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
<script src="https://unpkg.com/vuex"></script>
<script type="text/javascript">
    const store = new Vuex.Store({
        state: {
            department: [
                {
                    "attribute": 0,
                    "departmentName": "产品组",
                    "deptFullName": "产品组",
                    "id": "8d3427d6eb18003ce7f3710362c718e2",
                    "leaveMessage": "",
                    "orgId": "5ce2e818-dbde-4a5d-acd0-9d69f10fafcb",
                    "parentDepart": "",
                    "parentPermission": "",
                    "permission": "",
                    "pinyin": "",
                    "showOrder": 1,
                    "totalUser": "3",
                    "wxId": "3",
                    "wxParentid": "1"
                },
                {
                    "attribute": 0,
                    "departmentName": "技术组",
                    "deptFullName": "技术组",
                    "id": "284813cd20f1b53ac5740ea019095f33",
                    "leaveMessage": "",
                    "orgId": "5ce2e818-dbde-4a5d-acd0-9d69f10fafcb",
                    "parentDepart": "",
                    "parentPermission": "",
                    "permission": "",
                    "pinyin": "",
                    "showOrder": 2,
                    "totalUser": "9",
                    "wxId": "2",
                    "wxParentid": "1"
                },
                {
                    "attribute": 0,
                    "departmentName": "事业二部",
                    "deptFullName": "事业二部",
                    "id": "783e4a3c77297585a590ca3e1441af27",
                    "leaveMessage": "",
                    "orgId": "5ce2e818-dbde-4a5d-acd0-9d69f10fafcb",
                    "parentDepart": "",
                    "parentPermission": "",
                    "permission": "",
                    "pinyin": "",
                    "showOrder": 3,
                    "totalUser": "19",
                    "wxId": "4",
                    "wxParentid": "1"
                }]
        },
        mutations: {
            add (state, o) {
                let department = state.department;
                (function fore (department, o) {
                    for (let i = 0; i < department.length; i++) {
                        if (department[i].id === o.deptId) {
                            Vue.set(department[i], 'children', o.deptlist)
                            return
                        }
                        if (department[i].children) {
                            fore(department[i].children, o)
                        }
                    }
                })(department, o)
            }
        }
    })

    Vue.component('tree-folder-contents', {
        template: '<li @click.stop="add()">\n' +
        '    {{model.departmentName}}\n' +
        '    <ul>\n' +
        '      <tree-folder v-for="(item,index) in model.children" :key="index" :model="item" v-if="model.children"></tree-folder>\n' +
        '    </ul>\n' +
        '  </li>',
        name: 'treeFolder',
        props: ['model'],
        methods: {
            add () {
                let that = this;
                let data = {
                    "deptId": "783e4a3c77297585a590ca3e1441af27",
                    "isDisplayMobilel": "0",
                    "superBigOrg": false,
                    "deptlist": [
                        {
                            "attribute": 0,
                            "departmentName": "测试一部",
                            "deptFullName": "事业二部->测试一部",
                            "id": "0266df6183cc4773873ec477bda7aefa",
                            "leaveMessage": "",
                            "orgId": "5ce2e818-dbde-4a5d-acd0-9d69f10fafcb",
                            "parentDepart": "783e4a3c77297585a590ca3e1441af27",
                            "parentPermission": "",
                            "permission": "",
                            "pinyin": "",
                            "showOrder": 0,
                            "totalUser": "3",
                            "wxId": "13",
                            "wxParentid": "4"
                        },
                        {
                            "attribute": 0,
                            "departmentName": "测试三部",
                            "deptFullName": "事业二部->测试三部",
                            "id": "05306f9c635e47fd9e2b325f431a1a50",
                            "leaveMessage": "",
                            "orgId": "5ce2e818-dbde-4a5d-acd0-9d69f10fafcb",
                            "parentDepart": "783e4a3c77297585a590ca3e1441af27",
                            "parentPermission": "",
                            "permission": "",
                            "pinyin": "",
                            "showOrder": 2,
                            "totalUser": "2",
                            "wxId": "15",
                            "wxParentid": "4"
                        },
                        {
                            "attribute": 0,
                            "departmentName": "测试总部",
                            "deptFullName": "事业二部->测试总部",
                            "id": "ded1f42dea724911a532dd757271dbaf",
                            "leaveMessage": "",
                            "orgId": "5ce2e818-dbde-4a5d-acd0-9d69f10fafcb",
                            "parentDepart": "783e4a3c77297585a590ca3e1441af27",
                            "parentPermission": "",
                            "permission": "",
                            "pinyin": "",
                            "showOrder": 3,
                            "totalUser": "0",
                            "wxId": "16",
                            "wxParentid": "4"
                        }
                    ]}
                that.$store.commit('add',data)
            }
        }
    })

    new Vue({
        el: '.box',
        store
    })
</script>
</body>
</html>

3.思路:

  1. Vuex存储组件要加载的数据
  2. 查找与之对应的父级部门id,把要添加的数据动态添加到对应父级部门的数据中
  3. vuex数据的属性添加后视图不能实时更新,要用到Vue.set()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值