วางเมาส์เหนือหรือวางเมาส์เหนือ vue.js


105

ฉันต้องการแสดง div เมื่อวางเมาส์เหนือองค์ประกอบใน vue.js แต่ดูเหมือนว่าจะใช้งานไม่ได้

ดูเหมือนว่าจะไม่มีเหตุการณ์สำหรับการวางเมาส์เหนือหรือวางเมาส์ใน vue.js นี่มันเรื่องจริงเหรอ?

เป็นไปได้ไหมที่จะรวมวิธีการโฮเวอร์ jquery และ vue เข้าด้วยกัน


2
คำสั่ง v-on ทำงานสำหรับเหตุการณ์ "hover" ด้วย หากคุณเพิ่มคำถามของคุณรหัสที่คุณเขียนเราอาจช่วยให้คุณใช้งานได้ ใช่แล้ว Vue นั้นเรียบง่ายและเล็กและตั้งใจที่จะรวมเข้ากับแพ็คเกจอื่น ๆ เช่น jQuery
David K. Hess

คำตอบ:


94

นี่คือตัวอย่างการทำงานของสิ่งที่ฉันคิดว่าคุณกำลังขอ

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
ไม่ทำงานกับ vue เวอร์ชันใหม่ล่าสุด @CYB พยายามแก้ไขคำตอบของคุณv-on:mouseover="mouseOver"แต่ไม่ได้พูดถึงเวอร์ชันของ vue ที่ไวยากรณ์เปลี่ยนไป
Aprillion

2
@NICO มีทางออกที่ดีกว่าของฉันและใช้งานได้กับเวอร์ชันปัจจุบัน (1.0.26 ในขณะที่โพสต์นี้) โปรดอ้างอิงคำตอบของเขา ขอบคุณ.
Jarrod

1
ฉันต้องการลบสิ่งนี้เนื่องจากเพิ่งแจ้งไปโพสต์ด้านล่างโดย @NICO ดีกว่าของฉันและเป็นข้อมูลล่าสุด โปรดให้คำตอบที่ถูกต้องกับ NICO และฉันจะลบของฉัน ขอบคุณ!
Jarrod

2
ตัวอย่างเสีย?
user3743266

3
ฉันคิดว่าใช้มือสั้นดีกว่า @mouseover:mouseover
Davod Aslanifakor

176

ฉันรู้สึกว่าเหนือตรรกะสำหรับการวางเมาส์ไม่ถูกต้อง มันผกผันเมื่อเมาส์เลื่อน ฉันใช้รหัสด้านล่าง ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์ดี

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

บนอินสแตนซ์ vue

data : {
    upHere : false
}

หวังว่าจะช่วยได้


15
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! คำตอบที่ได้รับการยอมรับและได้รับการโหวตมากที่สุดส่งผลให้ส่วนประกอบที่สั่นไหว ทุกการเคลื่อนไหวของเคอร์เซอร์บน @ mouseover-div จะเปลี่ยนสถานะปัจจุบัน ...
Stefan Medack

หากคุณแสดง div ที่ซ่อนอยู่เช่นฟองคำพูดคุณจะกะพริบเมื่อวางเมาส์เหนือ เพียงเพิ่มโค้ด mouseover / mouseleave ที่ยอดเยี่ยมเหมือนกันลงใน div ที่ซ่อนอยู่เช่นกัน
mcmacerson

ใช้ได้ผลสำหรับฉันด้วย webpack เพียงแค่ต้องเปลี่ยนข้อมูลของคุณเป็น:data: () => ({ upHere: false })
Emile Cantero

77

ไม่จำเป็นต้องมีวิธีการที่นี่

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
คุณสามารถใช้อย่างใดอย่างหนึ่งv-on:mouseoverหรือทางลัด@mouseoverตามเอกสารvuejs.org/guide/syntax.html#v-on-Shorthand
nu everest

1
คุณสามารถแทนที่onด้วยv-on:หรือ@สำหรับแอตทริบิวต์เหตุการณ์ html ใดก็ได้ w3schools.com/tags/ref_eventattributes.asp
nu everest

มีปัญหาอะไร? ข้อความนี้ใช้งานได้และควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
NICO

Vue 2.2.0 ไม่ชอบสิ่งนี้ - พ่นคำเตือน "[Vue warn]: อย่าต่อ Vue เป็น <html> หรือ <body> - ติดตั้งกับองค์ประกอบปกติแทน"
Dima Fomin

เพื่อความเรียบง่ายฉันทำให้ <body> เป็นอินสแตนซ์ vue แน่นอนว่าคุณไม่ควรทำเช่นนั้นในการใช้งานจริง
NICO

25

