Fareyle üzerine gelme veya üzerine gelme vue.js


106

Vue.js'de bir öğenin üzerine geldiğimde bir div göstermek istiyorum. Ama işe yarayacak gibi görünmüyorum.

Görünüşe göre vue.js'de fareyle üzerine gelme veya fareyle üzerine gelme etkinliği yok. Bu gerçekten doğru mu?

Jquery hover ve vue yöntemlerini birleştirmek mümkün olabilir mi?


2
v-on yönergesi "hover" olayı için de çalışır. Sorunuza yazdığınız kodu eklerseniz, muhtemelen çalıştırmanıza yardımcı olabiliriz. Ve evet, Vue basit ve küçüktür ve jQuery gibi diğer paketlerle entegre olması amaçlanmıştır.
David K. Hess

Yanıtlar:


95

İşte istediğini düşündüğüm şeyin çalışan bir örneği.

http://jsfiddle.net/1cekfnqw/3017/

 <div id="demo">
        <div v-show="active">Show</div>
        <div @mouseover="mouseOver">Hover over me!</div>
    </div>

var demo = new Vue({
    el: '#demo',
    data: {
        active: false
    },
    methods: {
        mouseOver: function(){
            this.active = !this.active;   
        }
    }
});

26
en yeni vue sürümüyle çalışmaz. @CYB cevabınızı düzenlemeye çalıştı v-on:mouseover="mouseOver"ancak sözdiziminin hangi sürümünde değiştiğini
belirtmedi

2
@NICO'nun benimkinden daha iyi bir çözümü var ve güncel sürümle çalışıyor (bu yazının yazıldığı sırada 1.0.26). Lütfen cevabına bakın. Teşekkür ederim.
Jarrod

1
Az önce belirttiğim için bunu silmek istiyorum, aşağıdaki @NICO tarafından yazılan gönderi benimkinden daha iyi ve daha güncel. Lütfen NICO'ya doğru cevabı verin, ben de benimkini sileceğim. Teşekkür ederim!
Jarrod

2
örnek bozuldu mu?
user3743266

3
Kısa eli @mouseover:mouseover
kullansan

176

Üzerine gelme mantığının yanlış olduğunu hissediyorum. sadece fare gezindiğinde tersine döner. aşağıdaki kodu kullandım. mükemmel çalışıyor gibi görünüyor.

<div @mouseover="upHere = true" @mouseleave="upHere = false" >
    <h2> Something Something </h2>
    <some-component v-show="upHere"></some-component>
</div>

vue örneğinde

data : {
    upHere : false
}

umarım yardımcı olur


15
Kabul edilen cevap bu olmalı! Kabul edilen ve en çok oy alan cevap titreyen bir bileşene neden olur. @ Mouseover-div tersine döndüğü üzerinde imlecin her hareketi mevcut durumu ...
Stefan Medack

Konuşma balonu gibi gizli bir div gösteriyorsanız, fareyle üzerine gelindiğinde titreyeceksiniz. Sadece aynı harika mouseover / mouseleave kodunu gizli div öğesine de ekleyin.
mcmacerson

Benim için çalışıyor, web paketi ile verilerinizi şu şekilde değiştirmeniz gerekiyor:data: () => ({ upHere: false })
Emile Cantero

77

Burada bir yönteme gerek yok.

HTML

<div v-if="active">
    <h2>Hello World!</h2>
 </div>

 <div v-on:mouseover="active = !active">
    <h1>Hover me!</h1>
 </div>

JS

new Vue({
  el: 'body',
  data: {
    active: false
  }
})

10

1
Html olay özniteliklerinden herhangi biri için veya onile değiştirebilirsiniz . w3schools.com/tags/ref_eventattributes.aspv-on:@
nu everest

Sorun ne? Bu işe yarıyor ve doğru cevap olarak işaretlenmelidir.
NICO

