Najechanie myszą lub najechanie kursorem na vue.js


106

Chciałbym pokazać element div po najechaniu kursorem na element w vue.js. Ale nie wydaje mi się, żeby to działało.

Wygląda na to, że w vue.js. nie ma zdarzenia dla najechania myszą lub najechania myszą. Czy to prawda?

Czy byłoby możliwe połączenie metod jquery hover i vue?


2
Dyrektywa v-on działa również dla zdarzenia „hover”. Jeśli dodasz do swojego pytania napisany kod, prawdopodobnie pomożemy Ci go uruchomić. I tak, Vue jest prosty i mały i przeznaczony do integracji z innymi pakietami, takimi jak jQuery.
— David K. Hess

Odpowiedzi:


95

Oto roboczy przykład tego, o co myślę, że prosisz.

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
nie działa z najnowszą wersją vue. @CYB próbował edytować twoją odpowiedź, v-on:mouseover="mouseOver"ale nie wspomniał, w której wersji vue zmieniła się składnia
— kwiecień

2
@NICO ma lepsze rozwiązanie niż moje i działa z aktualną wersją (1.0.26 w czasie tego postu). Proszę odnieść się do jego odpowiedzi. Dziękuję Ci.
— Jarrod

1
Chciałbym to usunąć, ponieważ właśnie powiedziałem, poniższy post @NICO jest lepszy niż mój i bardziej aktualny. Proszę podać NICO poprawną odpowiedź, a ja usunę swoją. Dziękuję Ci!
— Jarrod

2
przykład jest zepsuty?
— user3743266

3
Myślę, że lepiej użyć krótkiej ręki @mouseover:mouseover
— Davod Aslanifakor

176

wydaje mi się, że powyższa logika dla najechania myszą jest nieprawidłowa. po prostu odwraca się, gdy mysz się unosi. użyłem poniższego kodu. wydaje się, że działa doskonale.

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

w instancji vue

data : {
    upHere : false
}

Mam nadzieję, że to pomoże


15
To powinna być akceptowana odpowiedź! Zaakceptowana i najbardziej pozytywna odpowiedź skutkuje migotaniem składnika. Każdy ruch kursora na @ mouseover-div odwraca bieżący stan ...
— Stefan Medack

Jeśli pokazujesz ukryty element div, taki jak dymek, po najechaniu kursorem myszy zacznie migotać. Po prostu dodaj ten sam niesamowity kod mouseover / mouseleave do ukrytego div.
— mcmacerson,

U mnie działa, z webpackiem wystarczy zmienić swoje dane jako:data: () => ({ upHere: false })
— Emile Cantero

77

Tutaj nie ma potrzeby stosowania metody.

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
Możesz użyć v-on:mouseoverskrótu lub skrótu @mouseoverz dokumentacji vuejs.org/guide/syntax.html#v-on-Shorthand
— nu everest

1
Można wymienić onz v-on:lub @do jednego z atrybutów zdarzeń html. w3schools.com/tags/ref_eventattributes.asp
— nu everest

Jaki jest problem? Ta odpowiedź działa i powinna zostać oznaczona jako poprawna.
— NICO

Vue 2.2.0 tego nie lubi - wypluj ostrzeżenie "[Vue warn]: Nie montuj Vue do <html> lub <body> - zamiast tego zamontuj na zwykłych elementach."
— Dima Fomin

Dla uproszczenia utworzyłem instancję <body> vue. Oczywiście nie powinieneś tego robić w swojej aplikacji w świecie rzeczywistym.
— NICO

25

Aby pokazać elementy potomne lub rodzeństwo, jest to możliwe tylko za pomocą CSS. Jeśli używasz :hoverprzed kombinatorów ( +, ~, >, space). Wtedy styl nie dotyczy elementu najechanego kursorem.

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
Pytający pyta konkretnie o vue.js. Ponieważ pozwala na łatwe powiązanie javascript ze zdarzeniem mouseover.
— nu everest

5
Używam Vue i to jest dla mnie najlepsze rozwiązanie. Mam zagnieżdżoną listę z przyciskami, które powinny pojawiać się tylko po najechaniu kursorem, a używanie dodatkowych zmiennych do śledzenia stanu najechania jest przesadą. CSS jest znacznie bardziej elegancki. Dzięki qsc!
— david_nash

13

Z mouseoveri mouseleavezdarzenia można zdefiniować funkcję przełączania, który implementuje ten logiczny i reagować na wartości w renderingu.

Sprawdź ten przykład:

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>


Postprocesory css, np. purgecss, nie będą w stanie odebrać twoich klas, jeśli dynamicznie je zbudujesz w ten sposób. lepiej:@mouseover="btn-color='btn-warning' @mouseleave="btn-color='btn-primary' :class="btn btn-block { btn-color}"
— Erich

7

Ponieważ mouseovertylko element pozostaje widoczny, gdy mysz opuści element najechany kursorem, dodałem:

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

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

7

Możliwe jest przełączenie klasy po najechaniu kursorem ściśle w obrębie szablonu składnika, jednak nie jest to praktyczne rozwiązanie z oczywistych powodów. Z drugiej strony, przy tworzeniu prototypów uważam, że nie trzeba definiować właściwości danych ani programów obsługi zdarzeń w skrypcie.

Oto przykład, jak możesz eksperymentować z kolorami ikon za pomocą Vuetify.

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>




1

Chociaż dałbym aktualizację przy użyciu nowego interfejsu API kompozycji.

Składnik

<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>

Funkcja kompozycji wielokrotnego użytku

Utworzenie useHoverfunkcji umożliwi ponowne użycie w dowolnych komponentach.

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
}

Oto krótki przykład wywołania funkcji w komponencie Vue.

<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>

Możesz także użyć biblioteki, @vuehooks/corektóra zawiera wiele przydatnych funkcji, w tym useHover.


0

Oto bardzo prosty przykład dla MouseOver i MouseOut:

<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

Proszę spojrzeć na pakiet vue-mouseover , jeśli nie jesteś zadowolony, jak wygląda ten kod:

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

vue-mouseover udostępnia v-mouseoverdyrektywę, która automatycznie aktualizuje określoną właściwość kontekstu danych, gdy kursor wchodzi lub opuszcza element HTML, do którego jest dołączona dyrektywa.

Domyślnie w następnym przykładzie isMouseoverwłaściwość będzie miała miejsce, truegdy kursor znajduje się nad elementem HTML, a w falseprzeciwnym razie:

<div v-mouseover="isMouseover" />

Również domyślnie isMouseoverzostanie przypisany początkowo, gdy v-mouseoverzostanie dołączony do divelementu, więc nie pozostanie nieprzypisany przed pierwszym zdarzeniem mouseenter/ mouseleave.

Możesz określić wartości niestandardowe za pomocą v-mouseover-valuedyrektywy:

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

lub

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

Niestandardowe wartości domyślne można przekazać do pakietu za pośrednictwem obiektu opcji podczas instalacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.