对于一个Cascader(级联选择器)组件,我们可以使用 Stimulus、Turbo.js 和 Tailwind CSS 来实现。下面是一个简单的实现示例:

首先,我们需要定义一个 Stimulus 控制器来管理 Cascader 组件的行为:

// cascader_controller.js

import { Controller } from "stimulus"

export default class extends Controller {
  static targets = [ "select", "options" ]

  connect() {
    this.selectTarget.addEventListener("change", this.handleChange.bind(this))
  }

  handleChange() {
    const value = this.selectTarget.value
    const option = this.optionsTarget.querySelector(`[data-value="${value}"]`)
    if (option) {
      option.click()
    }
  }
}

在上面的代码中,我们定义了 Cascader 控制器,它有两个目标:selectoptionsselect 目标是一个 <select> 元素,它用于显示当前已选择的选项。options 目标是一个包含所有选项的列表,每个选项都是一个链接。当用户选择一个选项时,我们将更新 select 元素的值,并触发相应的事件。

接下来,我们需要在 HTML 中使用 Cascader 控制器:

<!-- cascader.html -->

<div data-controller="cascader">
  <select data-target="cascader.select">
    <option value="">请选择</option>
  </select>
  <ul data-target="cascader.options">
    <li><a href="#" data-value="1">选项1</a></li>
    <li><a href="#" data-value="2">选项2</a></li>
    <li><a href="#" data-value="3">选项3</a></li>
  </ul>
</div>

在上面的代码中,我们使用了 data-controller 属性来指定 Cascader 控制器,并使用了 data-target 属性来指定控制器的目标元素。我们还添加了一些选项,每个选项都是一个链接,它们的值通过 data-value 属性来指定。

最后,我们需要使用 Turbo.js 和 Tailwind CSS 来处理页面的动态更新和样式:

// application.js

import { Turbo } from "@hotwired/turbo"
import { start } from "@hotwired/turbo-rails"
import { Application } from "stimulus"
import CascaderController from "./cascader_controller"

const application = Application.start()
application.register("cascader", CascaderController)

start()

Turbo.setProgressBarDelay(0)
Turbo.setProgressBarPosition(0)

document.addEventListener("turbo:load", () => {
  Turbo.clearCache()
})
/* application.css */

@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";

[data-controller="cascader"] {
  display: inline-block;
  position: relative;
}

[data-controller="cascader"] select {
  appearance: none;
  background-color: white;
  border: 1px solid gray;
  border-radius: 3px;
  box-shadow: none;
  cursor: pointer;
  font-size: 14px;
  line-height: 1.5;
  padding: 0.5em 1em;
  width: 100%;
}

[data-controller="cascader"] ul {
  background-color: white;
  border: 1px solid gray;
  border-radius: 3px;
  box-shadow: none;
  display: none;
  left: 0;
  margin: 0;
  padding: 0;
  position: absolute;
  top: 100%;
  width: 100%;
  z-index: 999;
}

[data-controller="cascader"] li {
  display: block;
  margin: 0;
  padding: 0;
}

[data-controller="cascader"] a {
  color: black;
  display: block;
  font-size: 14px;
  line-height: 1.5;
  padding: 0.5em 1em;
  text-decoration: none;
  white-space: nowrap;
}

[data-controller="cascader"] a:hover {
  background-color: gray;
  color: white;
}

[data-controller="cascader"] select:focus + ul {
  display: block;
}

在上面的代码中,我们定义了 Cascader 组件的样式,并使用了 Tailwind CSS 来实现它。我们还使用了 Turbo.js 来处理页面的动态更新,以及用 Stimulus 控制器来管理 Cascader 组件的行为。

现在,我们已经成功地实现了一个 Cascader 组件,用户可以使用它来进行级联选择。


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

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