zTree的使用

  zTree ,一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点。兼容 IE、FireFox、Chrome 等浏览器,在一个页面内可同时生成多个 Tree 实例、支持 JSON 数据、支持一次性静态生成 和 Ajax 异步加载 两种方式、支持多种事件响应及反馈、支持 Tree 的节点移动、编辑、删除、支持任意更换皮肤 / 个性化图标(依靠css)、支持极其灵活的 checkbox 或 radio 选择功能、简单的参数配置实现 灵活多变的功能等特点。

 

1、  zTree的核心是zTree(setting, [zTreeNodes])两个属性,这个函数接受一个JSON格式的数据对象setting和一个JSON格式数据的zTreeNodes从而来构建ztree。

2、  setting : zTree 的参数配置都在这里完成,简单的说:树的样式、事件、访问路径等都在这里配置,setting参数数量较多,具体可参考zTree的API,例如:

var setting = {  

    showLine: true,  

    checkable: true  

};

3、  zTreeNodes:是ztree的全部节点数据结合,采用由JSON对象组成的数据结构;zTreeNodes的格式分为两种:利用Json格式嵌套体现父子关系和Array简单格式。

带有父子关系的标准zTreeNodes如下:

var zTreeNodes = [  

    {"id":1, "name":"test1", "nodes":[  

      {"id":11, "name":"test11", "nodes":[  

        {"id":111, "name":"test111"}  

      ]},  

      {"id":12, "name":"test12"}  

    ]},  

    ......  

];

带有父子关系的简单 Array 格式(isSimpleData)的 zTreeNodes 举例:

var treeNodes = [                                                                        

    {"id":1, "pId":0, "name":"test1"},  

    {"id":11, "pId":1, "name":"test11"},  

    {"id":12, "pId":1, "name":"test12"},  

    {"id":111, "pId":11, "name":"test111"},  

    ......  

]; 

 

4.ztree详细使用例子

1、添加样式、js
 
<link rel="stylesheet" href="${ctx}/hollybeacon/resources/plugins/zTree_v3/css/demo.css" type="text/css">
<link rel="stylesheet" href="${ctx}/hollybeacon/resources/plugins/zTree_v3/css/zTreeStyle/zTreeStyle.css" type="text/css">
<script type="text/javascript" src="${ctx}/hollybeacon/resources/plugins/zTree_v3/js/jquery.ztree.core-3.5.js"></script>
<script type="text/javascript" src="${ctx}/hollybeacon/resources/plugins/zTree_v3/js/jquery.ztree.excheck-3.5.js"></script>
<script type="text/javascript" src="${ctx}/hollybeacon/resources/plugins/zTree_v3/js/jquery.ztree.exedit-3.5.js"></script>
如果想要hideNodes、showNodes等方法,必须加入
<script type="text/javascript" src="${ctx}/hollybeacon/resources/plugins/zTree_v3/js/jquery.ztree.exhide-3.5.js"></script>
如果不需要那些hideNodes、showNodes等方法以只添加一个js,代替上面的三个js
<script type="text/javascript" src="${ctx}/hollybeacon/resources/plugins/zTree_v3/js/jquery.ztree.all-3.5.min.js"></script>
 
2、html设置一个div、ul,注意ul的class是固定的ztree
 
<div class="treecontentpane">
     <ul id="busTree" class="ztree">
     </ul>
</div>
 
3、写js操作数据
 
 1、setting配置详情
