En un formulario de aplicación vue, tengo dos entradas de texto y una entrada de archivo.
Lo que quiero que suceda: las entradas de texto deben ir a una matriz fieldHeader y la entrada del archivo debe ir a la matriz fieldsArray.
Qué sucede: tanto los campos de texto como la entrada del archivo van tanto a fieldHeader como a fieldsArray. El console.log para ambas matrices después de hacer clic en "agregar campo" es
0: {field: 0, name: 'text', desc: 'text', imgOne: File}Debería ser encabezado de campo:
0: {field: 0, name: 'text', desc: 'text'}y camposArray:
0: {imgOne: File}Pensaría que el modelo v empujaría los elementos a las matrices correctas, pero eso no es todo. La idea en la que estoy trabajando ahora es reestructurar v-for, ya que ese es el único lugar donde actualmente puedo ver el código como una mezcla de los dos conceptos de matriz.
<template> <div v-for="(field, i) in fieldsArray" :key="i" > <q-input label="Name" v-model="fieldHeader[i].name" type="text" dense /> <q-input v-model="fieldHeader[i].desc" type="textarea" /> <q-file v-model="fieldsArray[i].imgOne" @update:model-value="onSelected()" ></q-file> </div> <div @click="handleAddField">Add Field</div> </template> <script> const handleAddFields = () => { let i = fieldsArray.value.length; const item = { field: i, }; fieldHeader.value.push(item); fieldsArray.value.push(item); }; </script>Prueba como el siguiente fragmento:
const { ref } = Vue const app = Vue.createApp({ setup () { const fieldsArray = ref([]) const fieldHeader = ref([]) const handleAddField = () => { fieldHeader.value.push({name: '', desc: ''}); fieldsArray.value.push({imgOne: null}); }; const onSelected = () => { } return { fieldsArray, fieldHeader, handleAddField, onSelected } } }) app.use(Quasar) app.mount('#q-app') <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet" type="text/css"> <link href="https://cdn.jsdelivr.net/npm/quasar@2.4.12/dist/quasar.prod.css" rel="stylesheet" type="text/css"> <div id="q-app"> <div v-for="(field, i) in fieldsArray" :key="i" > <q-input label="Name" v-model="fieldHeader[i].name" type="text" dense ></q-input> <q-input v-model="fieldHeader[i].desc" type="textarea" ></q-input> <q-file v-model="fieldsArray[i].imgOne" @update:model-value="onSelected()" ></q-file> </div> <q-btn @click="handleAddField">Add Field</q-btn> <p>fieldsArray: {{fieldsArray}}</p> <p>fieldHeader: {{fieldHeader}}</p> </div> <script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script> <script src="https://cdn.jsdelivr.net/npm/quasar@2.4.12/dist/quasar.umd.prod.js"></script>