在鼠标悬停时动态添加和删除类-Vue.js

Bit*_*ise 3 javascript vue.js vue-component

我可以使用Vue在鼠标悬停时成功添加一个类。但是我想在鼠标离开元素时删除该类。在Vue中处理此问题的惯用方式是什么?

<template>
  <div id="navigation">
    <div class="nav-container">
      <nav>
        <router-link to="/" class="home">Ping Party</router-link>
        <div class="navigation-actions">
          <router-link to="/sign_in" v-if="!isLoggedIn" class="sign_in">Sign In</router-link>
          <router-link to="/sign_up" v-if="!isLoggedIn" @mouseover.native="mouseOver" class="sign_up" ref="sign_up">Sign Up</router-link>
          <router-link to="/users" v-if="isLoggedIn" class="users">Users</router-link>
          <v-btn :click.prevent="signOut()" v-if="isLoggedIn">Sign Out</v-btn>
        </div>
      </nav>
    </div>
  </div>
</template>

<script>
  import SignUp from "../forms/SignUp";
  import SignIn from "../forms/SignIn";

  export default {
    components: {
      SignUp,
      SignIn
    },
    computed: {
      isLoggedIn () {
        return this.$store.getters.isLoggedIn
      }
    },
    methods: {
      signOut: function() {
        this.$store.commit("LOGOUT")
        this.$store.commit("FLASH_MESSAGE", {
          message: "Signed Out Successfully",
          show: true,
          styleClass: "error",
          timeOut: 4000
        })
        this.$router.push('/')
      },
      mouseOver: function() {
        this.$refs.sign_up.$vnode.elm.classList.add("hovered")
      }
    }
  }
</script>
Run Code Online (Sandbox Code Playgroud)

正如您在mouseover上看到的那样,我调用mouseOver函数,这成功地将类添加到元素中。但是现在,当用户离开元素时,该类仍然存在。用户离开元素时如何删除类?谢谢您的帮助。

Ber*_*ert 12

两者都听,mouseovermouseout根据此设置课程。

console.clear()

new Vue({
  el: "#app",
  data:{
    isHovering: false
  }
})
Run Code Online (Sandbox Code Playgroud)
.hovering{
  color: red
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<div id="app">
  <h1 @mouseover="isHovering = true" 
      @mouseout="isHovering = false" 
      :class="{hovering: isHovering}">
    {{ isHovering ? "Woot! Hovered" : "Hover over me" }}
  </h1>
</div>
Run Code Online (Sandbox Code Playgroud)

或者只是使用CSS。

console.clear()

new Vue({
  el: "#app",
  data:{
    isHovering: false
  }
})
Run Code Online (Sandbox Code Playgroud)
h1:hover{
  color: red
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<div id="app">
  <h1 @mouseover="isHovering = true" 
      @mouseout="isHovering = false" >
    {{ isHovering ? "Woot! Hovered" : "Hover over me" }}
  </h1>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 但是请记住,CSS OP中有一个`:hover`。这完全是矫kill过正。所以`.sign_up:hover {color:red; }`将为您带来更清晰的相同结果。 (3认同)
  • 是的,这确实有道理。我只是想了解如何在 Vue 中做这样的事情。但是,是的,这可以更容易地完成。 (2认同)

小智 12

更具可扩展性的解决方案是使用指令:

// Directives
Vue.directive('add-class-hover', {
  bind(el, binding, vnode) {    
    const { value="" } = binding;
    el.addEventListener('mouseenter',()=> {
        el.classList.add(value)
    });
    el.addEventListener('mouseleave',()=> {
        el.classList.remove(value)
    });
  },
  unbind(el, binding, vnode) {
    el.removeEventListener('mouseenter');
    el.removeEventListener('mouseleave')
  }
})

new Vue({
  el: "#app"
})
Run Code Online (Sandbox Code Playgroud)
.hoverClass {
color: red;
font-weight: 700;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <h1 v-add-class-hover="'hoverClass'">
    Text
  </h1>
</div>
Run Code Online (Sandbox Code Playgroud)