javascript Stimulus.js选项卡导航:单击的选项卡索引返回-1

yrdbyhpb  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(130)

我在Rails应用程序中使用Stimulus.js创建了一个标签导航。然而,当我点击一个标签时,内容并不显示,console.log显示点击的标签索引返回-1。如何解决此问题?
下面是我的Stimulus控制器(tabs_controller.js):

import { Controller } from "@hotwired/stimulus";

export default class extends Controller {
  static targets = ["tab", "content"];

  connect() {
    this.showTab(0);
  }

  changeTab(event) {
    event.preventDefault();
    this.showTab(this.tabTargets.indexOf(event.target));
    console.log("Clicked tab index:", this.tabTargets.indexOf(event.target));
  }

  showTab(index) {
    this.tabTargets.forEach((tab, i) => {
      tab.classList.toggle("tab-active", i === index);
      if (i === index) {
        this.contentTargets[i].removeAttribute("hidden");
      } else {
        this.contentTargets[i].setAttribute("hidden", true);
      }
    });
  }
}

下面是相应的HTML视图:

<div data-controller="tabs">
  <ul class="tabs">
    <li>
      <a href="#" data-tab-target="tab" data-action="click->tabs#changeTab" class="tab-active">Tab 1</a>
    </li>
    <li>
      <a href="#" data-tab-target="tab" data-action="click->tabs#changeTab">Tab 2</a>
    </li>
    <li>
      <a href="#" data-tab-target="tab" data-action="click->tabs#changeTab">Tab 3</a>
    </li>
  </ul>

  <div data-content-target="content" class="tab-content">
    <p>Tab 1 content...</p>
  </div>
  <div data-content-target="content" class="tab-content" hidden>
    <p>Tab 2 content...</p>
  </div>
  <div data-content-target="content" class="tab-content" hidden>
    <p>Tab 3 content...</p>
  </div>
</div>

当我单击任何选项卡时,浏览器控制台显示以下输出:

Clicked tab index: -1

我想有一个选项卡菜单,显示内容的基础上的选择。

cdmah0mi

cdmah0mi1#

问题是数据目标是错误的,它们的命名需要是data-controller-name-target="",所以在我的例子中,因为控制器被称为tab,所以应该是data-tabs-target=""
这就解决了问题

<div data-controller="tabs">
  <ul class="tabs">
    <li>
      <a href="#" data-tabs-target="tab" data-action="click->tabs#changeTab" class="tab-active">Tab 1</a>
    </li>
    <li>
      <a href="#" data-tabs-target="tab" data-action="click->tabs#changeTab">Tab 2</a>
    </li>
    <li>
      <a href="#" data-tabs-target="tab" data-action="click->tabs#changeTab">Tab 3</a>
    </li>
  </ul>

  <div data-tabs-target="content" class="tab-content">
    <p>Tab 1 content...</p>
  </div>
  <div data-tabs-target="content" class="tab-content" hidden>
    <p>Tab 2 content...</p>
  </div>
  <div data-tabs-target="content" class="tab-content" hidden>
    <p>Tab 3 content...</p>
  </div>
</div>

相关问题