当前位置:首页 > 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实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…