var setting = {
    //显示
    view: {
             selectedMulti: false, //在复制的时候,是否允许选中多个节点。true为支持,按下ctrl键生效,false不支持。
            dblClickExpand: false, //双击的时候是否切换展开状态。true为切换,false不切换
             fontCss: setFontCss_ztree  //设置节点的颜色
     },
    //增删改,移动复制
    edit: {
     enable: true, //如果enable为flase,那么树就不能移动了
     showRemoveBtn: true, //是否显示树的删除按钮
     showRenameBtn: true, //是否显示数的重命名按钮
     isSimpleData : true, //数据是否采用简单 Array 格式,默认false
     treeNodeKey : "id",  //在isSimpleData格式下,当前节点id属性
     treeNodeParentKey : "parentId",//在isSimpleData格式下,当前节点的父节点id属性
     showLine : true, //是否显示节点间的连线
     removeTitle: "删除节点",//删除Logo的提示
     renameTitle: "编辑节点",//修改Logo的提示
     //拖拽
     drag: {
      isCopy: true,//能够复制
      isMove: true,//能够移动
     prev: false,//不能拖拽到节点前
      next: false,//不能拖拽到节点后
      inner: true//只能拖拽到节点中
     }
    },
    //异步
    async: {
     enable: true, //开启异步加载
     type:"get",
     url:holly.getPath() + "/rest/treeCode/showZtreeSyncRest",
     contentType:"application/json",
     autoParam: ["id"], //异步加载数据,自动添加id参数,会自动获取当前节点的id值
     dataFilter:filter, //过滤,跟easy-ui中的loadFilter方法一样。
    otherParam: { "id":"1", "code_name":"固网测试"}//提交的时候就会提交参数id=1&code_name=固网测试
    },
    data:{
     key:{
      name:"codeName" //节点显示的值
     },
     //
     simpleData:{
      enable:true,//如果为true,可以直接把从数据库中得到的List集合自动转换为Array格式。而不必转换为json传递
      idKey:"id",//节点的id
      pIdKey:"parentId",//节点的父节点id
      rootPId:null
     }
    },
    //回调函数
    callback: {
     beforeDrag: beforeDrag,//拖拽之前
     beforeDrop: beforeDrop,//拖拽结束
     onDrop: zTreeOnDrop,//拖拽结束后
     //onDrag: zTreeOnDrag,//拖拽的时候
     beforeRemove: zTreeBeforeRemove,//删除节点前
     onRemove: zTreeOnRemove,//节点删除之后
     beforeEditName: zTreeBeforeEditName,//进行编辑之前
     //beforeRename: zTreeBeforeRename,//重命名节点之前
     //onRename: zTreeOnRename,//重命名之后
     onClick: zTreeOnClick,//点击
     onRightClick: zTreeOnRightClick,//右键
     onAsyncSuccess: zTreeOnAsyncSuccess//异步加载
     //beforeExpand: beforeExpand,//展开节点前
     //onAsyncSuccess: onAsyncSuccess,//异步数据加载成功的回调
    //onAsyncError: onAsyncError //异步数据加载错误后回调
    }
   };