ในการแสดงองค์ประกอบลูกหรือพี่น้องทำได้โดยใช้ CSS เท่านั้น ถ้าคุณใช้:hoverก่อน combinators ( +, ~, >, space) จากนั้นสไตล์จะไม่ใช้กับองค์ประกอบที่วางเมาส์

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
ผู้ถามกำลังถามเกี่ยวกับ vue.js โดยเฉพาะ เนื่องจากช่วยให้ javascript สามารถเชื่อมโยงกับเหตุการณ์ mouseover ได้อย่างง่ายดาย
nu everest

5
ฉันใช้ Vue และนี่เป็นทางออกที่ดีที่สุดสำหรับฉัน ฉันมีรายการที่ซ้อนกันพร้อมปุ่มที่ควรปรากฏบนโฮเวอร์เท่านั้นและการใช้ตัวแปรพิเศษเพื่อติดตามสถานะโฮเวอร์นั้นมากเกินไป CSS มีความสวยงามกว่ามาก ขอบคุณ qsc!
david_nash

13

ด้วยmouseoverและmouseleaveเหตุการณ์คุณสามารถกำหนดฟังก์ชันสลับที่ใช้ตรรกะนี้และตอบสนองกับค่าในการแสดงผล

ตรวจสอบตัวอย่างนี้:

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 เช่น purgecss จะไม่สามารถรับคลาสของคุณได้หากคุณสร้างแบบไดนามิกเช่นนี้ ดีกว่า:@mouseover="btn-color='btn-warning' @mouseleave="btn-color='btn-primary' :class="btn btn-block { btn-color}"
Erich

7

มีmouseoverเพียงองค์ประกอบเท่านั้นที่มองเห็นได้เมื่อเมาส์ออกจากองค์ประกอบที่วางเมาส์ไว้ดังนั้นฉันจึงเพิ่มสิ่งนี้:

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

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

6

เป็นไปได้ที่จะสลับคลาสโดยวางเมาส์เหนือเทมเพลตของคอมโพเนนต์อย่างเคร่งครัดอย่างไรก็ตามไม่ใช่วิธีแก้ปัญหาที่ใช้ได้จริงด้วยเหตุผลที่ชัดเจน สำหรับการสร้างต้นแบบในทางกลับกันฉันพบว่ามีประโยชน์ที่จะไม่ต้องกำหนดคุณสมบัติข้อมูลหรือตัวจัดการเหตุการณ์ภายในสคริปต์

นี่คือตัวอย่างวิธีทดลองใช้สีไอคอนโดยใช้ 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

แม้ว่าฉันจะให้อัปเดตโดยใช้ API องค์ประกอบใหม่

ส่วนประกอบ

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

ฟังก์ชันองค์ประกอบที่ใช้ซ้ำได้

การสร้างuseHoverฟังก์ชันจะช่วยให้คุณสามารถใช้ซ้ำในส่วนประกอบใด ๆ

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
}

นี่คือตัวอย่างสั้น ๆ ที่เรียกใช้ฟังก์ชันภายในคอมโพเนนต์ 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>

นอกจากนี้คุณยังสามารถใช้ห้องสมุดเช่นที่มาพร้อมกับฟังก์ชั่นที่มีประโยชน์มากมายรวมทั้ง@vuehooks/coreuseHover


0

นี่คือตัวอย่างง่ายๆสำหรับ MouseOver และ 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

โปรดดูที่แพ็คเกจvue-mouseoverหากคุณไม่พอใจว่าโค้ดนี้มีหน้าตาอย่างไร:

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

vue-mouseoverจัดเตรียมv-mouseoverคำสั่งที่จะอัปเดตคุณสมบัติบริบทข้อมูลที่ระบุโดยอัตโนมัติเมื่อเคอร์เซอร์เข้าหรือออกจากองค์ประกอบ HTML ที่มีคำสั่งแนบมา

โดยค่าเริ่มต้นในisMouseoverคุณสมบัติตัวอย่างถัดไปจะเป็นtrueเมื่อเคอร์เซอร์อยู่เหนือองค์ประกอบ HTML หรือfalseอื่น ๆ :

<div v-mouseover="isMouseover" />

นอกจากนี้โดยค่าเริ่มต้นisMouseoverจะถูกกำหนดในตอนแรกเมื่อv-mouseoverแนบกับdivองค์ประกอบดังนั้นจะไม่ถูกยกเลิกก่อนเหตุการณ์mouseenter/ mouseleaveเหตุการณ์แรก

คุณสามารถระบุค่าที่กำหนดเองผ่านv-mouseover-valueคำสั่ง:

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

หรือ

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

ค่าเริ่มต้นที่กำหนดเองสามารถส่งผ่านไปยังแพ็กเกจผ่านอ็อบเจกต์ตัวเลือกระหว่างการตั้งค่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.