一步步编写avalon组件05:树组件

给人印象中,树组件是异常使人怕惧的一个组件,超等庞杂,超等难写。但运用avalon2来做,这倒是级其简朴的一件事。首先从款式入做,无序列表是天然可用的树构造,几个UL元素套在一同,它们就天然处理好缩进题目。换言之,我们用UL元素作为树的节点,那末树组件内部也须要存在树组件,须要构成递归构造。avalon2的slot机制又是进场的时刻了。

因而我们的树的构造大概是

树
   子树
   子树
       子树

另外,树具有另有摺叠子树的功用,这好办,我们运用ms-visible完成隐蔽显现子树。经由过程ms-click来为ms-visible传参。


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="../dist/avalon.js"></script>
    </head>
    <body>
        <blockquote>
            <div ms-controller="tree">
                <wbr ms-widget="{is:'tree',tree: @data}" />
            </div>
            <script>
                function heredoc(fn) {
                    return fn.toString().replace(/^[^\/]+\/\*!?\s?/, '').
                            replace(/\*\/[^\/]+$/, '').trim().replace(/>\s*</g, '><')
                }
                var treeID = 0
                avalon.component('tree', {
                    template: heredoc(function () {
                        /*
                         <ul>
                         <li ms-for="(index, el) in @tree | get(0)">{{el.text}}
                         <span ms-click='@openSubTree(el)' ms-text="@changeIcon(el)"></span>
                         <div ms-visible="el.open" ms-html="@renderSubTree(el)">
                         
                         </div>
                         </li>
                         </ul>
                         */
                    }),
                    defaults: {
                        tree: [],
                        renderSubTree: function (el) {
                            return  el.subtree.length ? '<wbr ms-widget="{is:"tree", $id:"tree_' + (++treeID) + '", tree: el.subtree}" />' : ''
                        },
                        openSubTree: function (el) {
                            el.open = !el.open
                        },
                        changeIcon: function (el) {
                            return el.open && el.subtree.length ? '[-]' : '[+]'
                        }
                    }
                })


                avalon.define({
                    $id: "tree",
                    data: [
                        {text: "aaa", open: 1, subtree: [
                                {text: 1111, open: 1, subtree: []},
                                {text: 2222, open: 1, subtree: [
                                        {text: 777, open: 1, subtree: []}
                                    ]},
                                {text: 3333, open: 1, subtree: [
                                        {text: 8888, open: 1, subtree: []},
                                        {text: 9999, open: 1, subtree: [
                                                {text: '司徒正美', open: 1, subtree: []}
                                            ]}
                                    ]}
                            ]},
                        {text: "bbb", open: 1, subtree: [
                                {text: 4444, open: 1, subtree: []},
                                {text: 5555, open: 1, subtree: []},
                                {text: 6666, open: 1, subtree: []}
                            ]},
                        {text: "ccc", open: 1, subtree: []},
                        {text: "ddd", open: 1, subtree: []},
                        {text: "eee", open: 1, subtree: [
                                {text: 1234, open: 1, subtree: []}
                            ]},
                        {text: "fff", open: 1, subtree: []}
                    ]

                })
            </script>
        </blockquote>


    </body>
</html>

《一步步编写avalon组件05:树组件》

看,我们的树组件一会儿就出来,虽然看起来异常质朴,但的确是树,假如找设计师美化一下,添加些悦目的ICON,完全是ztree没有什么两样。固然我们也能够照搬ztree的图标。最主要的,代码太少了,保护起来超轻易。

    原文作者:司徒正美
    原文地址: https://segmentfault.com/a/1190000006192449
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