对于一个 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/FsS 著作权归作者所有。请勿转载和采集!

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