→ Lección 1 para principiantes de Vue.js : instancia Vue
→ Vue.js para principiantes, lección 2: atributos de enlace
→ Lección 3 para principiantes de Vue.js: renderizado condicional
→ Lección 4 para principiantes de Vue.js: renderizado de listas
→ Vue .js para principiantes lección 5: procesamiento de eventos
→ Vue.js principiantes lección 6: clases y estilos vinculantes
→ Vue.js principiantes lección 7: propiedades calculadas
→ Vue.js principiantes lección 8: componentes
El propósito de la lección
Nuestro principal objetivo es mostrar los datos descritos por las propiedades del objeto de datos
brand
y product
, como una sola línea.
Código inicial
Aquí está el código que se encuentra en la
index.html
etiqueta con la <body>
que comenzaremos:
<div id="app">
<div class="product">
<div class="product-image">
<img :src="image" />
</div>
<div class="product-info">
<h1>{{ product }}</h1>
<p v-if="inStock">In stock</p>
<p v-else :class="{ outOfStock: !inStock }">Out of Stock</p>
<ul>
<li v-for="detail in details">{{ detail }}</li>
</ul>
<div
class="color-box"
v-for="variant in variants"
:key="variant.variantId"
:style="{ backgroundColor:variant.variantColor }"
@mouseover="updateProduct(variant.variantImage)"
></div>
<button
v-on:click="addToCart"
:disabled="!inStock"
:class="{ disabledButton: !inStock }"
>
Add to cart
</button>
<div class="cart">
<p>Cart({{ cart }})</p>
</div>
</div>
</div>
</div>
Aquí está el código
main.js
:
var app = new Vue({
el: '#app',
data: {
product: 'Socks',
brand: 'Vue Mastery',
image: './assets/vmSocks-green.jpg',
inStock: true,
details: ['80% cotton', '20% polyester', 'Gender-neutral'],
variants: [
{
variantId: 2234,
variantColor: 'green',
variantImage: './assets/vmSocks-green.jpg'
},
{
variantId: 2235,
variantColor: 'blue',
variantImage: './assets/vmSocks-blue.jpg'
}
],
cart: 0
},
methods: {
addToCart() {
this.cart += 1
},
updateProduct(variantImage) {
this.image = variantImage
}
}
})
Observe que se ha agregado una nueva propiedad nombrada al objeto de datos
brand
.
Tarea
Queremos que lo que está almacenado dentro
brand
y product
fuera se combine en una sola línea. En otras palabras, necesitamos mostrar el <h1>
texto en la etiqueta Vue Mastery Socks
, no solo Socks
. Para resolver este problema, debe preguntarse cómo puede concatenar dos valores de cadena almacenados en una instancia de Vue.
La solucion del problema
Usaremos propiedades calculadas para resolver este problema. Dado que estas propiedades no almacenan valores sino que los calculan, agreguemos una propiedad al objeto de opciones utilizado al
computed
crear una instancia de Vue y creemos una propiedad calculada llamada title
:
computed: {
title() {
return this.brand + ' ' + this.product;
}
}
Creemos que todo está organizado de manera muy simple y clara. Cuando se llama al método
title()
, realiza una concatenación de cadenas brand
y product
luego devuelve la nueva cadena resultante.
Ahora solo tenemos que mostrar
title
en la etiqueta de <h1>
nuestra página.
Ahora esta etiqueta se ve así:
<h1>{{ product }}</h1>
Y ahora lo haremos así:
<h1>{{ title }}</h1>
Echemos un vistazo a la página y verifiquemos la funcionalidad de lo que acabamos de hacer.
El título de la página ha cambiado.Como
puede ver, se muestra el título
Vue Mastery Socks
, lo que significa que hicimos todo bien.
Tomamos dos valores de los datos de la instancia de Vue y creamos un nuevo valor basado en ellos. Si el valor se
brand
actualiza alguna vez, por ejemplo, se escribe una cadena en esta propiedadVue Craftery
, entonces no es necesario realizar ningún cambio en el código de propiedad calculado. Esta propiedad seguirá devolviendo la cadena correcta, que ahora se verá asíVue Craftery Socks
. La propiedad calculadatitle
seguirá usando la propiedadbrand
, como antes, pero ahorabrand
se escribiráelnuevo valor.
Este fue un ejemplo muy simple, pero un ejemplo bastante aplicable en la práctica. Veamos ahora un uso más complejo de las propiedades calculadas.
Ejemplo más complejo
Ahora estamos actualizando la imagen que se muestra en la página usando el
updateProduct
. Pasamos a él variantImage
y luego escribimos en la propiedad image
lo que entró en el método después de pasar el mouse sobre el cuadrado de color correspondiente. El código relevante se ve así:
updateProduct(variantImage) {
this.image = variantImage;
}
Este mecanismo funciona bien, pero si necesitamos cambiar no solo la imagen, sino también algo más, según el cuadrado de color sobre el que se desplaza el mouse, esto significará la necesidad de refactorizar este código. Vayamos al grano.
Es decir, en lugar de almacenar una propiedad en los datos
image
, la reemplazaremos por una propiedad selectedVariant
. Lo inicializamos a 0.
selectedVariant: 0,
¿Por qué 0? El punto es que planeamos establecer esta propiedad en función del índice (
index
) del elemento sobre el que se encuentra el mouse. Podemos agregar un índice a la construcción v-for
:
<div
class="color-box"
v-for="(variant, index) in variants"
:key="variant.variantId"
:style="{ backgroundColor:variant.variantColor }"
@mouseover="updateProduct(variant.variantImage)"
></div>
Tenga en cuenta que donde solía estar la construcción
v-for=«variant in variants»
ahora es el código v-for=»(variant, index) in variants»
.
Ahora, en lugar de pasar
variant.variantImage
a updateProduct
, pasemos a este método index
:
@mouseover="updateProduct(index)"
Ahora entremos en el código del método
updateProduct
. Aquí es donde obtenemos el índice. Y, en lugar de escribir el nuevo valor en this.image
, escriba index
en this.selectedVariant
. Es decir, selectedVariant
caerá el valor index
correspondiente al cuadrado en el que se colocó el puntero del mouse. También, para fines de depuración, colocaremos un comando para registrar el valor en este método index
.
updateProduct(index) {
this.selectedVariant = index;
console.log(index);
}
Si ahora actualizamos la página y abrimos la consola de herramientas de desarrollador, podemos asegurarnos de que cuando pasamos el cursor sobre los cuadrados, los valores 0 y 1 están en la consola.
Comprobando la funcionalidad del mecanismo que hemos creado
Sin embargo, la imagen ya no se muestra en la página. Aparece una advertencia en la consola.
Advertencia de consola
El punto es que eliminamos la propiedad
image
y la reemplazamos con una propiedadselectedValue
, pero esta propiedad todavía se usa en nuestra aplicación. Solucionemos el problema devolviéndoloimage
a una instancia de Vue, pero esta vez como una propiedad calculada. El código correspondiente se verá así:
image() {
return this.variants[this.selectedVariant].variantImage;
}
Aquí devolvemos la propiedad
variantImage
del elemento de matriz this.variants[this.selectedVariant]
. Como índice por el cual se accede al elemento de la matriz, se usa una propiedad que es this.selectedVariant
igual a 0 o 1. Esto, respectivamente, nos da acceso al primer o segundo elemento de la matriz.
Si ahora actualiza la página, la imagen se mostrará y responderá al pasar el mouse sobre los cuadrados de colores. Pero ahora este mecanismo se implementa mediante una propiedad calculada.
Ahora que refactorizamos el código del método
updateProduct
que ahora actualiza el estado de la propiedad selectedVariant
, podemos trabajar con otros datos almacenados en objetos de la matriz variants
, como el campo variantQuantity
que ahora agregaremos a los objetos:
variants: [
{
variantId: 2234,
variantColor: 'green',
variantImage: './assets/vmSocks-green.jpg',
variantQuantity: 10
},
{
variantId: 2235,
variantColor: 'blue',
variantImage: './assets/vmSocks-blue.jpg',
variantQuantity: 0
}
],
Eliminemos la propiedad normal
inStock
y, al igual que con el trabajo con una propiedad image
, creemos una nueva propiedad calculada con el mismo nombre, cuyo valor de retorno se basará en selectedVariant
y variantQuantity
:
inStock(){
return this.variants[this.selectedVariant].variantQuantity
}
Esta propiedad es muy similar a una propiedad calculada
image
. Pero ahora tomamos del objeto correspondiente no una propiedad variantImage
, sino una propiedad variantQuantity
.
Si ahora pasa el mouse sobre un cuadrado, la cantidad de bienes correspondiente a la cual es igual a cero,
inStock
0 caerá y 0 es un valor en JavaScript que se convierte en un valor booleano false
. Debido a esto, se mostrará un mensaje en la página Out of Stock
.
Tenga en cuenta que el botón también reacciona correctamente cuando se establece
inStock
en 0 como antes .
El botón y la etiqueta dependen de la cantidad de cada producto,
¿por qué todo sigue funcionando correctamente? El punto es
inStock
que todavía se usa para vincular una clasedisableButton
a nuestro botón. La única diferencia entre la nueva versión de la aplicación y su versión anterior es que ahorainStock
es una propiedad calculada, no una propiedad regular.
Obtenga más información sobre las propiedades calculadas
Las propiedades calculadas se almacenan en caché. Es decir, los resultados del cálculo de estas propiedades se almacenan en el sistema hasta que se cambian los datos de los que dependen estos resultados. Como resultado, cuando cambie
variantQuantity
, la caché se borrará. Y la inStock
próxima vez que se acceda a ella, la propiedad devolverá un nuevo resultado, que se colocará en la caché.
Teniendo esto en cuenta, podemos decir que si se requieren cálculos intensivos en recursos para obtener un cierto valor, entonces es más ventajoso usar una propiedad calculada para realizarlos, en lugar de un método. El método deberá llamarse cada vez que se necesite el valor correspondiente.
Además, es importante recordar que no debe cambiar los datos almacenados en la instancia de Vue en su código de propiedad calculado. En este código, todo lo que necesita hacer es realizar cálculos basados en datos existentes. Estas funciones deben estar limpias y libres de efectos secundarios.
Taller
Agregue una nueva propiedad booleana al objeto de datos utilizado para crear la instancia de Vue
onSale
. Indicará si la venta está en curso. Cree una propiedad calculada sale
que se base en brand
, product
y onSale
forme una línea, se informó que ahora se realiza la venta o no. Imprima esta línea en la tarjeta de producto.
→ Aquí hay una plantilla que puede usar para resolver este problema
→ Aquí hay una solución al problema
Salir
En esta lección, aprendimos sobre propiedades calculadas. Estas son las cosas más importantes que hemos aprendido sobre ellos:
- Las propiedades calculadas calculan valores, no los almacenan.
- Las propiedades calculadas pueden utilizar los datos almacenados en la aplicación para crear nuevos datos a partir de ella.
Si está haciendo sus deberes para este curso, díganos si está haciendo exclusivamente lo que se le ofrece, ¿o va más allá?
→ Lección 1 para principiantes de Vue.js : instancia Vue
→ Vue.js para principiantes, lección 2: atributos de enlace
→ Lección 3 para principiantes de Vue.js: renderizado condicional
→ Lección 4 para principiantes de Vue.js: renderizado de listas
→ Vue .js para principiantes lección 5: procesamiento de eventos
→ Vue.js principiantes lección 6: clases y estilos vinculantes
→ Vue.js principiantes lección 7: propiedades calculadas
→ Vue.js principiantes lección 8: componentes