对于一个 Cascader 组件,我们需要实现以下功能:

  1. 展示多级菜单,每个菜单项可以展开子菜单;
  2. 点击某个菜单项,可以选择该项;
  3. 点击某个菜单项,可以展开该项的子菜单;
  4. 点击空白区域或者取消按钮,可以关闭 Cascader。

在使用 Stimulus 和 Turbo.js 实现 Cascader 组件时,可以按照以下步骤进行:

  1. 创建一个 Cascader 控制器,并在 HTML 中引用该控制器。
// cascader_controller.js
import { Controller } from 'stimulus';
export default class extends Controller {
  // ...
}

// HTML
<div data-controller='cascader'>
  <!-- Cascader HTML -->
</div>
  1. 在 Cascader 控制器中定义数据和方法,包括菜单数据、选中项、展开状态等。
// cascader_controller.js
export default class extends Controller {
  // 菜单数据
  static menus = [
    { label: 'A', value: 'a', children: [{ label: 'A-1', value: 'a-1' }] },
    { label: 'B', value: 'b', children: [{ label: 'B-1', value: 'b-1' }] },
    { label: 'C', value: 'c', children: [{ label: 'C-1', value: 'c-1' }] },
  ];

  // 选中项
  selectedValue = null;

  // 展开状态
  expandedMenuValue = null;

  // 方法
  selectMenu(event) {...}
  toggleMenu(event) {...}
  closeMenu(event) {...}
  // ...
}
  1. 编写 Cascader HTML,包括菜单项和控制按钮。
<!-- Cascader HTML -->
<div class='cascader'>
  <div class='cascader-menu'>
    <ul>
      <li>
        <button>Menu 1</button>
        <ul>
          <li>
            <button>Submenu 1-1</button>
          </li>
          <li>
            <button>Submenu 1-2</button>
          </li>
        </ul>
      </li>
      <li>
        <button>Menu 2</button>
        <ul>
          <li>
            <button>Submenu 2-1</button>
          </li>
          <li>
            <button>Submenu 2-2</button>
          </li>
        </ul>
      </li>
    </ul>
  </div>
  <div class='cascader-control'>
    <button>Cancel</button>
  </div>
</div>
  1. 在 Cascader 控制器中实现方法,实现 Cascader 的功能。
// cascader_controller.js
export default class extends Controller {
  // ...

  // 选中菜单项
  selectMenu(event) {
    const value = event.target.dataset.value;
    this.selectedValue = value;
    this.expandedMenuValue = null;
  }

  // 切换菜单展开状态
  toggleMenu(event) {
    const value = event.target.dataset.value;
    this.expandedMenuValue = this.expandedMenuValue === value ? null : value;
  }

  // 关闭 Cascader
  closeMenu(event) {
    this.selectedValue = null;
    this.expandedMenuValue = null;
  }

  // ...
}
  1. 在 Cascader HTML 中使用 data 属性和 Stimulus 提供的 data-* API,将数据和方法绑定到 HTML 元素上。
<!-- Cascader HTML -->
<div class='cascader' data-cascader-target='cascader'>
  <div class='cascader-menu'>
    <ul>
      <li>
        <button data-action='click->cascader#toggleMenu' data-value='1'>Menu 1</button>
        <ul data-cascader-target='menu' data-cascader-value='1' class='cascader-menu-submenu'>
          <li>
            <button data-action='click->cascader#selectMenu' data-value='11'>Submenu 1-1</button>
          </li>
          <li>
            <button data-action='click->cascader#selectMenu' data-value='12'>Submenu 1-2</button>
          </li>
        </ul>
      </li>
      <li>
        <button data-action='click->cascader#toggleMenu' data-value='2'>Menu 2</button>
        <ul data-cascader-target='menu' data-cascader-value='2' class='cascader-menu-submenu'>
          <li>
            <button data-action='click->cascader#selectMenu' data-value='21'>Submenu 2-1</button>
          </li>
          <li>
            <button data-action='click->cascader#selectMenu' data-value='22'>Submenu 2-2</button>
          </li>
        </ul>
      </li>
    </ul>
  </div>
  <div class='cascader-control'>
    <button data-action='click->cascader#closeMenu'>Cancel</button>
  </div>
</div>
  1. 使用 CSS 样式美化 Cascader,使其更加美观易用。

以上就是使用 Stimulus 和 Turbo.js 实现 Cascader 组件的步骤。在实现过程中,我们可以根据实际需求对代码进行优化和改进,使得 Cascader 组件更加适合我们的应用场景。

使用 Stimulus 和 Turbo.js 实现一个 Cascader 组件

原文地址: https://www.cveoy.top/t/topic/lVrM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录