点击时Vue.js切换类

ada*_*m78 62 css vue.js

你如何在vue.js中切换一个类?

我有以下内容:

<th class="initial " v-on="click: myFilter">
    <span class="wkday">M</span>
</th>

new Vue({
  el: '#my-container',
  data: {},
  methods: {
    myFilter: function(){
      // some code to filter users
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

当我点击th我想要active作为一个类申请如下:

<th class="initial active" v-on="click: myFilter">
    <span class="wkday">M</span>
</th>      
Run Code Online (Sandbox Code Playgroud)

这需要切换,即每次点击它需要添加/删除类.

你是如何在vue.js中做到这一点的?

moa*_*abi 63

无需方法:

// html element
<div id="mobile-toggle"
 v-bind:class="{ active: showMobileMenu }"
 v-on:click="showMobileMenu = !showMobileMenu">
</div>

//in your vue.js app
data: {
    showMobileMenu: false
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来不错!关于如何在v-for中做到这一点的任何想法? (4认同)
  • @ConnorLeech`&lt;li v-for =“(item,index)in items”:key =“ item.id” v-bind:class =“ {active:active == item}” @ click =“ active = item” &gt;`然后添加`.active {styles}`并将其放在`&lt;ul&gt;`中 (2认同)

Dou*_*sar 58

您可以让活动类依赖于布尔数据值:

<th 
    class="initial " 
    v-on="click: myFilter"
    v-class="active: isActive"
>
   <span class="wkday">M</span>
</th>



    new Vue({
      el: '#my-container',

      data: {
          isActive: false
      },

      methods: {
        myFilter: function(){
            this.isActive = !this.isActive;
          // some code to filter users
        }
      }
    })
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因,`v-class ="active:isActive"`崩溃我的应用程序,但`v-bind:class ="{active:isActive}"`对我有用.希望这对某人有帮助. (30认同)
  • 语法似乎随着vue一直在变化.在2.*你也可以做`:class ="..."` (4认同)
  • 我在vue.js-2中这样做.当我单击一行时,`active`类将应用于所有行.难道我做错了什么? (4认同)
  • 设置 Active 类的所有示例都只针对一个项目,如果我有多个 I v-for 渲染,那么我将如何在最近单击的此列表中分配 Active 类。`&lt;a href="#" @click="switchRoom(room)" class="rooms" :class="{currentRoom: room.isActive}" v-for="(room, index) in allRooms" :key= "index"&gt;{{ room.name }} &lt;/a&gt;` (3认同)

Nat*_*teW 23

这个答案相关 Vue.js version 2

<th 
  class="initial " 
  v-on:click="myFilter"
  v-bind:class="{ active: isActive }"
>
  <span class="wkday">M</span>
</th>
Run Code Online (Sandbox Code Playgroud)

道格拉斯的其余答案仍然适用(使用等设置新的Vue实例isActive: false).

相关文档:https://vuejs.org/v2/guide/class-and-style.html#Object-Syntaxhttps://vuejs.org/v2/guide/events.html#Method-Event-Handlers


Fab*_*rts 14

如果您不需要从元素外部访问切换,则此代码在没有数据变量的情况下工作:

<a @click="e => e.target.classList.toggle('active')"></a>
Run Code Online (Sandbox Code Playgroud)

  • 想要这个。简单&amp;通用。 (2认同)
  • 我对 Vue 有点陌生,但我在这个解决方案中遇到了一个问题。当我在 vue-bootstrap 卡父元素上添加 @click="e =&gt; e.target.classList.toggle('active')" 时,会发生的是整个卡没有获得 CSS 切换,而是该类应用于单击卡的一部分,您可以在一张卡中切换多个。 (2认同)
  • @Kevz 这确实是这种方法的限制 - 它只切换事件目标,这是您单击的最嵌套的 &lt;a&gt; 或 &lt;button&gt; 。对于您的问题,我将使用此页面上的数据变量解决方案之一。 (2认同)

Huỳ*_*yễn 10

1.

@click="$event.target.classList.toggle('active')"
Run Code Online (Sandbox Code Playgroud)

2.

:class="{ active }"
@click="active = !active"
Run Code Online (Sandbox Code Playgroud)

3.

:class="'initial ' + (active ? 'active' : '')"  
@click="active = !active"
Run Code Online (Sandbox Code Playgroud)

4.

:class="['initial', { active }]"  
@click="active = !active"
Run Code Online (Sandbox Code Playgroud)

参考链接:https : //vuejs.org/v2/guide/class-and-style.html

演示:

@click="$event.target.classList.toggle('active')"
Run Code Online (Sandbox Code Playgroud)
:class="{ active }"
@click="active = !active"
Run Code Online (Sandbox Code Playgroud)
:class="'initial ' + (active ? 'active' : '')"  
@click="active = !active"
Run Code Online (Sandbox Code Playgroud)


小智 8

此示例使用列表:在某些位置单击时,它变为红色

的HTML:

<div id="app">
  <ul>
    <li @click="activate(li.id)" :class="{ active : active_el == li.id }" v-for="li in lista">{{li.texto}}</li>   
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

JS:

var app = new Vue({
  el:"#app",
  data:{
    lista:[{"id":"1","texto":"line 1"},{"id":"2","texto":"line 2"},{"id":"3","texto":"line 3"},{"id":"4","texto":"line 4"},{"id":"5","texto":"line 5"}],
    active_el:0
  },
  methods:{
    activate:function(el){
        this.active_el = el;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

的CSS

ul > li:hover {
  cursor:pointer;
}
.active {
  color:red;
  font-weight:bold;
}
Run Code Online (Sandbox Code Playgroud)

小提琴:

https://jsfiddle.net/w37vLL68/158/


hbu*_*ens 5

除了NateW的答案外,如果CSS类名称中包含连字符,则应将该类包装在(单引号)内:

<th 
  class="initial " 
  v-on:click="myFilter"
  v-bind:class="{ 'is-active' : isActive}"
>

 <span class="wkday">M</span>
 </th>
Run Code Online (Sandbox Code Playgroud)

有关主题的更多信息,请参见主题。