Vue 2.2.0 bundan hoşlanmıyor - bir uyarı yayınlayın "[Vue warn]: Vue'yu <html> veya <body> 'ye bağlamayın - bunun yerine normal elemanlara monte edin."
Dima Fomin

Basitlik uğruna <body> 'i bir vue örneği yaptım. Tabii ki bunu gerçek dünya uygulamanızda yapmamalısınız.
NICO

25

Alt öğe veya kardeş öğeleri göstermek yalnızca CSS ile mümkündür. Eğer kullanırsanız :hover, bağdaştırıcılarla önce ( +, ~, >, space). Bu durumda stil, üzerine gelinen öğeye uygulanmaz.

HTML

<body>
  <div class="trigger">
    Hover here.
  </div>
  <div class="hidden">
    This message shows up.
  </div>
</body>

CSS

.hidden { display: none; }
.trigger:hover + .hidden { display: inline; }

1
Soru soran özellikle vue.js hakkında soru soruyor. Javascript'in mouseover olayına kolayca bağlanmasına izin verdiği için.
nu everest

5
Vue kullanıyorum ve bu benim için en iyi çözüm. Yalnızca fareyle üzerine gelindiğinde görünmesi gereken düğmeler içeren iç içe geçmiş bir listem var ve fareyle üzerine gelme durumunu izlemek için fazladan değişkenler kullanmak çok fazla. CSS çok daha zariftir. Teşekkürler qsc!
david_nash

13

mouseoverVe mouseleaveolayları ile bu mantığı uygulayan ve işlemedeki değere tepki veren bir geçiş işlevi tanımlayabilirsiniz.

Bu örneği kontrol edin:

