GetTree 获取树数据

简介

树数据源有很多种,为了方便获取数据之后的操作,对获取数据源和格式处理进行了封装。

axTreeMethod.getFullData

该函数可输出完整的树结构数据,返回一个对象{data:[],floorMax:'',idMax:''}。

  • data即为完整的树形数据,带children、id、label、pId、path、floor等属性
  • floorMax即为data的层级数量,最小为1
  • idMax即为data的最大id值,如果id为字符串则该值为0

注意:如果addPath为false,那么该函数直接返回data而不是带floorMax和idMax的对象。

该方法最终返回一个promise,如果需要继续操作需要在then中进行。

完整写法:axTreeMethod.getFullData(opt={}) ,参数说明如下:

  • source:必填项,数据源,支持多种格式:
    • 节点选择器字符串,例如#id、.className、nodeName等,节点应该是ul、ol、select、datalist四种中其中的一种
    • 节点对象,支持ul、ol、select、datalist四种节点
    • 链接字符串,与async配合使用,表示异步地址
    • 一维数组,带id和pId的一维数组
    • 多维数组,带children属性的多维数组
  • idStart:id初始值,选填项,默认为0;如果原数据没有id,该方法将给数据强制带上id
  • rootStart:顶级节点的pId,选填项,默认为-1;如果原数据不是带pId的一维数组,该方法将给数据强制带上pId。
  • replace:如果value属性值为空,是否用label值填充value值,选填项,默认为false即不替换;对source为节点有效。
  • async:是否为异步方式,选填项,默认为false;如果source参数为链接,那么此参数应该为true。
  • ajaxType:异步方式的类型,选填项,默认为post。
  • ajaxData:异步方式传递的数据,选填项,为一个对象,如果使用sql异步应该必填此参数。
  • addPath:输出值是否带上path和pId,选填项,默认为true。如果为false则函数仅输出数组数据,且数据中不带pId和path
  • loadDom:异步缓冲的节点,可以是#id、.className、nodeName或节点,选填项
  • instance:当前操作实例,选填项
  • xhrName:异步操作XMLHttpRequest的名字,选填项
  • opend:异步操作opened回调函数,选填项,支持参数response;如果没有该参数,但是填了instance和xhrName,那么会自动给实例追加xhrName
  • before:异步操作before回调函数,选填项,支持参数response;如果没有该参数,但是填了loadDom,那么会自动给loadDom追加loading属性
  • success:异步操作success回调函数,选填项,支持参数response
  • callback:获得数据后的回调函数,选填项,支持参数data即函数返回的最终数据

从ul/ol+li节点获取数据

  •                                             <ul id="ul">
                                                <li><a>北京</a>
                                                    <ul>
                                                        <li><a>朝阳区</a></li>
                                                        <li><a>丰台区</a></li>
                                                        <li><a>海淀区</a></li>
                                                    </ul>
                                                </li>
                                                <li><a>广东</a>
                                                    <ul>
                                                        <li><a>广州市</a></li>
                                                        <li><a>深圳市</a></li>
                                                    </ul>
                                                </li>
                                                <li><a>上海</a></li>
                                                <li><a>重庆</a></li>
                                            </ul>
                                            <a href="###" class="ax-btn" id="getUl">点击获取</a>
                                        
  •                                             axTreeMethod.getFullData({
                                                    source:'#ul'
                                                }).then((data)=>{
                                                    console.log('Ul数据:',data)
                                                });
                            

从select节点获取数据

点击获取
  •                                     <select id="select">
                                            <optgroup label="直辖市">
                                                <option value="北京">北京</option>
                                                <option value="上海">上海</option>
                                                <option value="重庆">重庆</option>
                                            </optgroup>
                                            <optgroup label="广东省">
                                                <option value="深圳">深圳</option>
                                                <option value="广州">广州</option>
                                                <option value="珠海">珠海</option>
                                                <option value="惠州">惠州</option>
                                            </optgroup>
                                            <optgroup label="湖南省">
                                                <option value="长沙">长沙</option>
                                                <option value="株洲">株洲</option>
                                                <option value="岳阳">岳阳</option>
                                                <option value="张家界">张家界</option>
                                            </optgroup>
                                            <optgroup label="江西省">
                                                <option value="南昌">南昌</option>
                                                <option value="赣州">赣州</option>
                                                <option value="宜春">宜春</option>
                                                <option value="九江">九江</option>
                                            </optgroup>
                                        </select>
                                        <a href="###" class="ax-btn" id="getSelect">点击获取</a>
                                        
  •                                             let select = document.querySelector('#select'),
                                                        getSelect = document.querySelector('#getSelect');
                                                    getSelect.onclick = () => {
                                                        axTreeMethod.getFullData({
                                                            source: select
                                                        }).then((data) => {
                                                            console.log('select数据:', data)
                                                        });
                                                    }
                            

