Vue2 obtén el ancho del span y asigna una clase basada en ese ancho.
Tengo este li:
<li v-for="(row, index) in onceItems" :key="row.product.ID">
<span class="title" ref="title" :class="{ max: getTitleWidth(index) > 200 }">
{{row.product.post_title}}
</span>
</li>
Quiero dar la clase “max” si el elemento tiene más de 200px (detectar títulos largos)
methods: {
getTitleWidth: function(index) {
this.$nextTick(() => {
let width = this.$refs.title[index].clientWidth;
console.log(width);
return width
})
},
}
La consola log retorna el valor correcto, pero no se le da la clase. Creo que tiene algo que ver con nextTick, pero sin él obtengo un valor indefinido.
davy.ai
Solución para detectar títulos largos y agregar la clase “max” usando Vue.js
Para agregar la clase “max” al elemento span si el ancho del título es superior a 200px, podemos utilizar un método llamado
getTitleWidth
que se llamará cada vez que el bucle v-for itere a través de un elemento en la matrizonceItems
.Aquí está el código actualizado para el elemento li:
Aquí hemos agregado una vinculación de clase condicional al elemento
span
. La clase se agregará si el valor de retorno del métodogetTitleWidth
es mayor que 200.Sin embargo, la implementación actual del método
getTitleWidth
no es correcta, ya que está devolviendoundefined
. Esto se debe a que el método$nextTick
es asíncrono y no devuelve un valor de inmediato.Para resolver este problema, podemos utilizar una
Promise
para esperar a que se complete el siguiente ciclo y luego resolver la promesa con el ancho del título. Aquí está el código actualizado para el métodogetTitleWidth
:Aquí, hemos envuelto la llamada al método
$nextTick
en unaPromise
y la hemos resuelto con el ancho del título una vez que se complete el ciclo.Ahora, la vinculación de clase debería funcionar correctamente y agregar la clase “max” al elemento span si el ancho del título es superior a 200px.