首页 > 其他 > 详细

使用Vue实现一个树组件

时间:2020-01-15 17:48:59      阅读:102      评论:0      收藏:0      [点我收藏+]

HTML代码:

技术分享图片
<!DOCTYPE html>
<html>
<head>
    <title>Vue Demo</title>

    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <style type="text/css">
        /* span样式 */
        .treeviewitem-span {
            font-size: 14px;
        }

        /* 箭头样式 */
        .treeviewitem-arrow-icon {
            margin-top: 3px;
            margin-left: 3px;
            margin-right: 3px;
            float: left;
            width: 0;
            height: 0;
            border-top-width: 6px;
            border-right-width: 0px;
            border-bottom-width: 6px;
            border-left-width: 6px;
            border-style: solid;
            border-color: transparent transparent transparent #666666;
            transform: rotate(0deg);
        }

        /* 90度旋转箭头样式 */
        .treeviewitem-arrow-icon90 {
            margin-top: 3px;
            margin-left: 3px;
            margin-right: 3px;
            float: left;
            width: 0;
            height: 0;
            border-top-width: 6px;
            border-right-width: 0px;
            border-bottom-width: 6px;
            border-left-width: 6px;
            border-style: solid;
            border-color: transparent transparent transparent #666666;
            transform: rotate(90deg);
        }
    </style>

    <script type="text/javascript" src="vue.js"></script>
    <script type="text/javascript">

    </script>
</head>
<body>
    <!-- treeviewitem模板 -->
    <template id="treeviewitem">
        <div>
            <div style="background-color:transparent; cursor:default; height:25px;"><div v-on:click="expand" style="width:16px; height:16px; float:left; background-color:transparent;"><span v-bind:class="[self.expand ? ‘treeviewitem-arrow-icon90‘:‘treeviewitem-arrow-icon‘]" v-if="isLeaf"></span></div><input type="checkbox" v-on:click="checkboxClick" v-model="self.selected" /><span v-on:click="itemClick" class="treeviewitem-span">{{ self.name }}</span></div>
            <div v-if="self.expand" v-for="item in items" style="margin-left:20px;">
                <treeviewitem v-bind:items="item.items" v-bind:self="item"></treeviewitem>
            </div>
        </div>
    </template>

    <!-- treeview模板 -->
    <template id="treeview">
        <div>
            <div v-for="item in items">
                <treeviewitem v-bind:items="item.items" v-bind:self="item"></treeviewitem>
            </div>
        </div>
    </template>

    <div id="app">
        <!-- 使用treeview组件 -->
        <treeview v-bind:items="items"></treeview>
        <br />
        <button onclick="showSelectedResult()">勾选结果</button>
    </div>

    <script type="text/javascript">
        //定义treeviewitem组件
        Vue.component(treeviewitem, {
            props: [items, self],
            template: #treeviewitem,
            methods: {
                itemClick: function (d) {
                    alert("您单击了节点:" + this.self.name);
                },
                checkboxClick: function (e) {
                    var checkChild;
                    checkChild = function (items, checked) {
                        for (var i = 0; i < items.length; i++) {
                            var item = items[i];
                            item.selected = checked;
                            if (item.items) {
                                checkChild(item.items, checked)
                            }
                        }
                    };

                    if (e.target.checked) {
                        checkChild(this.items, true);
                    } else {
                        checkChild(this.items, false);
                    }
                },
                expand: function (e) {
                    if (this.self.expand) {
                        this.self.expand = false;
                    } else {
                        this.self.expand = true;
                    }
                }
            },
            computed: {
                isLeaf: function () {
                    if (this.items && this.items.length > 0) {
                        return true;
                    }
                    return false;
                }
            }
        });

        //定义treeview组件
        Vue.component(treeview, {
            props: [items],
            template: #treeview
        });

        //定义vm
        var vm = new Vue({
            el: #app,
            methods: {
                /**
                 * @description 获取勾选结果
                 */
                getSelected: function (items) {
                    if (!items) items = this.items;

                    var result = [];
                    for (var i = 0; i < items.length; i++) {
                        var item = items[i];
                        if (item.selected) {
                            result.push(item.name);
                        }
                        if (item.items) {
                            var childSelected = this.getSelected(item.items);
                            for (var k = 0; k < childSelected.length; k++) {
                                result.push(childSelected[k]);
                            }
                        }
                    }
                    return result;
                }
            },
            data: {
                items: [
                    {
                        name: 条目1,
                        expand: true,
                        selected: false,
                        items: [
                            {
                                name: 条目11,
                                expand: true,
                                selected: false,
                                items: [
                                    {
                                        name: 条目111,
                                        expand: true,
                                        selected: true,
                                    }
                                ]
                            },
                            {
                                name: 条目12,
                                expand: false,
                                selected: false,
                                items: [
                                    {
                                        name: 条目121,
                                        expand: true,
                                        selected: false,
                                    },
                                    {
                                        name: 条目122,
                                        expand: true,
                                        selected: false,
                                        items: [
                                            {
                                                name: 条目1221,
                                                expand: true,
                                                selected: false
                                            },
                                            {
                                                name: 条目1222,
                                                expand: true,
                                                selected: false
                                            }
                                        ]
                                    }
                                ]
                            },
                            {
                                name: 条目13,
                                expand: true,
                                selected: false
                            }
                        ]
                    },
                    {
                        name: 条目2,
                        expand: true,
                        selected: false
                    },
                    {
                        name: 条目3,
                        expand: true,
                        selected: false,
                        items: [
                            {
                                name: "条目31",
                                expand: true,
                                selected: false
                            }
                        ]
                    }
                ]
            }
        })

        //显示勾选结果
        function showSelectedResult() {
            var selected = vm.getSelected();
            alert("您勾选了:" + selected.join(, ));
        }
    </script>
</body>
</html>
View Code

效果图:

技术分享图片

 

使用Vue实现一个树组件

原文:https://www.cnblogs.com/s0611163/p/12197576.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!