1 Star 0 Fork 11

浪人 / xntree

forked from 范媛媛 / xntree 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

xntree 仙女座树插件

树组件、原生js、jquery、tree、大数据量、虚拟树、vue

简介

最近开发一个复杂的核算项目,原项目用的是elementui,所以就继续使用elementui框架 这个功能块并不是复杂,但是很麻烦,各种表单的关联查询,最难受的是一个页面里面有很多树形组件,有的组件有很大的数据量,可能会超过几千个节点,但是elementui又没有提供渲染大型数据的方式,我又打开了ztree的网站,其实从来都没有用过ztree,因为ztree提供了很多功能,但是实际上我是用不到这些功能的,更重要的是,ztree的样式还是有一点点古老,实在是懒得去调整样式了,最后还是决定还是自己开发个插件吧。

  • xntree是直接利用虚拟列表的概念开发的,所以每次在页面渲染的节点数是很少的,可能仅有二三十条数据
  • 所有节点是同层级的,父节点和子节点并不是嵌套的层级关系,所以节点的缩进样式只是为每个节点增加了左侧的空白节点

插件工作过程

  1. 对原始的嵌套结构数据进行展开操作,例如:

    let data=[{id:1,name:'节点1',children:[{id:11,name:'子节点'}]}]//原始数据 let flatJson=getFlatData(data)//展开数据 //获取以下结构的数据 flatJson={1:{id:1,name:'节点1',children:[{id:11,name:'子节点'}]},11:{id:11,name:'子节点'}}

  2. 获取到flatJson之后,后续对节点的增删改查等操作很多就可以利用这个数据了

  3. 每次对数据进行更新之后,都可以调用绘制方法,对页面进行重绘,所以任何操作其实都不用直接操作dom

  4. 关于页面的渲染,可以参考这篇文章 地址

  • 虚拟树和列表的不同在于,树是可以收起和展开的,所以目前每次渲染页面,我都会从第一条数据开始遍历,判断当前节点是否收起,如果收起就不在计算范围内,我会根据节点的显示情况判断这个节点是否要进行绘制,当然在这个过程中,我们还要计算当前树的总高度,所以相对来说,还是有一些性能消耗的,在数据量很大并快速的拖拽滚动条的时候,有时候会有空白的现象,但总体不影响效果,此处的算法后续还会进行优化。

#2021/11/22 V1.2.1(已发布)

  • 修复移动节点的bug

#2021/09/07 V1.1.1(已发布)

  • 更新方法 setSelectKey(key, triggerClick, needLocate),triggerClick:Boolean,是否触发点击回调,needLocate:Boolean,是否自动定位到选中节点
  • 添加lazyLoad参数,是否需要异步加载数据 添加属性方法 option={on:{loadData: async (node){return new Promise((resolve)=>{resolve(newNodes)})}}}, 在loadData中异步获取数据

2021/07/21 V1.0.1(已发布)

  • 增加方法:setSelectKey(key),设置当前选中节点
  • 增加监听属性:dblclickNode,监听双击事件
  • 增加属性:disableMoveNode(movingNode,onNode,movingDir),判断该节点是否可以移动

2021/07/07 V1.0.1(已发布)

  • 增加对list类型原始数据的支持,option增加dataType属性(list/tree)

2021/07/07 V1.0.0(已发布)

概要

原生JS树,虚拟树组件,可支持超大数据量:

  • 支持超大数据量
  • 搜索功能
  • 多选框
  • 单选框
  • 节点增删改
  • 节点移动
  • 自定义显示

后续还将增加其他的类型和配置,敬请期待哦!

如果本插件不能满足您的使用需求,请提交issue,我将尽快对插件进行更新。

插件样式示例:

avatar

使用步骤

下载代码

压缩版本引用

<script type="text/javascript" src="./dist/xntree.min.js"></script>

ES6 import方式引用

//直接引用src文件夹下的js文件
import xnTree from 'src/xnTree.js'

VUE组件

本插件简单封装了一个vue组件,代码请见XnTree.vue,组件使用示例请见Test.vue

插件使用

html代码

//初始化dom容器,注意容器一定要有height或max-height,这样才能计算每次要渲染多少条数据
<div id="tree" style="width:400px;height:400px"></div>

js代码

