Bootstrap-vue Collapse:用箭头显示状态

4ngedf3f  于 2023-05-18  发布在  Vue.js
关注(0)|答案(4)|浏览(322)

我使用Bootstrap-vue,并有一个简单的折叠组件,这样我就可以切换内容的可见性。我正在寻找一种方法,在切换按钮中包含一个箭头图标,指示折叠状态:如果内容打开,则箭头向下,如果内容关闭,则箭头向侧面。
我在这里看了一下Bootstrap 4 Collapse show state with Font Awesome icon的解决方案。然而,虽然这适用于Bootstrap 4,但我不能让它与Bootstrap-vue一起工作,因为标记元素不同。那么,根据下面的标记,我如何才能实现折叠状态箭头?

<div>
  <b-btn v-b-toggle.collapse3 class="m-1">Toggle Collapse</b-btn>
  <b-collapse visible id="collapse3">
     <b-card> some content </b-card>
  </b-collapse>
</div>
5n0oy7gb

5n0oy7gb1#

这是我最终的解决方案,基于Riddhi的回答:

<b-btn block href="#" v-b-toggle.accordion1 variant="secondary">
   Time Period
     <span class="when-opened">
         <font-awesome-icon icon="chevron-down" />
     </span>
     <span class="when-closed">
         <font-awesome-icon icon="chevron-right" />
     </span>
</b-btn>

<b-collapse id="accordion1" role="tabpanel">
   <!-- some content -->
</b-collapse>

附加CSS:

<style scoped>
...
    .collapsed > .when-opened,
    :not(.collapsed) > .when-closed {
        display: none;
    }

...
</style>

我安装并导入了Font Awesome包,如这里所述https://fontawesome.com/how-to-use/on-the-web/using-with/vuejshttps://origin.fontawesome.com/how-to-use/with-the-api/setup/importing-icons。在我的main.js文件中,导入代码看起来像这样:

import Vue from 'vue'
...
import { library } from '@fortawesome/fontawesome-svg-core'
import { faChevronRight, faChevronDown } from '@fortawesome/free-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'

library.add(faChevronRight, faChevronDown);

Vue.component('font-awesome-icon', FontAwesomeIcon);
...
l0oc07j2

l0oc07j22#

示例HTML标记:

<b-btn v-b-toggle.myCollapse>
          <span class="when-opened">
<i class="fa fa-chevron-down" aria-hidden="true"></i></span>
          <span class="when-closed">
    <i class="fa fa-chevron-up" aria-hidden="true"></i></span>
          My Collapse
        </b-btn>
        <b-collapse id="myCollapse">
          <!-- content here -->
        </b-collapse>

自定义CSS示例:

.collapsed > .when-opened,
:not(.collapsed) > .when-closed {
  display: none;
}

你可以在上面的css类的帮助下实现这一点。

2j4z5cfb

2j4z5cfb3#

当使用事件this.$root.$on更改状态时,您可以使用自定义行为检查此文档:
https://bootstrap-vue.org/docs/components/collapse#collapse
一个简单的例子:)

Vue.use(BootstrapVue);
new Vue({
  el: '#app',
  data() {
      // collapsed has the status
      return { collapsed: false };
    },
    mounted() {
     // Emitted when collapse has
     // changed its state
     this.$root.$on(
      'bv::collapse::state',
      // id of the collapse component
      // collapse is the state
      // true => open, false => close
       (id, collapsed) => {
        if (id === "my-collapse") {
          this.collapsed = collapsed;
        }
      });// $on
    },
    // plus
    computed: {
      btnVariant: function () {
        return this.collapsed?
          'danger' : 'info'
      },
      btnTxt:  function () {
        return this.collapsed?
           '🡇 Show ' : '🡅 Hide';
      }
    }
});
<!-- Required Stylesheets -->
<link
 type="text/css"
 rel="stylesheet"  href="https://unpkg.com/bootstrap/dist/css/bootstrap.min.css"
/>
<link
  type="text/css"
  rel="stylesheet"
  href="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css"
/>

<!-- Required scripts -->
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>

<!-- markup template -->
<div id="app">
  <b-button
    v-b-toggle:my-collapse
    :variant="btnVariant">
    {{ btnTxt }} - Collapse
  </b-button>
  <b-collapse id="my-collapse">
    Lorem ipsum dolor sit amet...
  </b-collapse>
</div>

Good luck:)

k4ymrczo

k4ymrczo4#

一种更惯用的方法是只使用v-model,而不是使用CSS来推断UI状态。

<b-collapse visible id="collapse3">
  <b-card> some content </b-card>
</b-collapse>

应成为:

<b-collapse v-model="openState" id="collapse3">
  <b-card> some content </b-card>
</b-collapse>

您可以决定在数据部分中将openState声明为true,或者在挂载或创建的生命周期钩子中设置它的值,可能基于prop(我在案例中所做的)。一旦用户开始单击,该值将与UI中的状态同步。
箭头部分将变为:

<span class="fa" :class="openState ? 'fa-chevron-down' : 'fa-chevron-up'"></span>

<font-awesome-icon :icon="openState ? 'chevron-down' : 'chevron-up'" />

相关问题