bootstrap-vue:如何识别 b-tab 上的悬停事件

Posted

技术标签:

【中文标题】bootstrap-vue:如何识别 b-tab 上的悬停事件【英文标题】:bootstrap-vue : how to recognize hover event over b-tab 【发布时间】:2020-06-02 17:47:15 【问题描述】:

当标签标题悬停时,我正在尝试更改 bootstrap-vue b-tabs 的活动标签,而不仅仅是在单击时。我无法隔离此事件。

在下面的Codepen example 中,我可以在图像悬停时隔离事件,但是我想在标题(例如“试管和小瓶”)悬停时隔离事件。

我对 Vue 还很陌生,所以如果这是一个简单的答案,我深表歉意,但我已经有一段时间没有为此苦苦挣扎了,也无法弄清楚这一点。谢谢!

组件文件

<template>
    <b-container class="px-3" fluid>
        <div>
            <h3>Range Of Glass Products We Inspect</h3>
            <p>Anything formed from tubular glass</p>
        </div>
        <div>
            <b-tabs content-class="mt-3" align="left" class="vial-types" vertical>
                <b-tab
                        v-for="glassItem in productRange"
                        v-bind:key="glassItem.type"
                        v-bind:ref="glassItem"
                        v-bind:title="glassItem.type"
                        @mouseover.native="greet()"
                        @mouseleave.native="greet()"
                >
                    <b-img
                            v-bind:src="glassItem.image"
                            >
                    </b-img>
                </b-tab>
            </b-tabs>
        </div>
    </b-container>
</template>

<script>
    export default 
        name: "ProductRange",
        data() 
            return 
                productRange: [
                    type: "Screw & Flanged Head", image:"https://picsum.photos/600/400/", hover: false,
                    type: "Tubes and Vials", image:"https://picsum.photos/600/400/", hover: false,
                    type: "Pipettes, Syringes, Filling Needles", image:"https://picsum.photos/400/400/",hover: false,
                    type: "Ampoules", image:"https://picsum.photos/600/400/", hover: false,
                    type: "Custom Geometries Per Customer Specification", image:"https://picsum.photos/600/400/", hover: false
                ]
            
        ,
        methods: 
            greet: function () 
                console.log("Hovering");
            
        
    
</script>

<style lang="sass">

</style>

【问题讨论】:

【参考方案1】:

您也可以使用b-tabtitle 插槽,然后在其中添加一个悬停/取消悬停侦听器:

<b-tabs content-class="mt-3" align="left" class="vial-types" vertical>
  <b-tab
    v-for="glassItem in productRange"
    v-bind:key="glassItem.type"
    v-bind:ref="glassItem"
  >
    <template v-slot:title>
      <div
        @mouseover="hovered"
        @mouseleave="unHovered"
      >
         glassItem.type 
      </div>
    </template>
    <b-img
      v-bind:src="glassItem.image"
      >
    </b-img>
  </b-tab>
</b-tabs>

【讨论】:

谢谢!我尝试了一个模板,但没有想到将鼠标事件放在 div 中 还有一个新的v-b-hover 指令,您可以将它放在 div 中,每当悬停状态发生变化时,它都会调用一个函数。 bootstrap-vue.js.org/docs/directives/hover【参考方案2】:

遗憾的是,我认为没有内置的方法可以轻松做到这一点。

但是,您仍然可以通过隐藏标准选项卡并使用b-nav 自己重构结构并绑定到b-tabs v-model 来解决此问题。

然后您可以将您的事件添加到b-nav-item,因为它们将用作您的选项卡。

new Vue(
  el: "#app",
  data: 
    selectedTab: 0,
    productRange: [
       
        type: "Screw & Flanged Head", 
        image: "https://picsum.photos/600/400/" 
      ,
       
       type: "Tubes and Vials", 
       mage: "https://picsum.photos/640/400/" 
      ,
      
        type: "Pipettes, Syringes, Filling Needles",
        image: "https://picsum.photos/400/400/"
      ,
       
        type: "Ampoules", 
        image: "https://picsum.photos/600/400/" 
      ,
      
        type: "Custom Geometries Per Customer Specification",
        image: "https://picsum.photos/700/400/"
      
    ]
  ,
  methods: 
    greet: function() 
      console.log("hovering");
    ,
    onTabHover(glassItem) 
      console.log("Tab hovered", glassItem)
    
  
);
<link href="https://unpkg.com/bootstrap@4.4.1/dist/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://unpkg.com/bootstrap-vue@2.4.2/dist/bootstrap-vue.css" rel="stylesheet"/>

<script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
<script src="https://unpkg.com/bootstrap-vue@2.4.2/dist/bootstrap-vue.min.js"></script>

<b-container id="app" class="px-3"fluid>
  <div>
    <h3>Range Of Glass Products We Inspect</h3>
    <p>Anything formed from tubular glass</p>
  </div>
  <div>
    <b-row>
      <b-col cols="auto">
        <b-nav pills vertical>
          <b-nav-item v-for="(glassItem, index) in productRange" 
                      :active="selectedTab === index"
                      @click="selectedTab = index"
                      @mouseenter="onTabHover(glassItem)">
             glassItem.type 
          </b-nav-item>
        </b-nav>
      </b-col>
      <b-col>
        <b-tabs v-model="selectedTab" 
                content-class="mt-3" 
                class="vial-types" 
                nav-class="d-none">
         <b-tab
                v-for="glassItem in productRange"
                :key="glassItem.type"
                :ref="glassItem"
                :title="glassItem.type"
                @mouseover.native="greet()"
                @mouseleave.native="greet()"
                >
            <b-img
                   :src="glassItem.image"
                   >
            </b-img>
          </b-tab>
        </b-tabs>
      </b-col>
    </b-row>
  </div>
</b-container>

【讨论】:

以上是关于bootstrap-vue:如何识别 b-tab 上的悬停事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vue 路由中导航到 Bootstrap-vue 选项卡中的特定选项卡?

Bootstrap-vue 选项卡样式

bootstrap-vue 选项卡 - 在 url 中给定锚点打开选项卡内容

Vuejs:当特定选项卡处于活动状态时是不是会发出事件(bootstrap-vue)

v-card 中的 bootstrap-vue v-tabs 呈现“未定义”

如何在 bootstrap vue 的 b-tabs 中显示按钮?