El getter de Nuxt Store no funciona, el ID proporcionado a la carga útil no es un entero + Error: [vuex] no mutar el estado de la tienda vue fuera de los manipuladores de mutación.
Estoy tratando de crear una página de detalles del producto. La página de detalles se llama _id.
Cuando se abre, el id se reemplaza por el id del producto. Al abrir la página, el estado se establece con los datos obtenidos de una API.
Después de eso, estoy tratando de usar una propiedad computada que se refiere a un getter llamado getProduct() con un id (this.$route.params.id
) en el payload.
Así es como se ve mi archivo _id.vue
:
methods: {
...mapActions("products", ["fetchProducts"]),
...mapGetters("products", ["getProduct"]),
},
async mounted() {
this.fetchProducts()
},
computed: {
product() {
return this.getProduct(this.$route.params.id)
}
}
Así es como se ve mi archivo de la tienda llamado products.js
:
import axios from "axios"
export const state = () => ({
producten: []
})
export const mutations = {
setProducts(state, data) {
state.producten = data
}
}
export const getters = {
getProduct(state, id) {
console.log(id)
return state.producten.filter(product => product.id = id)
}
}
export const actions = {
async fetchProducts({ commit }) {
await axios.get('/api/products')
.then(res => {
var data = res.data
commit('setProducts', data)
})
.catch(err => console.log(err));
}
}
Lo que funciona es crear el estado, pero cuando intento usar el getter algo sale mal.
Como puedes ver, uso console.log()
para mostrar el id proporcionado. Esto muestra lo siguiente:
También obtengo el error: Error: [vuex] no mutar el estado de la tienda vuex fuera de los manipuladores de mutación.
Lo cual no estoy haciendo hasta donde sé.
Nota: estos errores se registran tantas veces como la longitud de mi array de estado.
davy.ai
Solución para crear una página de detalle de producto usando Vue.js y la tienda Vuex
Para crear una página de detalle de producto usando Vue.js y la tienda Vuex, sigue los siguientes pasos:
_id.vue
.En
_id.vue
, importa lo siguiente desde el paquetevuex
:Esto te permitirá usar las funciones
mapActions
ymapGetters
para mapear las acciones y los getters de Vuex a métodos y propiedades computadas del componente, respectivamente.En la sección
methods
de_id.vue
, mapea la acciónfetchProducts
del móduloproducts
en la tienda Vuex usandomapActions
:Esto mapeará la acción
fetchProducts
a un métodofetchProducts
que puedes llamar desde el componente.En el método del ciclo de vida
async
mounted
de_id.vue
, llama al métodofetchProducts
para obtener los datos del producto desde la API y almacenarlos en la tienda Vuex:Esto obtendrá los datos del producto desde la API y los almacenará en la tienda Vuex cuando el componente se monte.
En la sección
computed
de_id.vue
, define una propiedad computada llamadaproduct
que hace referencia al gettergetProduct
del móduloproducts
en la tienda Vuex, pasando el parámetroid
(this.$route.params.id
) en la carga útil:Esto mapeará el getter
getProduct
a una propiedad computadaproduct
que puedes usar en la plantilla del componente para mostrar los datos del producto.En el módulo
products
de la tienda Vuex (products.js
), define un objeto de estado con un arreglo vacíoproducten
:Esto definirá una parte del estado en la que puedes almacenar los datos del producto.
Define una mutación llamada
setProducts
que actualice el estadoproducten
con los datos de la API:Esto te permitirá actualizar el estado
producten
con los datos de la API.Define un getter llamado
getProduct
que retorne un objeto de producto con elid
especificado:Esto te permitirá obtener un objeto de producto con el
id
especificado desde el estadoproducten
.Define una acción llamada
fetchProducts
que obtenga datos desde la API y realice una mutación para actualizar el estadoproducten
:Esto te permitirá obtener datos desde la API y actualizar el estado
producten
con los datos de respuesta mediante la ejecución de la mutaciónsetProducts
.Para usar la propiedad computada
product
en la plantilla del componente, puedes usar la siguiente sintaxis:Esto mostrará los datos del producto obtenidos desde la propiedad computada
product
en la plantilla del componente.¡Y eso es todo! Siguiendo estos pasos, deberías poder crear una página de detalle de producto que obtenga datos desde una API usando Vue.js y la tienda Vuex, y muestre los datos en la plantilla del componente.