从datalist节点获取数据

点击获取
  •                                             <datalist id="datalist">
                                                <option>Apple苹果</option>
                                                <option>Banana香蕉</option>
                                                <option>Tomato西红柿</option>
                                                <option>Grape葡萄</option>
                                                <option>Haw山楂</option>
                                                <option>Lemon柠檬</option>
                                                <option>Orange橙子</option>
                                            </datalist>
                                            <a href="###" class="ax-btn" id="getDatalist">点击获取</a>
                                        
  •                                         let datalist = document.querySelector('#datalist'),
                                                getDatalist = document.querySelector('#getDatalist');
                                                getDatalist.onclick = () => {
                                                axTreeMethod.getFullData({
                                                    source: datalist
                                                }).then((data) => {
                                                    console.log(data)
                                                });
                                            }
                            

从一维数组获取树数据

  •                                     <select id="select">
                                        <a href="###" class="ax-btn" id="get1d">点击获取</a>
                                        
  •             let get1d = document.querySelector('#get1d'),
                    d1 = [{
                        id: 1,
                        pId: 0,
                        label: "北京市"
                    }, {
                        id: 2,
                        pId: 1,
                        label: "朝阳区"
                    }, {
                        id: 3,
                        pId: 1,
                        label: "丰台区"
                    }, {
                        id: 4,
                        pId: 1,
                        label: "海淀区"
                    }, {
                        id: 5,
                        pId: 0,
                        label: "广东省",
                    }, {
                        id: 6,
                        pId: 5,
                        label: "广州市",
                    }, {
                        id: 7,
                        pId: 5,
                        label: "深圳市",
                    }, {
                        id: 8,
                        pId: 0,
                        label: '上海市',
                    }, {
                        id: 9,
                        pId: 0,
                        label: '重庆市'
                    },]
                get1d.onclick = () => {
                    axTreeMethod.getFullData({
                        source: d1,
                    }).then((data) => {
                        console.log(data)
                    });
                }
                            

id和pId为字符串的一维数组

  •                                     <select id="select">
                                        <a href="###" class="ax-btn" id="getUUID">点击获取</a>
                                        
  •                                         let getUUID = document.querySelector('#getUUID'),
                                                UUID = [{
                                                    id: 'FE5DE2AF-FAD2-0D30-B5BB-A7F39BF9D74C',
                                                pId: '4A906DD0-FD71-EB95-05FD-B1A5BC1EAF89',
                                                label: "北京市"
                                            }, {
                                                id: 'F9C5AD07-DA56-9925-752B-DB708C990FB1',
                                                pId: 'FE5DE2AF-FAD2-0D30-B5BB-A7F39BF9D74C',
                                                label: "朝阳区"
                                            }, {
                                                id: 'CC75A8A4-E37B-638B-E480-EF46FA77138D',
                                                pId: 'FE5DE2AF-FAD2-0D30-B5BB-A7F39BF9D74C',
                                                label: "丰台区"
                                            }, {
                                                id: '462CD1CB-6A4F-C190-60F9-4280E223FBA6',
                                                pId: 'FE5DE2AF-FAD2-0D30-B5BB-A7F39BF9D74C',
                                                label: "海淀区"
                                            }, {
                                                id: 'F9CDA624-8AAC-632B-C28A-F05E595562DD',
                                                pId: '4A906DD0-FD71-EB95-05FD-B1A5BC1EAF89',
                                                label: "广东省",
                                            }, {
                                                id: '876F4D96-2FDB-A730-2E77-05640E726E5A',
                                                pId: 'F9CDA624-8AAC-632B-C28A-F05E595562DD',
                                                label: "广州市",
                                            }, {
                                                id: '9C2BCDBF-A95E-3A68-8A00-8EC4E49972F7',
                                                pId: 'F9CDA624-8AAC-632B-C28A-F05E595562DD',
                                                label: "深圳市",
                                            }, {
                                                id: 'BB7E3FAF-22BB-6E67-9834-F3165F0C5DC6',
                                                pId: '4A906DD0-FD71-EB95-05FD-B1A5BC1EAF89',
                                                label: '上海市',
                                            }, {
                                                id: '6A15B3F4-9378-F032-5710-81B54FA30C28',
                                                pId: '4A906DD0-FD71-EB95-05FD-B1A5BC1EAF89',
                                                label: '重庆市'
                                            }]
                                            getUUID.onclick = () => {
                                                axTreeMethod.getFullData({
                                                    source: UUID,
                                                }).then((data) => {
                                                    console.log(data)
                                                });
                                            }
                            

