首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只打开一个手风琴面板vue.js /引导vue

只打开一个手风琴面板vue.js /引导vue
EN

Stack Overflow用户
提问于 2020-01-16 18:09:56
回答 3查看 5.4K关注 0票数 2

建立一个引导-vue手风琴和一切工作的预期,然而,我只是添加了所有/折叠所有按钮,这也是我所期望的,但现在我的问题是,当我点击任何手风琴面板,他们都直接打开。有没有办法让他们只打开点击的面板?

html:

代码语言:javascript
复制
   <div class="container container-accordion-one">
      <!--expand all / collapse all row -->
      <div class="row row-expand-collapse">
        <div class="offset-md-1 col-expand-collapse">
          <ul class="list-expand-collapse">
            <li><a href="#/" @click="showCollapse = true" class="font__card-body">Expand All</a></li>
            <li><a href="#/" @click="showCollapse = false" class="font__card-body">Collapse All</a></li>
          </ul>
        </div>
      </div>
      <!--end: expand all / collapse all row -->
      <div class="row">
        <div class="offset-md-1 accordion-style-one">
          <div role="tablist">
            <b-card no-body class="">
              <b-card-header href="#" v-b-toggle.accordion-1 header-tag="header" class="accordion-header" role="tab">
                <p class="font__accordion-header">Accordion 1</p>
                <i class="fal fa-plus accordionClosed" />
                <i class="fal fa-minus accordionOpen" />
              </b-card-header>
              <b-collapse id="accordion-1" v-model="showCollapse" role="tabpanel">
                <b-card-body>
                  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto distinctio enim fugit, inventore odio odit perferendis quas quo veritatis voluptate.</p>
                </b-card-body>
              </b-collapse>
            </b-card>

            <b-card no-body class="">
              <b-card-header href="#" v-b-toggle.accordion-2 header-tag="header" class="accordion-header" role="tab">
                <p class=" font__accordion-header">Accordion 2</p>
                <i class="fal fa-plus accordionClosed" />
                <i class="fal fa-minus accordionOpen" />
              </b-card-header>
              <b-collapse id="accordion-2" v-model="showCollapse" role="tabpanel">
                <b-card-body>
                  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto distinctio enim fugit, inventore odio odit perferendis quas quo veritatis voluptate.</p>
                </b-card-body>
              </b-collapse>
            </b-card>

            <b-card no-body class="">
              <b-card-header href="#" v-b-toggle.accordion-3 header-tag="header" class="accordion-header" role="tab">
                <p class=" font__accordion-header">Accordion 3</p>
                <i class="fal fa-plus accordionClosed" />
                <i class="fal fa-minus accordionOpen" />
              </b-card-header>
              <b-collapse id="accordion-3" v-model="showCollapse" role="tabpanel">
                <b-card-body>
                  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto distinctio enim fugit, inventore odio odit perferendis quas quo veritatis voluptate.</p>
                </b-card-body>
              </b-collapse>
            </b-card>
          </div>
        </div>
      </div>
    </div>

联署材料:

代码语言:javascript
复制
export default {
  name: 'm',
  components: {
   LinksTo
  },
  data() {
    return {
      showCollapse: false
    };
  }
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-17 03:00:05

由于您希望每次折叠都能够单独打开或关闭,因此每次折叠都需要一个v-model变量。在下面,我使用一个数组来存储折叠状态:

代码语言:javascript
复制
<template>
  <div>
    <b-button @click="expandAll">Expand all</b-button>
    <b-button @click="collapseAll">Collapse all</b-button>

    <b-button block v-b-toggle.accordion-1 class="mt-2">Accordion 1</b-button>
    <b-collapse id="accordion-1" v-model="collapseStates[0]">
      <div>Lorem ipsum dolor sit amet.</div>
    </b-collapse>

    <b-button block v-b-toggle.accordion-2 class="mt-2">Accordion 2</b-button>
    <b-collapse id="accordion-2" v-model="collapseStates[1]">
      <div>Lorem ipsum dolor sit amet.</div>
    </b-collapse>

    <b-button block v-b-toggle.accordion-3 class="mt-2">Accordion 3</b-button>
    <b-collapse id="accordion-3" v-model="collapseStates[2]">
      <div>Lorem ipsum dolor sit amet.</div>
    </b-collapse>
  </div>
</template>

<script>
export default {
  data() {
    return {
      collapseStates: [false, false, false]
    }
  },
  methods: {
    expandAll() {
      this.collapseStates = this.collapseStates.map(x => true)
    },
    collapseAll() {
      this.collapseStates = this.collapseStates.map(x => false)
    }
  }
}
</script>

看到工作小提琴在:https://jsfiddle.net/p60zktLs/

票数 5
EN

Stack Overflow用户

发布于 2020-01-16 18:25:28

您必须为每个选项卡声明一个单独的showCollapse标志。在“嘘”/“崩溃”中,所有这些都打开/关闭。

票数 1
EN

Stack Overflow用户

发布于 2020-01-16 18:52:21

编辑:

使用枯燥的主体,你最好把手风琴内容分解成数据,只写一次标记,然后遍历你的数据。然后可以跟踪每个手风琴上的打开/关闭状态。

在您的代码中,每个手风琴都是在同一个变量上建模的,因此它们只能全部打开或全部关闭。每个手风琴都要有一个独立的状态。

示例:(简化以便更容易阅读,但您也可以使用引导)

代码语言:javascript
复制
new Vue({
  el: "#app",
  data: {
    allClosed: true,
    items: [{
        title: 'title 1',
        description: 'description one',
        open: false
      },
      {
        title: 'title 2',
        description: 'description two',
        open: false
      },
      {
        title: 'title 3',
        description: 'description three',
        open: false
      }
    ],
  },
  methods: {
    openCloseAll() {
      this.allClosed = !this.allClosed
      if (this.allClosed) this.items.map(x => x.open = false)
      else this.items.map(x => x.open = true)
    }
  }
})
代码语言:javascript
复制
.accordian {
  margin: 8px 0;
  cursor: pointer;
  background: pink;
  padding: 0.25em;
}
代码语言:javascript
复制
<div id="app">
  <div>
    <button @click="openCloseAll()">
      <template v-if="allClosed">Open</template>
      <template v-else>Close</template>
      All
     </button>
  </div>
  <div v-for="(item, i) in items" class="accordian" @click="item.open = !item.open">
    <span>{{ item.title }}</span>
    <br />
    <span v-if="item.open">{{ item.description }}</span>
  </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

先前的建议:

这是实现这种功能的一种方法:

代码语言:javascript
复制
new Vue({
  el: "#app",
  data: {
    items: ['one', 'two', 'three', 'four', 'five'],
    openItems: [],
    openAll: true
  },
  methods: {
    toggle(i) {
      const index = this.openItems.findIndex(x => x === i)
      if (index !== -1) this.openItems.splice(index, 1)
      else this.openItems.push(i)
    },
    openCloseAll() {
      if (this.openAll) this.items.forEach((x, i) => this.openItems.push(i))
      else this.openItems = []
      this.openAll = !this.openAll
    }
  }
})
代码语言:javascript
复制
.accordian {
  margin: 8px 0;
  cursor: pointer;
  background: pink;
  padding: 0.25em;
}
代码语言:javascript
复制
<div id="app">
  <div>
    <button @click="openCloseAll()">
      <template v-if="openAll">Open</template>
      <template v-else>Close</template>
      All
     </button>
  </div>
  <div v-for="(item, i) in items" class="accordian" @click="toggle(i)">
    {{ item }}
    <span v-if="openItems.includes(i)">opened</span>
    <span v-else>closed</span>
  </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59775518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档