当前位置:首页 > JavaScript

js实现treeselect

2026-02-01 08:05:06JavaScript

以下是使用 JavaScript 实现 TreeSelect 组件的方法,结合递归渲染和事件处理:

数据结构设计

TreeSelect 需要一个树形结构的数据,通常每个节点包含 labelvaluechildren 属性:

const treeData = [
  {
    label: "Parent 1",
    value: "p1",
    children: [
      { label: "Child 1", value: "c1" },
      { label: "Child 2", value: "c2" }
    ]
  }
];

递归渲染树节点

使用递归函数渲染树形结构,支持展开/折叠:

function renderTreeNode(node, level = 0) {
  return `
    <div class="tree-node" style="padding-left: ${level * 20}px">
      ${node.children ? 
        `<span class="toggle">+</span>` : 
        `<span class="spacer"></span>`
      }
      <label>
        <input type="checkbox" value="${node.value}">
        ${node.label}
      </label>
      ${node.children ? 
        `<div class="children">${node.children.map(child => 
          renderTreeNode(child, level + 1)).join('')}</div>` : 
        ''
      }
    </div>
  `;
}

事件处理

添加点击事件处理展开/折叠和选择:

document.addEventListener('click', (e) => {
  // 处理展开/折叠
  if (e.target.classList.contains('toggle')) {
    const children = e.target.parentNode.querySelector('.children');
    children.style.display = children.style.display === 'none' ? 'block' : 'none';
    e.target.textContent = e.target.textContent === '+' ? '-' : '+';
  }

  // 处理复选框选择
  if (e.target.matches('input[type="checkbox"]')) {
    const checked = e.target.checked;
    // 处理子节点全选/取消
    if (e.target.closest('.tree-node').querySelector('.children')) {
      e.target.closest('.tree-node')
        .querySelectorAll('input[type="checkbox"]')
        .forEach(checkbox => checkbox.checked = checked);
    }
  }
});

样式设计

基础 CSS 样式示例:

.tree-node {
  padding: 5px 0;
  cursor: pointer;
}
.toggle, .spacer {
  display: inline-block;
  width: 20px;
}
.children {
  display: none;
}
.children.show {
  display: block;
}

完整组件封装

将功能封装为可复用的类:

js实现treeselect

class TreeSelect {
  constructor(container, data) {
    this.container = document.querySelector(container);
    this.data = data;
    this.render();
  }

  render() {
    this.container.innerHTML = this.data.map(node => 
      renderTreeNode(node)).join('');
  }

  getSelectedValues() {
    return Array.from(this.container.querySelectorAll('input:checked'))
      .map(input => input.value);
  }
}

// 使用示例
const treeSelect = new TreeSelect('#tree-container', treeData);

功能扩展建议

  • 添加搜索过滤功能
  • 支持异步加载子节点
  • 实现多选/单选模式切换
  • 添加自定义图标支持

这种方法实现了基本的 TreeSelect 功能,可以根据需求进一步扩展和完善交互细节。

标签: jstreeselect
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…