从多维数组获取树数据

  •                                     <select id="select">
                                        <a href="###" class="ax-btn" id="get3d">从多维数组获取数据</a>
                                        
  •                                         let get3d = document.querySelector('#get3d'),
                                                d3 = [{
                                                    id: 1,
                                                    label: '北京市',
                                                    children: [{
                                                        id: 2,
                                                        label: '朝阳区'
                                                    }, {
                                                        id: 3,
                                                        label: '丰台区'
                                                    }, {
                                                        id: 4,
                                                        label: '海淀区'
                                                    },]
                                                }, {
                                                    id: 5,
                                                    label: '广东省',
                                                    children: [{
                                                        id: 6,
                                                        label: '广州市'
                                                    }, {
                                                        id: 7,
                                                        label: '深圳市'
                                                    },]
                                                }, {
                                                    id: 8,
                                                    label: '上海市',
                                                }, {
                                                    id: 9,
                                                    label: '重庆市'
                                                },]
                                            get3d.onclick = () => {
                                                axTreeMethod.getFullData({
                                                    source: d3,
                                                }).then((data) => {
                                                    console.log(data)
                                                });
                                            }
                            

从异步json获取数据

填了source参数,还需要通过async:true参数表明异步模式。

  •                                     <select id="select">
                                        <a href="###" class="ax-btn" id="getJson">点击获取</a>
                                        
  •                                             let getJson = document.querySelector('#getJson');
                                                getJson.onclick = () => {
                                                    axTreeMethod.getFullData({
                                                        source: ' ajax/treeSimple.json',
                                                        async: true,
                                                    }).then((data) => {
                                                        console.log(data)
                                                    });
                                                }
                            

从异步sql获取数据

必填ajaxData参数,向后台需要至少传递pId值,也就是告诉后台从哪一层开始获取数据。填了ajaxData已经表明了异步模式,此时不需要在填async参数。

  •                                     <select id="select">
                                        <a href="###" class="ax-btn" id="getSql">点击获取</a>
                                        
  •                                             let getSql = document.querySelector('#getSql');
                                                    getSql.onclick = () => {
                                                        axTreeMethod.getFullData({
                                                            source: 'ajax/treeSql.php',
                                                            ajaxData:{pId:0},
                                                        }).then((data) => {
                                                            console.log(data)
                                                        });
                                                    }
                            

异步回调函数

本函数在异步模式下支持opened(发送请求)、before(成功之前)和success(成功后)回调函数。

用户可以在三种状态下执行其他的程序片段,比如在opened阶段阻止请求;在before阶段使用loading缓冲;success阶段给出成功提示。

  •                                     <select id="select">
                                        <a href="###" class="ax-btn" id="getCb">点击获取</a>
                                        
  •             let getCb = document.querySelector('#getCb'),
                    loadindg = document.querySelector('#loading');
                getCb.onclick = () => {
                    axTreeMethod.getFullData({
                        source: 'ajax/treeSql.php',
                        ajaxData: { pId: 0 },
                        opened: () => {
                            console.log('开始获取数据');
                        },
                        before: () => {
                            loadindg.innerHTML = '正在获取数据,请稍后...';
                        },
                        success:()=>{
                            loadindg.innerHTML = '获取数据成功,请看控制台!';
                        }
                    }).then((data) => {
                        console.log(data)
                    });
                }
                            

不要floor、pId和path

如果仅仅需要获得普通原始数据,并不需要floor、pId和path属性,可对参数addPath设为false,此时函数将返回原始数组数据而不是带floorMax和idMax的对象了。

点击获取
  •                                     <datalist id="raw">
                                            <option>Apple苹果</option>
                                            <option>Banana香蕉</option>
                                            <option>Tomato西红柿</option>
                                            <option>Grape葡萄</option>
                                            <option>Haw山楂</option>
                                            <option>Lemon柠檬</option>
                                            <option>Orange橙子</option>
                                        </datalist>
                                        <a href="###" class="ax-btn" id="getRaw">点击获取</a>
                                        
  •                                         let raw = document.querySelector('#raw'),
                                                getRaw = document.querySelector('#getRaw');
                                            getRaw.onclick = () => {
                                                axTreeMethod.getFullData({
                                                    source: raw,
                                                    addPath: false,
                                                }).then((data) => {
                                                    console.log(data)
                                                });
                                            }