Vue.js alternar clase al hacer clic
Cómo cambiar una clase en vue.js?
Tengo lo siguiente:
<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
}
}
})
Cuando hago clic en th
quiero aplicar active
como una clase de la siguiente manera:
<th class="initial active" v-on="click: myFilter">
<span class="wkday">M</span>
</th>
Esto necesita alternar, es decir, cada vez que se hace clic, necesita agregar/eliminar la clase.
Cómo se hace esto en SDV.js?
8 answers
Podría hacer que la clase activa dependa de un valor de datos booleano:
<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
}
}
})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-16 11:55:57
Sin la necesidad de un método:
// 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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-08 16:28:12
Esta respuesta es relevante para Vue.js version 2
<th
class="initial "
v-on:click="myFilter"
v-bind:class="{ active: isActive }"
>
<span class="wkday">M</span>
</th>
El resto de la respuesta de Douglas sigue siendo aplicable (configurando la nueva instancia de Vue con isActive: false
, etc.).
Documentos relevantes: https://vuejs.org/v2/guide/class-and-style.html#Object-Syntax y https://vuejs.org/v2/guide/events.html#Method-Event-Handlers
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-23 16:44:27
Además de la respuesta de NateW, si tiene guiones en el nombre de su clase css, debe envolver esa clase entre comillas (simples):
<th
class="initial "
v-on:click="myFilter"
v-bind:class="{ 'is-active' : isActive}"
>
<span class="wkday">M</span>
</th>
Ver este tema para más sobre el tema.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-04 23:35:16
Si necesita más de 1 clase
Puedes hacer esto:
<i id="icon"
v-bind:class="{ 'fa fa-star': showStar }"
v-on:click="showStar = !showStar"
>
</i>
data: {
showStar: true
}
Observe las comillas simples ' alrededor de las clases!
Gracias a las soluciones de todos los demás.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-10 11:10:12
Este ejemplo está usando Listas: Al hacer clic en algunos li se vuelve rojo
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>`
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;
}
}
});`
Css
`ul > li:hover {
cursor:pointer;
}
.active {
color:red;
font-weight:bold;
}`
Violín:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 08:52:40
Tengo una solución que le permite verificar los diferentes valores de un prop y, por lo tanto, los diferentes elementos <th>
se volverán activos/inactivos. Usando la sintaxis de vue 2.
<th
class="initial "
@click.stop.prevent="myFilter('M')"
:class="[(activeDay == 'M' ? 'active' : '')]">
<span class="wkday">M</span>
</th>
...
<th
class="initial "
@click.stop.prevent="myFilter('T')"
:class="[(activeDay == 'T' ? 'active' : '')]">
<span class="wkday">T</span>
</th>
new Vue({
el: '#my-container',
data: {
activeDay: 'M'
},
methods: {
myFilter: function(day){
this.activeDay = day;
// some code to filter users
}
}
})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 17:56:45
Si no necesita acceder al conmutador desde fuera del elemento, este código funciona sin una variable de datos:
<a @click="e => e.target.classList.toggle('active')"></a>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-19 20:54:59