Ejemplos del código limpio de Vue
Spanish (Español) translation by Carlos (you can also view the original English article)
En la parte previa de esta serie, empezamos a trabajar con Vue y resolvimos algunas de las dudas que los principiantes podrían tener.
En este tutorial, veremos un poco más las distintas cosas que Vue puede hacer. Pero antes, hablemos de la naturaleza centrada en «views» (vistas) de Vue.js.
Views, modelos y binding
Vue (y la mayoría de los otros frameworks de JavaScript orientados a views) están creados con un enfoque casi singular en las views. Veamos lo que eso significa.
1. En última instancia, todas las views se renderizan en algún lugar. Para los desarrolladores web, ese punto es el DOM.
2. Todas las views se pueden expresar como una serie de nodos en una estructura en forma de árbol.
¿Que significa eso exactamente?
Si alguna vez has usado HTML, entonces ya conoces cómo se ve una estructura de árbol. Y resulta que la estructura de árbol funciona muy bien para representar componentes de view, que es también uno de los motivos por los que HTML es tan ampliamente aplicable a tantas posibilidades de view.
3. Hay una relación simbiótica constantemente conectada entre lo que ocurre en el código de la plantilla de view y lo que sucede en el código de la instancia de JavaScript de Vue.
Eventos, datos, propiedades computadas; todas estas cosas comparten un contexto importante en una instancia de Vue.
Ejemplos comunes donde Vue gana
Veamos dos ejemplos sencillos en los que Vue puede ayudarte a escribir un código más limpio, ¡y mejor!
1. Clasificación de listas en vivo
Ordenar una lista puede ser un proceso tedioso si no utilizas algo como Vue. Naturalmente, podrías lograr cosas similares con plugins de jQuery, pero echemos un vistazo a una lista clasificable simple.
El HTML:
1 |
<div id="app"> |
2 |
<div class="sort-orders"> |
3 |
<a v-for="sortkey in Object.keys(orderedListOptions)" v-on:click="sortOrder = sortkey" v-bind:class="{active: sortOrder == sortkey}">{{sortkey}}</a> |
4 |
</div>
|
5 |
<ul>
|
6 |
<li v-for="(item, index) in sort(sortOrder)" v-html="item" v-id="index"> |
7 |
</ul>
|
8 |
</div>
|
El código JavaScript:
1 |
let list = [ |
2 |
"Michael Gary Scott", |
3 |
"Dwight Schrute", |
4 |
"Jim Halpert", |
5 |
"Pam Beesly-Halpert", |
6 |
"Darryl Philbin", |
7 |
"Erin Hannon", |
8 |
"Andy Bernard", |
9 |
"Phyllis Lapin-Vance", |
10 |
"Stanley Hudson", |
11 |
// ...
|
12 |
]
|
13 |
|
14 |
let vm = new Vue({ |
15 |
data: { |
16 |
list: [], |
17 |
sortOrder: "Popularity", |
18 |
},
|
19 |
created: function(){ |
20 |
// simulating asynchronous loading of data
|
21 |
setTimeout(() => { |
22 |
this.list = list; |
23 |
}, 1000) |
24 |
},
|
25 |
computed: { |
26 |
orderedListOptions: function(){ |
27 |
return { |
28 |
"Popularity": () => { return this.list }, |
29 |
"A-Z": () => { return this.list.slice().sort() }, |
30 |
"Z-A": () => { return this.list.slice().sort().reverse()}, |
31 |
}
|
32 |
},
|
33 |
},
|
34 |
methods: { |
35 |
sort: function(sortOrder){ |
36 |
return this.orderedListOptions[sortOrder]() |
37 |
}
|
38 |
},
|
39 |
el: "#app" |
40 |
})
|
Con algunos estilos básicos para clarificar las cosas, esto es lo que obtenemos:
Te darás cuenta rápidamente de lo fácil que es el proceso de clasificación. Por supuesto, también podrás notar que hay algún código duplicado en la view, pero eso lo veremos un poco más adelante.
La mayor parte del código de la plantilla es el bucle sobre los
elementos en sí. La mayor parte del código JavaScript se dedica a la clasificación de los elementos de la lista. Si quisieras otro método de clasificación, puedes añadirlo fácilmente al objeto devuelto OrderListOptions.
Fíjate especialmente en la clave computed, así como en los datos que estamos registrando en el objeto data. Estamos simulando la idea de que la lista se carga desde otra fuente y que se trae de manera sincrónica, pero las fuentes de datos asíncronas también son perfectamente utilizables:
1 |
let vm = new Vue({ |
2 |
data: { |
3 |
list: [] |
4 |
},
|
5 |
created: function(){ |
6 |
// simulating asynchronous loading of data
|
7 |
setTimeout(() => { |
8 |
this.list = list; |
9 |
}, 1000) |
10 |
}
|
11 |
// etc
|
12 |
})
|
Con esta incorporación, tenemos algunas cosas más importantes que comprender. En primer lugar, la clave list en los datos sigue siendo importante a pesar de que es un array vacío. Esto le permite a Vue saber qué propiedades debe observar para los cambios. En segundo lugar, estamos utilizando una función de flecha para la simulación setTimeout de la carga de datos asincrónica. Esto nos permite usar this en el contexto principal. Probablemente utilizarás una función de flecha en el futuro para una función anónima anidada en tu código de Vue, y el acceso a this hace que tu código sea mucho más fácil de entender cuantos se actualicen los atributos de los datos.
2. Mostrar un elemento condicionalmente
Un uso común para este ejemplo es la presencia de un código de cupón o de un banner que quieres ocultar si alguien ya lo ha cerrado o lo ha utilizado con anterioridad. Una de las grandes cosas de Vue es que funciona muy bien con otras bibliotecas y herramientas. Si quieres usar cookies, almacenamiento local o cualquier otro mecanismo de persistencia a nivel de navegador, nada te impide hacerlo.
Veamos un ejemplo que utiliza localStorage para ocultar un banner una vez que ha sido descartado.
1 |
let vm = new Vue({ |
2 |
data: { |
3 |
showBanner: !localStorage.getItem("hideBanner") |
4 |
},
|
5 |
methods: { |
6 |
dismissBanner: function(){ |
7 |
this.showBanner = false; |
8 |
localStorage.setItem("hideBanner", true); |
9 |
},
|
10 |
},
|
11 |
el: "#app" |
12 |
})
|
1 |
<div id="app"> |
2 |
<div class="banner" v-if="showBanner"> |
3 |
<a class="remove" v-on:click="dismissBanner">×</a> |
4 |
<h4>Special Offer! 25% off.</h4> |
5 |
</div>
|
6 |
</div>
|
Aquí está el ejemplo en CodePen, nuevamente con algunos estilos básicos:
Nos enlazamos (binding) al evento click usando la directiva v-on de Vue. Esto nos permite escuchar el evento de clic y utilizar el objeto methods para responder a ese clic. Estamos utilizando localStorage para inicializar el atributo de datos showBanner.
Conclusión
Con estos ejemplos, puedes ver cómo Vue.js puede ayudarte a reemplazar parte de tu JavaScript, que de otra manera sería muy complejo, por un código más sostenible y separado; mucho más fácil de administrar y de entender.
En la siguiente parte de esta serie, trataremos cómo puedes crear tus propios componentes y también examinaremos algunas de las herramientas más populares para ampliar Vue y hacerlo aún más poderoso en tus aplicaciones.