let option = {
        label: (d,ins) => {
            let t=ins.replaceKey(d.text, document.querySelector('#keyword').value)
            let dom = `
                        <div style="display: flex;justify-content: space-between">
                        <div>
                            <span>${d.id}</span>
                            <span>
                                ${t}
                            </span>
                        </div>
                        <div class="xntree-ope">
                            <a class="delete-node">删除</a>
                            <a class="add-node">新增</a>
                            <a class="edit-node">编辑</a>
                        </div>
                        </div>
                        `
            return dom;
        },
        id: 'id',
        pId: false,
        selectType: 'checkbox',//radio,null,checkbox
        canMove: true,
        checkDisabled: function (d) {
            return d.id == '001'
        },
        autoOpen: function (d, level) {
            return level <= 0;
        },
        checkSticky: {//check关联
            on: '',//p,自动勾选父,c自动勾选子,function
            off: 'pc'
        },
        on: {
            clickNode: ($t, nodedata, nodekey) => {
                if ($t.hasClass('add-node')) {
                    addNode(nodekey,'新节点')
                    return false;
                }
                if ($t.hasClass('delete-node')) {
                    deleteNode(nodekey)
                    return false;
                }
                if ($t.hasClass('edit-node')) {
                    editNode(nodekey,'新名称')
                    return false;
                }
                console.log(nodedata);
                return true;//true则设置该节点为当前点击元素,false反之
            },
            checkChange: (checkedData) => {
                console.log(checkedData);
            },
            moveChange: (movedNode, currentData) => {
                console.log(currentData);
            }
        }
    }
    let xntree = new xnTree(document.querySelector('#tree'), bigdata, option)

初始化参数

let xntree = new xnTree(容器 element, 数据 data, 配置 option)

option

{
    label:string|func,//string:直接传属性名,func:(当前节点数据,插件实例)=>{},设置func可以自定义节点内容
    id:string,//属性名
    pId:string|false,//父节点ID的属性名,当为false的时候,插件会自动添加一个属性$pId作为父节点ID属性
    lineHeight:number,//行高(默认32),当前版本的节点只能设置固定的行高
    autoOpen:false|func:(当前节点,当前节点所在层级从0开始){return true},//初始化时是否自动展示节点
    selectType:'checkbox'|'radio'|false,//显示checkbox或radio,为false时不显示
    checkSticky:{//当显示checkbox的时候,选择某个节点是否自动关联父子节点
        on: '',//选中某节点时,p为自动勾选父节点,c为自动勾选子节点,不写为不关联
        off: 'pc',//,取消选中时
    },
    checkDisabled: function (d)=> {return d.id == '001'},//设置不能选中的节点
    canMove:true|false,//是否开启节点移动
    hideIcon:true,//是否隐藏默认节点图标
    on:{//事件监听
        clickNode: ($t, node, id,event) => {},//$t:当前点击元素,node:当前点击节点,id:节点id,event:点击事件
        checkChange:(node,checked,allChecked,isManual)=>{},//选中节点变化事件,node:点击节点,checked:当前节点选中状态,allChecked:当前选中所有节点数据,isManual:是否是手动调用方法设置选中状态
        moveChange:(movingNode,currentData)=>{},//movingNode:当前移动的节点,currentData:插件数据
        }
}

方法

  • getChecked():获取选中数据
  • checkAll(justResult):选中全部,justResult为true则仅选择当前搜索结果
  • clearAll():清空所选项
  • setCheckedKeys(keys):设置选中节点,keys为选中的节点id的数组
  • setCheckedNodes(nodes):设置选中节点,nodes为选中节点的数组
  • editNode(node):编辑节点
  • addNode(id,node):添加节点,id:添加到的父节点id,当添加根节点时id为null,node新节点数据
  • deleteNode(id):删除节点
  • getNodeById(id):获取某个节点数据
  • resize():重新计算容器高度
  • refreshDom():重新绘制
  • destory():销毁实例,主要用于清除绑定事件

示例代码请参考 index.html

后续功能点

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [范媛媛] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

树组件、原生js、jquery、tree、大数据量、虚拟树、vue 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/the_surf/xntree.git
git@gitee.com:the_surf/xntree.git
the_surf
xntree
xntree
main

搜索帮助