我想在vue.js中实现鼠标悬停在元素上时显示一个div,但似乎无法使其正常工作。
看起来在vue.js中没有
hover
或mouseover
事件,这是真的吗?
是否有可能结合jquery的hover方法和vue的方法来完成此功能?hover
或mouseover
事件,这是真的吗?
是否有可能结合jquery的hover方法和vue的方法来完成此功能?我觉得悬停的逻辑是错误的。它仅在鼠标悬停时才反转。我使用了以下代码,看起来完美无瑕。
<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 })
- Emile Cantero这是我认为你所要求的工作示例。
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版本中语法发生了变化。 - Aprillion@mouseover:mouseover
。 - Davod Aslani Fakor这里不需要一个方法。
HTML
<div v-if="active">
<h2>Hello World!</h2>
</div>
<div v-on:mouseover="active = !active">
<h1>Hover me!</h1>
</div>
JavaScript
new Vue({
el: 'body',
data: {
active: false
}
})
v-on:mouseover
或快捷方式 @mouseover
。 - nu evereston
替换为 v-on:
或 @
,用于任何 HTML 事件属性。http://www.w3schools.com/tags/ref_eventattributes.asp - nu everest仅使用CSS可以显示子元素或同级元素。如果在组合器(+
,~
,>
,空格
)之前使用 :hover
,则样式不会应用于悬停的元素。
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}"
- Erich我认为你想要实现的是通过结合以下两个方面来完成:
@mouseover, @mouseout, @mouseenter and @mouseleave
所以最佳的两种组合方式是:
"@mouseover and @mouseout"
"@mouseenter and @mouseleave"
我认为,最好使用第二个,这样您可以实现悬停效果并在其上调用功能。
<div @mouseenter="activeHover = true" @mouseleave="activeHover = false" >
<p v-if="activeHover"> This will be showed on hover </p>
<p v-if ="!activeHover"> This will be showed in simple cases </p>
</div>
在 Vue 实例上
data : {
activeHover : false
}
注意:第一对会影响/传递给子元素,但第二对仅会影响您想要使用的位置而不是子元素。否则,使用第一对可能会导致某些故障/波动。因此,最好使用第二对以避免任何波动。
希望这也能帮助其他人 :)
我会使用新的组合 API 给出更新。
<template>
<div @mouseenter="hovering = true" @mouseleave="hovering = false">
{{ hovering }}
</div>
</template>
<script>
import { ref } from '@vue/composition-api'
export default {
setup() {
const hovering = 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/composition-api'
import { useHover } from './useHover'
export default {
setup() {
const hoverRef = ref(null)
const hovering = useHover(hoverRef)
return { hovering, hoverRef }
}
})
</script>
你也可以使用类库,例如@vuehooks/core
,其中包含许多有用的函数,包括useHover
。
参考文献:Vue.js 组合式 API
在组件模板中严格地悬停切换类是可能的,但出于明显的原因,这不是一个实用的解决方案。然而,对于原型设计,我发现无需在脚本中定义数据属性或事件处理程序很有用。
以下是使用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>
仅使用 mouseover
时,当鼠标离开被悬停元素后,元素会消失,因此我添加了以下内容:
@mouseover="active = !active" @mouseout="active = !active"
<script>
export default {
data(){
return {
active: false
}
}
</script>
<img :src='book.images.small' v-on:mouseenter="hoverImg">