crear una matriz de propiedades computadas del array del estado de Vuex para su uso en v-model
Tengo la siguiente configuración en Vue 3.
Una tienda vuex con un array como parte del estado:
const store = createStore({
state: {
questions: [
{ text: ‘A’, value: false },
{ text: ‘B’, value: false },
{ text: ‘C’, value: true },
],
},
mutations: {
updateQuestionValue(state, { index, value }) {
state.questions[index].value = value;
},
},
});
Y un componente que intenta renderizar una lista de casillas de verificación que deberían corresponder al array “questions” en el estado.
<div v-for="(question, index) in questions">
<label :for="'q'+index">{{question.text}}</label>
<input :id="'q'+index" v-model="questionComputeds[index]" type="checkbox">
</div>
Como puede ver, espero utilizar v-model para activar la vinculación bidireccional para cada elemento de entrada en la lista, pero como estoy usando vuex con una matriz, quiero usar la opción get/set en mis propiedades computadas y acceder al computado específico con un índice en la plantilla. Sin embargo, encuentro que esto no funciona. No arroja un error, pero tampoco funciona para vincular el valor de la casilla de verificación a la propiedad .value en mis objetos de pregunta. ¿Estoy completamente equivocado acerca de la táctica aquí? ¿Se pueden hacer matrices de “calculados”, como lo estoy haciendo con .map ()? ¿Hay alguna manera de usar v-model con esta estructura de datos?
davy.ai
Uso de v-model en Vue 3 con store Vuex y estado array
En Vue 3, se puede usar v-model para crear un enlace de doble sentido en los elementos del formulario. Sin embargo, al usar Vuex como herramienta de gestión de estado, es necesario tener cuidado de cómo se actualiza el estado de los arrays.
En el código de instalación proporcionado, el componente intenta usar v-model para vincular el valor de cada casilla de verificación a la pregunta correspondiente en el store Vuex. Para hacer esto, el componente crea una serie de propiedades calculadas en un array llamado
questionComputeds
utilizando el métodomap()
en el arraystore.state.questions
.Sin embargo, este enfoque no funciona como se espera porque las propiedades calculadas no se pueden usar para actualizar directamente elementos de arrays en Vue. Además, usar
map()
para crear un array de propiedades calculadas no es una solución ideal porque se crearán nuevas propiedades calculadas cada vez que cambie el array.En su lugar, se puede utilizar una propiedad calculada para asignar el array
store.state.questions
a un array de valores booleanos que correspondan a la propiedadvalue
de cada pregunta. Luego se puede usar un setter calculado para actualizar la propiedadvalue
de la pregunta correspondiente cuando cambie el valor de la casilla de verificación.Aquí hay una versión actualizada del componente:
En esta versión actualizada, se crea una propiedad calculada llamada
questionValues
. El métodoget()
de esta propiedad calculada asigna el arraystore.state.questions
a un array de valores booleanos que corresponden a la propiedadvalue
de cada pregunta. El métodoset()
de la propiedad calculada establece la propiedadvalue
de cada pregunta en el valor booleano correspondiente.Luego se utiliza la directiva
v-model
para vincular el valor de cada casilla de verificación al valor booleano correspondiente en el arrayquestionValues
.Con este enfoque, se puede usar v-model para crear un enlace de doble sentido con el estado de array en Vuex.
Nota: Es importante especificar un atributo
key
único en el buclev-for
para ayudar a Vue a actualizar eficientemente el DOM cuando cambia el array.