当前位置:首页 > JavaScript

js实现treeselect

2026-02-01 08:05:06JavaScript

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

数据结构设计

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

js实现treeselect

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>
  `;
}

事件处理

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

js实现treeselect

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;
}

完整组件封装

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

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实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选框 co…