ฉันต้องการแสดง div เมื่อวางเมาส์เหนือองค์ประกอบใน vue.js แต่ดูเหมือนว่าจะใช้งานไม่ได้
ดูเหมือนว่าจะไม่มีเหตุการณ์สำหรับการวางเมาส์เหนือหรือวางเมาส์ใน vue.js นี่มันเรื่องจริงเหรอ?
เป็นไปได้ไหมที่จะรวมวิธีการโฮเวอร์ jquery และ vue เข้าด้วยกัน
ฉันต้องการแสดง div เมื่อวางเมาส์เหนือองค์ประกอบใน vue.js แต่ดูเหมือนว่าจะใช้งานไม่ได้
ดูเหมือนว่าจะไม่มีเหตุการณ์สำหรับการวางเมาส์เหนือหรือวางเมาส์ใน vue.js นี่มันเรื่องจริงเหรอ?
เป็นไปได้ไหมที่จะรวมวิธีการโฮเวอร์ jquery และ vue เข้าด้วยกัน
คำตอบ:
นี่คือตัวอย่างการทำงานของสิ่งที่ฉันคิดว่าคุณกำลังขอ
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;
}
}
});
v-on:mouseover="mouseOver"
แต่ไม่ได้พูดถึงเวอร์ชันของ vue ที่ไวยากรณ์เปลี่ยนไป
@mouseover:mouseover
ฉันรู้สึกว่าเหนือตรรกะสำหรับการวางเมาส์ไม่ถูกต้อง มันผกผันเมื่อเมาส์เลื่อน ฉันใช้รหัสด้านล่าง ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์ดี
<div @mouseover="upHere = true" @mouseleave="upHere = false" >
<h2> Something Something </h2>
<some-component v-show="upHere"></some-component>
</div>
บนอินสแตนซ์ vue
data : {
upHere : false
}
หวังว่าจะช่วยได้
data: () => ({ upHere: false })
ไม่จำเป็นต้องมีวิธีการที่นี่
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
}
})
v-on:mouseover
หรือทางลัด@mouseover
ตามเอกสารvuejs.org/guide/syntax.html#v-on-Shorthand
on
ด้วยv-on:
หรือ@
สำหรับแอตทริบิวต์เหตุการณ์ html ใดก็ได้ w3schools.com/tags/ref_eventattributes.asp
ในการแสดงองค์ประกอบลูกหรือพี่น้องทำได้โดยใช้ 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; }
ด้วย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>
@mouseover="btn-color='btn-warning' @mouseleave="btn-color='btn-primary' :class="btn btn-block { btn-color}"
มีmouseover
เพียงองค์ประกอบเท่านั้นที่มองเห็นได้เมื่อเมาส์ออกจากองค์ประกอบที่วางเมาส์ไว้ดังนั้นฉันจึงเพิ่มสิ่งนี้:
@mouseover="active = !active" @mouseout="active = !active"
<script>
export default {
data(){
return {
active: false
}
}
</script>
เป็นไปได้ที่จะสลับคลาสโดยวางเมาส์เหนือเทมเพลตของคอมโพเนนต์อย่างเคร่งครัดอย่างไรก็ตามไม่ใช่วิธีแก้ปัญหาที่ใช้ได้จริงด้วยเหตุผลที่ชัดเจน สำหรับการสร้างต้นแบบในทางกลับกันฉันพบว่ามีประโยชน์ที่จะไม่ต้องกำหนดคุณสมบัติข้อมูลหรือตัวจัดการเหตุการณ์ภายในสคริปต์
นี่คือตัวอย่างวิธีทดลองใช้สีไอคอนโดยใช้ 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>
ฉันพบปัญหาเดียวกันและฉันก็ทำมันออกมา!
<img :src='book.images.small' v-on:mouseenter="hoverImg">
มี JSFiddle ที่ใช้งานได้ถูกต้อง: http://jsfiddle.net/1cekfnqw/176/
<p v-on:mouseover="mouseOver" v-bind:class="{on: active, 'off': !active}">Hover over me!</p>
แม้ว่าฉันจะให้อัปเดตโดยใช้ 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/core
useHover
นี่คือตัวอย่างง่ายๆสำหรับ 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";
}
}
});
โปรดดูที่แพ็คเกจ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
}"
/>
ค่าเริ่มต้นที่กำหนดเองสามารถส่งผ่านไปยังแพ็กเกจผ่านอ็อบเจกต์ตัวเลือกระหว่างการตั้งค่า