2、zTree回调方法
  //对得到的json数据进行过滤,加载树的时候执行
   function filter(treeId, parentNode, responseData) {
      var contents = (responseData.content)?responseData.content:responseData;
      //当第一次加载的时候只显示一级节点,但是要让别人知道对应一级节点下是否有数据,那么就需要设置isParent,为true可以展开,下面有数据。
    //我这里是由于异步加载数据,只加载根节点以及一级节点。那么一级节点下还有子节点,所以设置isParent显示还有子节点的效果
      if(contents.length >0){
       for(var i= 0 ; i <contents.length;i++){
       //是否是叶子节点
        var isParent = contents[i].isParent;
        if(isParent == false){
         isParent = true;
        }else{
         isParent = false;
        }
        contents[i].isParent = isParent;
       }
      }
      return contents;
     };
    //节点异步加载完成后显示形状
   //加载树的默认显示根节点,以及一级节点,每次异步加载数据都会执行这个方法,也就是有请求都会异步
    function zTreeOnAsyncSuccess(event, treeId, msg) {
      try {
      var treeObj = $.fn.zTree.getZTreeObj("busTree");
       //获取所有节点
       var nodes = treeObj .getNodes();
       for(var i = 0;i<nodes.length;i++){
       //展开一级节点
        treeObj .expandNode(nodes[i], true);
       }
      } catch (err) {
       holly.showError("数据异常", err);
      }
    }
    //设置一个标识,是为了解决点击的时候,执行异步。显示所有的以及节点,以及一级节点下的所有节点
   注意:如果你是异步只加载了根节点和一级节点,那么增删改的时候,得到的异步结果,会获取不到该节点的子节点,只有zTreeOnAsyncSuccess方法执行完后,才能够取到子节点的信息。所以在Eclipse中run执行和debugger执行得到不同的结果。因为run运行数据还没接受到。
    /* var firstAsyncSuccessFlag = 0;
    function zTreeOnAsyncSuccess(event, treeId, msg) {
     if (firstAsyncSuccessFlag == 0 ) {
      try {
      var treeObj = $.fn.zTree.getZTreeObj("busTree");
       var selectedNode = zTree.getSelectedNodes();
      //获取整个json节点
       var nodes = zTree.getNodes();
       //展开根节点下的第一个节点
      treeObj.expandNode(nodes[0], true);
       //把根节点下的所有节点转换为数组
       var childNodes = zTree.transformToArray(nodes[0]);
       //展开根节点下的第一个节点的第一节节点
       treeObj .expandNode(childNodes[1], true);
       //选中根节点下的第一个节点
       treeObj .selectNode(childNodes[1]);
      firstAsyncSuccessFlag = 1;
      } catch (err) {
       holly.showError("数据异常", err);
      }
     }
    }*/
   //初始化树
   zTree = $.fn.zTree.init($("#busTree"), setting);
   //获取树
   var treeObj = $.fn.zTree.getZTreeObj("busTree");
   //异步刷新整个树,不推荐使用
   treeObj.reAsyncChildNodes(null, "refresh");
   //新增的时候局部刷新,刷新子节点
   treeObj.reAsyncChildNodes(zTree.getSelectedNodes().childNodes,"refresh");
   //修改的节点的时候,更改节点信息
   //1、设置节点值
   treeObj.getSelectedNodes()[0].codeName = $("#treeRootCodeName").val();
   treeObj.getSelectedNodes()[0].codeValue = $("#treeRootCodeValue").val();
   treeObj.SelectedNodes()[0].remark = $("#treeRootRemark").val();
   //2、更新节点信息
   treeObj.updateNode(zTree.getSelectedNodes()[0]);
    //搜索功能:
    1、根据查询的结果,显示对应树形结构。注意这里只能是对应查找几级节点的信息,还有待优化。
    //根据code_name模糊查询
    function searchByValue(){
        var zTree = $.fn.zTree.getZTreeObj("treeDemo");
        //经过transformToArray转换后是一个Array数组,数组里的每个元素都是object对象,这个对象里包含了node的21个属性。
        var nodes = zTree.transformToArray(zTree.getNodes()[0].children);
        var key=$("#codeName").val();
        //空格回车符 不做查询 直接显示全部
        if(/^\s*$/.test(key)){
         //updateNodes(false);
         zTree.showNodes(nodes);
         return;
        }
        //首先隐藏
        zTree.hideNodes(nodes);
        var nodeList=zTree.getNodesByParamFuzzy("CODE_NAME", key); //模糊匹配
        //把得到的节点放到filterNodes临时数组中
        var filterNodes=[];
        for(var i=0;i<nodeList.length;i++){
            //这里只能是级别是2的
             if(nodeList[i].level==2) {
                filterNodes.push(nodeList[i]);
             }
        }
        //显示
        zTree.showNodes(filterNodes);
        //取得每一个节点的父节点,进行展示
        for(var i=0;i<filterNodes.length;i++){
             //主要是找不到父节点的问题
               var parentNode = filterNodes[i].getParentNode();
            //展开当前节点的父节点下的所有节点
             zTree.expandNode(parentNode, true, false, false);
             //显示所有父节点
             zTree.showNode(parentNode);         
         }
    }
    2、搜索变色功能,但是会显示全部信息,查询到的结果会显示不同的颜色
    //展开所有节点
    function expand_ztree(treeId){
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        treeObj.expandAll(true);
    }
    //节点没有父节点,展开,有父节点隐藏
    function close_ztree(treeId){
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        var nodes = treeObj.transformToArray(treeObj.getNodes());
        var nodeLength = nodes.length;
        for (var i = 0; i < nodeLength; i++) {
            if (nodes[i].PARENT_ID == null) {
                //根节点:展开
                treeObj.expandNode(nodes[i], true, true, false);
            } else {
                //非根节点:收起
                treeObj.expandNode(nodes[i], false, true, false);
            }
        }
    }
    //查询的onclick时间
    function searchByValue(){
         searchByFlag_ztree("treeDemo","codeName");
    }
    //得到查询结果,并进行设置样式和展开
    function searchByFlag_ztree(treeId, searchConditionId){
        //<1>.搜索条件
        var searchCondition = $('#' + searchConditionId).val();
        //<2>.得到模糊匹配搜索条件的节点数组集合
        var highlightNodes = new Array();
        if (searchCondition != "") {
            var treeObj = $.fn.zTree.getZTreeObj(treeId);
            //模糊查询
            highlightNodes = treeObj.getNodesByParamFuzzy("CODE_NAME", searchCondition, null);
        }
        //<3>.高亮显示并展示【指定节点】
        highlightAndExpand_ztree(treeId, highlightNodes);
    }
    //展开,并显示不同颜色
    function highlightAndExpand_ztree(treeId, highlightNodes){
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        //<1>. 先把全部节点更新为普通样式
        var treeNodes = treeObj.transformToArray(treeObj.getNodes());
        var nodes = treeObj.transformToArray(treeObj.getNodes()[0].children);
        for (var i = 0; i < treeNodes.length; i++) {
            treeNodes[i].highlight = false;
            treeObj.updateNode(treeNodes[i]);
        }
        //<2>.收起树, 只展开根节点下的一级节点
        close_ztree(treeId);
        //<3>.把指定节点的样式更新为高亮显示,并展开
        if (highlightNodes != null) {
            for (var i = 0; i < highlightNodes.length; i++) {
                  //高亮显示节点,并展开
                  highlightNodes[i].highlight = true;
                  treeObj.updateNode(highlightNodes[i]);
                  //高亮显示节点的父节点的父节点....直到根节点,并展示
                  var parentNode = highlightNodes[i].getParentNode();
                  var parentNodes = getParentNodes_ztree(treeId, parentNode);
                  //展开
                  treeObj.expandNode(parentNodes, true, false, true);
                  treeObj.expandNode(parentNode, true, false, true);
                  //设置颜色
                  setFontCss_ztree("",highlightNodes[i]);
            }
        }
    }
    //递归查找父节点
    function getParentNodes_ztree(treeId, node){
        if (node != null) {
            var treeObj = $.fn.zTree.getZTreeObj(treeId);
            var parentNode = node.getParentNode();
            return getParentNodes_ztree(treeId, parentNode);
        } else {
            return node;
        }
    }
    //设置颜色
    function setFontCss_ztree(treeId, treeNode) {
        if (treeNode.PARENT_ID == null) {
            //根节点
            return {color:"#333", "font-weight":"bold"};
        } else if (treeNode.isParent == false){
            //叶子节点
            return (!!treeNode.highlight) ? {color:"#ff0000", "font-weight":"bold"} : {color:"#660099", "font-weight":"normal"};
        } else {
            //父节点
            return (!!treeNode.highlight) ? {color:"#ff0000", "font-weight":"bold"} : {color:"#333", "font-weight":"normal"};
        }
    }
    //点击的时候判断节点有没有数据,以便于datadrid是否请求后台刷新
    if(treeNodes.isParent){
        datagrid刷新
    }else{
        提示
    }
  //获取过滤之外的所有数据
  var filterNodes = treeObj.getNodesByFilter(filters);
  function filters(node) {
        return (node.highlight == true);
   }
  //获取过滤的所有数据
  treeObj.getNodesByParamFuzzy("CODE_NAME", searchCondition, null);
  //当焦点放在节点上显示新增Logo
  function addHoverDom(treeId, treeNode) {
      var sObj = $("#" + treeNode.tId + "_span");
      if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
      var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
       + "' title='新增节点' onfocus='this.blur();'></span>";
      sObj.after(addStr);
      var btn = $("#addBtn_"+treeNode.tId);
      if (btn) btn.bind("click", function(){
      //弹出easy-ui新增对话框
      treeBusinessManager.newTreeDialog();
       return false;
      });
  };
 //当鼠标不在节点的时候,自动隐藏新增按钮
  function removeHoverDom(treeId, treeNode) {
      $("#addBtn_"+treeNode.tId).unbind().remove();
  };
  //获取某个节点下的所有节点
 //需求:当只能在叶子节点上添加数据的时候,但是展现的时候,需要如果点击叶子节点显示叶子节点的数据,点击节点显示该节点下的所有叶子节点的信息。
 //注意:这里数据用,区分id,是为了去后台进行in查询
  function getAllChildNodes(treeNode) {
        var treeObj = $.fn.zTree.getZTreeObj("sheetTree");//获取ztree
        var childNodes = treeObj.transformToArray(treeNode);//把该节点的下的所有数据转换为数组
        var nodes = new Array();
        var j = 0;
        for(i = 0; i < childNodes.length; i++) {
          //只有保存叶子节点的数据
           if(!childNodes[i].isParent){
                     nodes[j] = childNodes[i].id;
                     //nodes.join(",");
                     j++;
           }
        }
        return nodes;
  }
  //获取该节点下的所有子节点
  getChildNodes:function(treeNode,result){
        if (treeNode.isParent) {
          var childrenNodes = treeNode.children;
          if (childrenNodes) {
              for (var i = 0; i < childrenNodes.length; i++) {
                  result += ',' + childrenNodes[i].id;
                  result = sheetShareManager.getChildNodes(childrenNodes[i], result);
              }
          }
      }
      return result;
  }
 //刷新节点
    function refreshNode(id) {
     var treeObj = $.fn.zTree.getZTreeObj("busTree");
        var node = treeObj.getNodeByParam("id", id, null);
        if (node) {
         treeObj.reAsyncChildNodes(node, "refresh");
        } else {
            setTimeout(function() {
                refreshNode(id);
            }, 10);
        }
    }
    //刷新父节点
    function refreshParentNode(id) {
     var treeObj = $.fn.zTree.getZTreeObj("busTree");
        var node = treeObj.getNodeByParam("id", id, null);
        var pNode = node.getParentNode();
        if (pNode) {
            refreshNode(pNode.id);
        } else {
            refreshNode("0");
        }
    }
