打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用Vue实现一个树组件

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);        }        /* 模板隐藏 */        template {            display: none;        }    </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

效果图:

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
vue瀑布流布局
Photoshop从头学起?(01-84集)
ecshoph5打包_ecshoph5模板修改h5打包教程
Advanced Custom TreeView Layout in WPF
捉放爱 的影评 (18)
水中花【边框+文字竖列特效】 -
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服