以下是用 Stimulus 和 Turbo.js 写的一个简单的下拉列表:

HTML 代码:

<div data-controller='dropdown'>
  <button type='button' data-action='click->dropdown#toggle'>
    Select an option
    <span data-dropdown-icon>▾</span>
  </button>
  <ul data-dropdown-menu>
    <li><a href='#' data-action='click->dropdown#selectOption' data-option='option1'>Option 1</a></li>
    <li><a href='#' data-action='click->dropdown#selectOption' data-option='option2'>Option 2</a></li>
    <li><a href='#' data-action='click->dropdown#selectOption' data-option='option3'>Option 3</a></li>
  </ul>
</div>

JavaScript 代码:

import { Controller } from 'stimulus'
import { Turbo } from '@hotwired/turbo-rails'

export default class extends Controller {
  static targets = [ 'icon', 'menu' ]
  static values = { isOpen: Boolean }

  connect() {
    this.isOpenValue = false
    this.closeMenu = this.closeMenu.bind(this)
    document.addEventListener('turbo:before-cache', this.closeMenu)
  }

  disconnect() {
    document.removeEventListener('turbo:before-cache', this.closeMenu)
  }

  toggle() {
    this.isOpenValue = !this.isOpenValue
    if (this.isOpenValue) {
      this.menuTarget.classList.add('open')
      this.iconTarget.innerHTML = '▴'
      document.addEventListener('click', this.closeMenu)
    } else {
      this.menuTarget.classList.remove('open')
      this.iconTarget.innerHTML = '▾'
      document.removeEventListener('click', this.closeMenu)
    }
  }

  selectOption(event) {
    event.preventDefault()
    const option = event.target.dataset.option
    console.log(`Selected option: ${option}`)
    this.closeMenu()
  }

  closeMenu() {
    this.isOpenValue = false
    this.menuTarget.classList.remove('open')
    this.iconTarget.innerHTML = '▾'
    document.removeEventListener('click', this.closeMenu)
  }
}

CSS 代码:

[data-dropdown-menu] {
  display: none;
  position: absolute;
  z-index: 1;
  background-color: white;
  padding: 0;
  margin: 0;
  border: 1px solid #ccc;
}

[data-dropdown-menu].open {
  display: block;
}

[data-dropdown-menu] li {
  list-style: none;
  margin: 0;
  padding: 0;
}

[data-dropdown-menu] a {
  display: block;
  padding: 5px;
  text-decoration: none;
  color: #333;
}

[data-dropdown-menu] a:hover {
  background-color: #f5f5f5;
}

[data-dropdown-icon] {
  margin-left: 5px;
}

这个下拉列表控制器使用了 Stimulus 的值和目标,以及 Turbo.js 的页面缓存事件。当用户点击按钮时,它会打开或关闭下拉菜单,并在文档中添加或删除关闭菜单的事件侦听器。当用户选择一个选项时,它会记录选项并关闭菜单。当页面被缓存时,它会自动关闭菜单。

使用 Stimulus 和 Turbo.js 创建下拉菜单

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

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