当前位置: 首页
前端开发
ExtJS TreePanel树面板使用实例解析

ExtJS TreePanel树面板使用实例解析

热心网友 时间:2026-06-12
转载

在 Ext JS 的树组件中,无论是叶子节点还是非叶子节点,均采用统一的 TreeNode 类来表示——这一设计保持了高度统一。然而,根据节点类型,具体分为两种:一种为常规简单树节点,由 Ext tree TreeNode 定义;另一种为支持异步加载子节点的节点,由 Ext tree AsyncTr

在 Ext JS 的树组件中,无论是叶子节点还是非叶子节点,均采用统一的 TreeNode 类来表示——这一设计保持了高度统一。然而,根据节点类型,具体分为两种:一种为常规简单树节点,由 Ext.tree.TreeNode 定义;另一种为支持异步加载子节点的节点,由 Ext.tree.AsyncTreeNode 定义。简而言之,对于数据量较小且结构固定的场景,推荐使用前者;若需要按需从服务端动态获取数据,则应选择后者。

在数据层面,核心字段主要包括:text 用于显示节点文字,leaf 标记是否为叶子节点,children 存放子节点数组,expanded 控制初始展开状态。一个典型的数据结构示例如下:

var store = Ext.create('Ext.data.TreeStore', {
    root: {
        expanded: true,
        children: [
            { text: "留学", leaf: true },
            { text: "功课", expanded: true, children: [
                { text: "英语", leaf: true },
                { text: "代数", leaf: true }
            ] },
            { text: "托福", leaf: true }
        ]
    }
});

TreePanel 从 Servlet 中读取 JSON 数据

在实际项目中,树的数据很少硬编码在页面内,通常需要从服务器动态加载。本示例通过一个返回 JSON 数据的 Servlet 进行演示,前端 TreePanel 借助 loader 与该 Servlet 进行通信。

首先来看服务端代码——一个简单的 TreeNodeServlet,根据请求参数 node 返回不同的 JSON 片段:

import ja va.io.IOException;
import ja va.io.PrintWriter;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;
import ja vax.servlet.ServletException;
import ja vax.servlet.http.HttpServlet;

public class TreeNodeServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        String treeNode = request.getParameter("node");
        String json = "";
        PrintWriter out = response.getWriter();
        if ("0".equals(treeNode)) {
            json += "[{id:1, text:'0-1'}, {id:2, text:'0-2'}]";
        } else if ("1".equals(treeNode)) {
            json += "[{id:11, text:'0-1-1', leaf:true}, {id:12, text:'0-1-2', leaf:true}]";
        } else if ("2".equals(treeNode)) {
            json += "[{id:21, text:'0-2-1'}, {id:22, text:'0-2-2', leaf:true}]";
        } else if ("21".equals(treeNode)) {
            json += "[{id:211, text:'0-2-1-1', leaf:true}, {id:212, text:'0-2-1-2', leaf:true}]";
        }
        out.write(json);
    }
}

前端代码则简洁明了:创建一个 TreePanel,将 loader 的 dataUrl 指向上述 Servlet,然后设置根节点(注意此处需要使用 AsyncTreeNode,因为数据采用懒加载方式),最后调用 root.expand() 触发首次加载。

Ext.onReady(function() {
    var tree = new Ext.tree.TreePanel({
        el: 'div-tree',
        loader: new Ext.tree.TreeLoader({ dataUrl: '../TreeNodeServlet' })
    });
    var root = new Ext.tree.AsyncTreeNode({ id: '0', text: '0' });
    tree.setRootNode(root);
    tree.render();
    root.expand();
});

效果截图如下:

2016521110621249.png (266×168)

在树 TreePanel 之间拖放节点

在某些场景下,我们需要将一个树的节点拖拽到另一个树中。同一棵树内的拖动,只需设置 enableDD: true 即可;跨树拖拽则需要分别配置 enableDragenableDrop。以下是一个完整的实现示例。

1. JS 代码