//删除根节点的时候,销毁整棵树
$.fn.zTree.destroy("busTree");
//修改节点名,判断是否为空,或者超出限制
function zTreeBeforeRename(treeId, treeNode, newName, isCancel) {
    if (newName.length>10||newName.trim().length<=0) {
        toastr.error("填写信息不符合规则!");
        var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
        treeObj.cancelEditName();
        return false;
    }
    return true;
}
function zTreeOnRename(event, treeId, treeNodes, isCancel) {
    //真正触发的时候为undefiend。触发不成功的时候,为true
    if(isCancel == undefined){
        //修改操作
    }
}
 //右键显示新增,修改,删除(与easy-ui整体类似)
 //右键,填出编辑框
 function zTreeOnRightClick(event, treeId, treeNode) {
  var treeObj = $.fn.zTree.getZTreeObj("busTree");
  //设置选中右键节点
  treeObj.selectNode(treeNode);
  //这里可以为为div添加click事件,进行新增,修改,删除操作。
  注意:设置选中节点,才能去对应的操作方法中获取选中的几点
  (var treeObj = $.fn.zTree.getZTreeObj("busTree");
     var nodes = treeObj.getSelectedNodes();)
   $('#configure-tree-menu').menu('show',{left: event.pageX,top: event.pageY});
 };
 //删除节点的时候需要注意
 //由于数据是异步加载的,所以不仅需要进行数据删除,还需要进行逻辑删除。否则数据没有及时的回显,那么树的状态isParent还没改变。
  for (var i=0, l=nodes.length; i < l; i++) {
     treeObj.removeNode(nodes[i]);
  }
 //在onBeforeRemove中操作,异步的判断
 //在数据操作成功之后
   var treeObj = $.fn.zTree.getZTreeObj("busTree");
    treeObj.selectNode(treeNode);
    var nodes = treeObj.getSelectedNodes();
    for (var i=0, l=nodes.length; i < l; i++) {
        treeObj.removeNode(nodes[i]);//默认是false,如果设置为true,那么就会触发onRemove函数
    }
 //html中的menu
 <div id="configure-tree-menu" class="easyui-menu" style="width:150px;">
  <div id="configureAdd"  data-options="iconCls:'icon-add'">新增节点</div>
  <div id="configureEdit"  data-options="iconCls:'icon-edit'">编辑节点</div>
  <div id="configureDelete" data-options="iconCls:'icon-remove'">删除节点</div>

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZTree是一个基于jQuery的树形结构插件,可以用于显示树形菜单、目录结构等。在Vue项目中使用ZTree,需要先安装ZTree插件,然后在Vue组件中引入和使用。 步骤如下: 1. 在Vue项目中安装ZTree插件: ``` npm install jquery ztree --save ``` 2. 在Vue组件中引入jQuery和ZTree插件: ```javascript import $ from 'jquery' import 'ztree/js/jquery.ztree.all.min.js' import 'ztree/css/metroStyle/metroStyle.css' ``` 其中,`jquery.ztree.all.min.js`是ZTree的核心文件,`metroStyle.css`是一款ZTree的皮肤。 3. 在Vue组件中定义一个div元素,用于显示ZTree: ```html <template> <div id="tree"></div> </template> ``` 4. 在Vue组件的`mounted`钩子函数中,初始化ZTree,并将数据渲染到树形菜单中: ```javascript mounted() { // 初始化ZTree let setting = { view: { selectedMulti: false }, data: { simpleData: { enable: true } }, callback: { onClick: this.onClick } } let zNodes = [ { id:1, pId:0, name:"父节点 1", open:true}, { id:11, pId:1, name:"子节点 1-1"}, { id:12, pId:1, name:"子节点 1-2"}, { id:13, pId:1, name:"子节点 1-3"}, { id:2, pId:0, name:"父节点 2", open:true}, { id:21, pId:2, name:"子节点 2-1"}, { id:22, pId:2, name:"子节点 2-2"}, { id:23, pId:2, name:"子节点 2-3"}, { id:3, pId:0, name:"父节点 3", open:true}, { id:31, pId:3, name:"子节点 3-1"}, { id:32, pId:3, name:"子节点 3-2"}, { id:33, pId:3, name:"子节点 3-3"} ] $.fn.zTree.init($("#tree"), setting, zNodes) }, methods: { // 点击节点事件 onClick(event, treeId, treeNode) { console.log(treeNode.name) } } ``` 其中,`zNodes`变量是一个数组,用于存储树形菜单的数据。`setting`变量是一个对象,用于配置ZTree的属性,例如是否允许多选、数据格式等。`$.fn.zTree.init`方法用于初始化ZTree,其中`$("#tree")`表示树形菜单的容器元素,`setting`表示ZTree的配置,`zNodes`表示树形菜单的数据。 5. 最终效果如下图所示: <img src="https://i.loli.net/2022/01/08/aJZ9zVX8q3WOhlY.png" alt="ztree-demo.png" style="zoom:50%;" />

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值