【问题标题】:toggle only accordion clicked vue.js仅切换手风琴点击 vue.js
【发布时间】:2020-01-15 14:11:04
【问题描述】:

我正在构建一个简单的 vue 手风琴,当我单击一个手风琴时,它们都会打开,这不是我所追求的行为。有没有办法只打开点击的那个?我以为“这个”会解决这个问题,但我没有运气。

html:

<div id="accordion" class="accordion-container">
            <div class="accordion" :class="accordionClasses">
              <div class="accordion-header" @click="toggleAccordion">
                Accordion 1
                <i class="fal fa-plus" />
                <!--  <i class="fal fa-minus" /> -->
              </div>
              <div class="accordion-body">
                <div class="accordion-content">Lorem ipsum dolor sit amet, consectetur adipiscing elit. <strong>Pellentesque risus mi</strong></div>
              </div>
            </div>
            <div class="accordion" :class="accordionClasses">
              <div class="accordion-header" @click="toggleAccordion">
                Accordion 2
                <i class="fal fa-plus" />
                <!--   <i class="fal fa-minus" /> -->
              </div>
              <div class="accordion-body">
                <div class="accordion-content">Lorem ipsum dolor sit amet, consectetur adipiscing elit. <strong>Pellentesque risus mi</strong></div>
              </div>
            </div>
            <div class="accordion" :class="accordionClasses">
              <div class="accordion-header" @click="toggleAccordion">
                Accordion 3
                <i class="fal fa-plus" />
                <!-- <i class="fal fa-minus" />-->
              </div>
              <div class="accordion-body">
                <div class="accordion-content">Lorem ipsum dolor sit amet, consectetur adipiscing elit. <strong>Pellentesque risus mi</strong></div>
              </div>
            </div>
          </div>

js:

export default {
  name: 'trial-page',
  data() {
  return {
  isOpen: false
};
  },
  computed: {
accordionClasses: function() {
  return {
    'is-closed': !this.isOpen
  };
 }
},
   methods: {
toggleAccordion: function() {
  this.isOpen = !this.isOpen;
 }
}
};

【问题讨论】:

  • 您希望一次只打开一个,还是希望能够同时打开多个? (如果点击了多个)
  • 是的,一次打开多个。最终会有一个“全部打开”“全部关闭”,但现在只希望一次打开一个能够打开所有的。

标签: javascript html vue.js


【解决方案1】:

如果您想跟踪哪个手风琴部分是打开或关闭的,您不需要为每个部分指定一个索引并将其用作跟踪工具。在您创建列表时,我强烈建议您使用v-for

总体而言,您的代码可以进行一些重构,因此我对其进行了一些重写,以便为您提供一个示例,说明您的目标:

<template>
  <div id="accordion" class="accordion-container">
    <div
      v-for="(item, index) in items"
      :key="index"
      :class="[
        'accordion',
        { 'is-open': isOpen.includes(index) }
      ]"
    >
      <div class="accordion-header" @click="toggleAccordion(index)">
        {{ item.title }}
        <i v-if="!isOpen.includes(index)" class="fal fa-plus"/>
        <i v-else class="fal fa-minus"/>
      </div>
      <div class="accordion-body">
        <div class="accordion-content">
          {{ item.text }}
          <strong>{{ item.sub }}</strong>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "trial-page",
  data() {
    return {
      items: [
        {
          title: "Accordion 1",
          text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
          sub: "Pellentesque risus mi"
        },
        {
          title: "Accordion 2",
          text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
          sub: "Pellentesque risus mi"
        },
        {
          title: "Accordion 3",
          text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
          sub: "Pellentesque risus mi"
        }
      ],
      isOpen: []
    };
  },
  methods: {
    toggleAccordion(index) {
      if (this.isOpen.includes(index)) {
        this.isOpen = this.isOpen.filter(i => i !== index);
        return;
      }

      this.isOpen.push(index);
    }
  }
};
</script>

<style>
.accordion:not(.is-open) .accordion-body {
  display: none;
}
</style>

这是一个codepen 来测试它:https://codesandbox.io/s/blazing-water-icpxw

您可能需要调整一些东西以满足您的需要。

【讨论】:

  • 哇,谢谢。这很棒,绝对有助于更好地理解 vue。在我在 jquery 中度过了我短暂的大部分开发生活之后,这些成长的痛苦是真实的。非常感谢:)
【解决方案2】:

你可以看看.bind()方法:

Bind 创建一个新函数,将 this 设置为传递给 bind() 的第一个参数。

【讨论】:

  • toggleAccordion: () => { this.isOpen = !this.isOpen; } 收到错误“isOpen 未定义”
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2016-02-28
  • 2014-04-03
相关资源
最近更新 更多