如何使 bootstrap4 折叠在 vue 中工作? [英] how to make bootstrap4 collapse work in vue?

查看:29
本文介绍了如何使 bootstrap4 折叠在 vue 中工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 bootstrap 4.3.1 和 vue@2.6.10

我有这个菜单(正在使用折叠 - 我不想使用 JQuery):

 <li class="nav-item"><a href="#" class="nav-link">项目列表2</a>

这只是一个包含 2 个子项目的块.

我使用 JQuery 看到的,当点击产品"时,#sidebar-products 接收 .show 类和 aria-expanded="true".

当有多个块时 - 单击一个块以关闭(如果有折叠)其他块.

如何让它在 vue 崩溃时工作?

更新 1

我创建了一个点击事件来完成这项工作:

<a class="nav-link" href="javascript:void(0)" @click="navItemCollapse('sidebar-products', $event)" data-toggle="collapse" 角色="按钮" aria-expanded="false" aria-controls="sidebar-products">

和事件:

 navItemCollapse(id, event) {让扩展 = event.target.getAttribute('aria-expanded').toLocaleLowerCase() == 'true' ?真假;让 el = document.getElementById(id);扩大 ?el.classList.remove('show') : el.classList.add('show');event.target.setAttribute('aria-expanded', !expanded);}

但是如果我有更多的块怎么办?当单击打开一个块上的当前折叠以关闭其他块时???

解决方案

这是没有jquery的实现

new Vue({el: '#app',数据() {返回 {菜单列表:[{name: '产品',展开:假,项目: [{name: '物品清单 1',关联: ''},{name: '物品清单 2',关联: ''}]},{name: '其他',展开:假,项目: [{name: '其他项目 1',关联: ''},{name: '其他项目 2',关联: ''}]}]}},方法: {navItemCollapse(索引){this.menuList = this.menuList.map((item, i) => {item.expand = !item.expand如果(我!==索引){item.expand = false}归还物品})}}})

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="样式表" 完整性="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="匿名"><script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
    <li v-for="(navItem,i) in menuList" :key="i" class="nav-item"><a class="nav-link" href="javascript:;"data-toggle="collapse" role="button" :aria-expanded="navItem.expand" aria-controls="sidebar-products" @click.prevent="navItemCollapse(i)"><i class="ni ni-single-copy-04 text-primary"></i><span class="nav-link-text">{{navItem.name}}</span></a><div v-if="navItem.items.length>0" class="collapse" :class="{show: navItem.expand}"><ul class="nav nav-sm flex-column"><li v-for="(subItem,j) in navItem.items" :key="j" class="nav-item"><a href="#" class="nav-link">{{subItem.name}}</a>

我将菜单数据整合到一个对象数组中.每个对象都有一个 expand 标志来确定它当前是否被展开.点击菜单时,切换当前菜单的展开标志.

注意:您不需要关心标签的id.

I am using bootstrap 4.3.1 and vue@2.6.10

I have this menu (is using collapse - and I don`t want to use JQuery):

 <li class="nav-item">
     <a class="nav-link" href="#sidebar-products" data-toggle="collapse" role="button" aria-expanded="false" aria-controls="sidebar-products">
         <i class="ni ni-single-copy-04 text-primary"></i>
         <span class="nav-link-text">Products</span>
     </a>
     <div class="collapse" id="sidebar-products">
         <ul class="nav nav-sm flex-column">
             <li class="nav-item">
                 <a href="#" class="nav-link">Item List 1</a>
             </li>
             <li class="nav-item">
                 <a href="#" class="nav-link">Item List 2</a>
             </li>
         </ul>
     </div>
 </li>

This is only a single block that contains 2 sub-items.

What I saw using JQuery, when click on "Products" the #sidebar-products receives the .show class and aria-expanded="true".

When having multiple blocks - when click on a block to close (if there are collapsed) the others blocks.

How can I make it work the collapse with vue?

UPDATE 1

I created a click event that do the job:

<a class="nav-link" href="javascript:void(0)" @click="navItemCollapse('sidebar-products', $event)" data-toggle="collapse" role="button" aria-expanded="false" aria-controls="sidebar-products">

and the event:

 navItemCollapse(id, event) {
     let expanded = event.target.getAttribute('aria-expanded').toLocaleLowerCase() == 'true' ? true : false;
     let el = document.getElementById(id);
     expanded ? el.classList.remove('show') : el.classList.add('show');
                event.target.setAttribute('aria-expanded', !expanded);
 }

But what if I have more blocks ? When click to open the current collapse on a block to close the others ???

解决方案

This is the implementation of no jquery

new Vue({
  el: '#app',
  data() {
    return {
      menuList: [{
          name: 'Products',
          expand: false,
          items: [{
              name: 'Item List 1',
              link: ''
            },
            {
              name: 'Item List 2',
              link: ''
            }
          ]
        },
        {
          name: 'Others',
          expand: false,
          items: [{
              name: 'Other Item 1',
              link: ''
            },
            {
              name: 'Other Item 2',
              link: ''
            }
          ]
        }
      ]
    }
  },
  methods: {
    navItemCollapse(index) {
      this.menuList = this.menuList.map((item, i) => {
        item.expand = !item.expand
        if (i !== index) {
          item.expand = false
        }
        return item
      })
    }
  }
})

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>

<ul id="app">
  <li v-for="(navItem,i) in menuList" :key="i" class="nav-item">
    <a class="nav-link" href="javascript:;" data-toggle="collapse" role="button" :aria-expanded="navItem.expand" aria-controls="sidebar-products" @click.prevent="navItemCollapse(i)">
      <i class="ni ni-single-copy-04 text-primary"></i>
      <span class="nav-link-text">{{navItem.name}}</span>
    </a>
    <div v-if="navItem.items.length>0" class="collapse" :class="{show: navItem.expand}">
      <ul class="nav nav-sm flex-column">
        <li v-for="(subItem,j) in navItem.items" :key="j" class="nav-item">
          <a href="#" class="nav-link">{{subItem.name}}</a>
        </li>
      </ul>
    </div>
  </li>
</ul>

I integrate the menu data into an array of objects. Each object has an expand flag to determine whether it is currently expanded. When you click on the menu, switch the expand flag of the current menu.

Note: You don't need to care about the id of the <a> tag.

这篇关于如何使 bootstrap4 折叠在 vue 中工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