var vm = new Vue({
	el: '#app',
	data: {btn: 'primary'}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">


<div id='app'>
    <button
        @mouseover="btn='warning'"
        @mouseleave="btn='primary'"
        :class='"btn btn-block btn-"+btn'>
        {{ btn }}
    </button>
</div>


css son işlemcileri, örneğin purgecss, sınıflarınızı böyle dinamik olarak oluşturduğunuzda alamayacaktır. daha iyi:@mouseover="btn-color='btn-warning' @mouseleave="btn-color='btn-primary' :class="btn btn-block { btn-color}"
Erich

7

İle mouseovertek unsur kalır görünür ben bu ilave fare yaprakları Vurgulanan eleman, bu nedenle zaman:

@mouseover="active = !active" @mouseout="active = !active"

<script>
export default {
  data(){
   return {
     active: false
   }
 }
</script>

7

Kesinlikle bir bileşenin şablonunda bir sınıfın üzerine gelindiğinde geçiş yapmak mümkündür, ancak bariz nedenlerden dolayı pratik bir çözüm değildir. Öte yandan prototipleme için, komut dosyası içinde veri özelliklerini veya olay işleyicilerini tanımlamak zorunda kalmamayı faydalı buluyorum.

Vuetify kullanarak simge renklerini nasıl deneyebileceğinize dair bir örnek.

new Vue({
  el: '#app'
})
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>

<div id="app">
  <v-app>
    <v-toolbar color="black" dark>
      <v-toolbar-items>
        <v-btn icon>
          <v-icon @mouseenter="e => e.target.classList.toggle('pink--text')" @mouseleave="e => e.target.classList.toggle('pink--text')">delete</v-icon>
        </v-btn>
        <v-btn icon>
          <v-icon @mouseenter="e => e.target.classList.toggle('blue--text')" @mouseleave="e => e.target.classList.toggle('blue--text')">launch</v-icon>
        </v-btn>
        <v-btn icon>
          <v-icon @mouseenter="e => e.target.classList.toggle('green--text')" @mouseleave="e => e.target.classList.toggle('green--text')">check</v-icon>
        </v-btn>
      </v-toolbar-items>
    </v-toolbar>
  </v-app>
</div>


2

Ben de aynı problemi buldum ve çözüyorum!

        <img :src='book.images.small' v-on:mouseenter="hoverImg">



1

Yine de yeni kompozisyon api'sini kullanarak bir güncelleme verecektim.

Bileşen

<template>
  <div @mouseenter="hovering = true" @mouseleave="hovering = false">
    {{ hovering }}
  </div>
</template>

<script lang="ts">
  import { ref } from '@vue/compsosition-api'

  export default {
    setup() {
      const hoverRef = ref(false)
      return { hovering }
    }
  })
</script>

Yeniden Kullanılabilir Kompozisyon İşlevi

Bir useHoverişlev oluşturmak , herhangi bir bileşende yeniden kullanmanıza izin verir.

export function useHover(target: Ref<HTMLElement | null>) {
  const hovering = ref(false)

  const enterHandler = () => (hovering.value = true)
  const leaveHandler = () => (hovering.value = false)

  onMounted(() => {
    if (!target.value) return
    target.value.addEventListener('mouseenter', enterHandler)
    target.value.addEventListener('mouseleave', leaveHandler)
  })

  onUnmounted(() => {
    if (!target.value) return
    target.value.removeEventListener('mouseenter', enterHandler)
    target.value.removeEventListener('mouseleave', leaveHandler)
  })

  return hovering
}

İşte bir Vue bileşeninin içindeki işlevi çağıran hızlı bir örnek.

<template>
  <div ref="hoverRef">
    {{ hovering }}
  </div>
</template>

<script lang="ts">
  import { ref } from '@vue/compsosition-api'
  import { useHover } from './useHover'

  export default {
    setup() {
      const hoverRef = ref(null)
      const hovering = useHover(hoverRef)
      return { hovering, hoverRef }
    }
  })
</script>

Ayrıca @vuehooks/coredahil olmak üzere birçok yararlı işlevle birlikte gelen bir kitaplığı da kullanabilirsiniz useHover.


0

MouseOver ve MouseOut için çok basit bir örnek:

<div id="app">
   <div :style = "styleobj" @mouseover = "changebgcolor" @mouseout = "originalcolor"> 
   </div>
</div>

new Vue({
  el:"#app",
  data:{
     styleobj : {
       width:"100px",
       height:"100px",
       backgroundColor:"red"
     }
  },
  methods:{
    changebgcolor : function() {
      this.styleobj.backgroundColor = "green";
    },
    originalcolor : function() {
      this.styleobj.backgroundColor = "red";
    }
  }
});

0

Bir göz atın lütfen vue-mouseover sen eğer paketin memnun değil bu kod görünüm nasıl yaptığını:

<div
    @mouseover="isMouseover = true"
    @mouseleave="isMouseover = false"
/>

vue-mouseoverv-mouseover , imleç direktifin eklendiği bir HTML öğesine girdiğinde veya bu öğeden çıktığında belirtilen veri bağlamı özelliğini otomatik olarak güncelleyen bir yönerge sağlar .

Bir sonraki örnekte varsayılan olarak isMouseoverözellik true, imleç bir HTML öğesinin üzerindeyken ve falseaksi halde:

<div v-mouseover="isMouseover" />

Ayrıca varsayılan olarak isMouseoveredilecektir başlangıçta atanmış zaman v-mouseovertakılır diveleman ilk önce atanmamış kalmayacaktır yüzden, mouseenter/ 'mouseleave olayı.

Yönerge aracılığıyla özel değerler belirtebilirsiniz v-mouseover-value:

<div
    v-mouseover="isMouseover"
    v-mouseover-value="customMouseenterValue"/>

veya

<div
    v-mouseover="isMouseover"
    v-mouseover-value="{
        mouseenter: customMouseenterValue,
        mouseleave: customMouseleaveValue
    }"
/>

Özel varsayılan değerler , kurulum sırasında seçenekler nesnesi aracılığıyla pakete geçirilebilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.