Ext.onReady(function() {
    var tree1 = new Ext.tree.TreePanel({
        el: 'tree1',
        enableDrag: true,   // 允许从此树拖出
        loader: new Ext.tree.TreeLoader({ dataUrl: 'treeData1.txt' })
    });
    var tree2 = new Ext.tree.TreePanel({
        el: 'tree2',
        enableDrop: true,   // 允许将元素拖入此树
        loader: new Ext.tree.TreeLoader({ dataUrl: 'treeData2.txt' })
    });
    var root1 = new Ext.tree.AsyncTreeNode({ text: '根节点' });
    var root2 = new Ext.tree.AsyncTreeNode({ text: '图书' });
    tree1.setRootNode(root1);
    tree2.setRootNode(root2);
    tree1.render();
    tree2.render();
});

2. HTML 代码

3. 数据文件(JSON 格式)

treeData1.txt

[
    { text: '非叶子结点' },
    { text: '叶子结点', leaf: true }
]

treeData2.txt

[
    { text: '计算机', children: [
        { text: 'Ja va', children: [
            { text: 'Ja va核心技术', leaf: true },
            { text: 'Thinking in Ja va', leaf: true }
        ]},
        { text: '算法导论', leaf: true }
    ]},
    { text: '音乐', children: [
        { text: '乐理基础', leaf: true },
        { text: '卡尔卡西古典吉他教程', leaf: true }
    ]}
]

4. 运行效果

下图展示了两个树之间的拖放交互效果:

2016521110709614.png (531×309)

以上即为 Ext JS 树组件在数据加载与跨树拖放方面的典型用法。在实际项目中,可根据需求扩展节点数据、添加事件监听,甚至实现自定义拖放逻辑。需要特别留意:AsyncTreeNode 是异步加载的核心,而 enableDragenableDrop 则是跨树拖放的关键配置项。

来源:https://www.jb51.net/article/84745.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
DCloud平台选型指南 适用场景与核心差异详解

DCloud平台选型指南 适用场景与核心差异详解

DCloud是一个围绕跨平台开发与流应用构建的技术生态,旨在帮助前端开发者使用Web技术开发高性能移动应用。其核心产品包括集成开发环境HBuilderX和基于Vue js的uni-app框架,支持一套代码发布至iOS、Android、Web及多端小程序。相比ReactNative和Flutter,uni-app在多端覆盖和Vue技术栈学习成本上具有优势,适合

时间:2026-07-10 06:47
DCloud使用教程与常见问题解决方案详解

DCloud使用教程与常见问题解决方案详解

DCloud提供跨平台应用开发方案,核心为HBuilderX与uni-app框架。开发者使用Vue js语法编写代码,可编译发布至iOS、Android、Web及小程序等多端。流程涵盖项目创建、开发调试与真机预览。常见问题如设备识别、编译失败等可通过检查设置、查看日志与条件编译解决。应用完成后支持云打包生成安装包。

时间:2026-07-10 06:47
DCloud新手入门教程 从零开始快速掌握开发技巧

DCloud新手入门教程 从零开始快速掌握开发技巧

DCloud是一个基于Web技术的跨平台应用开发平台,允许开发者使用HTML5等语言编写代码,并编译为iOS、Android及小程序应用,实现“一次编写,多端发布”。开发需使用HBuilderX,基于Vue js进行页面开发,平台提供丰富组件与API,并支持插件市场扩展功能。

时间:2026-07-10 06:47
DCloud新手入门指南从零开始了解这个开发平台

DCloud新手入门指南从零开始了解这个开发平台

DCloud是一个移动应用开发平台,旨在帮助前端开发者使用Web技术高效开发性能接近原生的跨平台应用。其核心产品包括HBuilderX开发环境和基于Vue js的uni-app框架,可实现一次开发、多端发布。平台通过完整工具链和插件生态降低开发门槛,适合需要快速迭代、覆盖多端的应用场景。

时间:2026-07-10 06:47
Zepto实战项目优化技巧与应用场景详解

Zepto实战项目优化技巧与应用场景详解

Zepto js作为轻量级JavaScript库,专为移动端优化,体积仅约10KB。它支持模块化定制,可按需构建以减小体积。使用时需减少DOM操作、善用事件委托,并可混合原生API提升性能。Zepto能融入现代工程流,但需注意其与jQuery的API差异及兼容性限制,适合在移动端性能优先的场景中替代jQuery。

时间:2026-07-10 06:47
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