Как заполнить поле формы динамическими данными с помощью Vuejs

#vue.js #vuejs3 #inertiajs

#vue.js #vuejs3 #inertiajs

Вопрос:

Я новичок в Vuejs и начинаю разрабатывать приложение с использованием laravel8 Inertiajs Vue3. В настоящее время я застрял в следующей ситуации:

У меня есть цикл данных, которые заполняют список продуктов в виде карточек. На любой карточке отображается информация о продукте и кнопка для получения дополнительной информации путем заполнения модальной формы некоторыми личными данными. Чтобы избежать повторений, я создал модальный компонент, который отлично работает только для существенной детали, мне нужно добавить идентификатор продукта к данным, отправляемым формой, поэтому я добавил скрытое поле id в форму и зарегистрировал его в функции data (). Единственный способ, который я нашел для заполнения поля «id» идентификатором продукта, — это передать его в качестве реквизита моему компоненту, а затем привязать его значение к полю «id», но это значение не отправляется при отправке формы.

Мой фактический код:

 <template>
<div v-if="showing"
    class="fixed inset-0 w-full h-screen flex items-center justify-center bg-gray-100 bg-opacity-90"
    >
        <div class="p-4 lg:p-8 bg-white rounded-lg shadow-xl">
            <section class>
                <form @submit.prevent="submit">
                    <div class="mt-4">
                        <Input
                            id="id"
                            type="hidden"
                            v-model="form.id"
                            :value="promo.id"
                        />
                    </div>
                    <div class="mt-4">
                        <Label for="name" value="Name" class="hidden" />
                        <Input
                            id="name"
                            type="text"
                            class="block w-full"
                            v-model="form.name"
                            required
                            placeholder="Name"
                            autocomplete="name"
                        />
                    </div>
                    <div class="mt-4">
                        <Label for="email" value="Email" class="hidden" />
                        <Input
                            id="email"
                            type="email"
                            class="block w-full"
                            v-model="form.email"
                            required
                            placeholder="Email"
                            autocomplete="email"
                        />
                    </div>                  
                    <div class="mt-4">
                        <button
                            type="reset"
                            aria-label="close"
                            class="button-secondary mr-4"
                            @click="close"
                        >Cancelar</button>
                        <button type="submit" class="button-primary">Submit request</button>
                    </div>
                </form>
            </section>
        </div>
    </div>
</template>

<script>
import { useForm } from "@inertiajs/inertia-vue3";
import Button from "@/Components/Button.vue";
import Input from "@/Components/Input.vue";
import Label from "@/Components/Label.vue";

export default {
    components: {
        Button,
        Input,
        Label,
    },
    props: {
        promo: "",
        showing: {
            required: true,
            type: Boolean
        }
    },
    data() {
        return {
            form: this.$inertia.form({
                id: "",
                name: "",
                email: "",
            }),
        }
    },
    methods: {
        submit() {
            this.form.post(this.route("promotion.submit-request"), {
                preserveScroll: true,
                onSuccess: () => this.form.reset(),
            });
        },
        close() {
            this.$emit('close');
        }
    }
}
</script>
 

На этом этапе форма отправляется, и laravel получает массив данных со значениями полей, кроме id

#content: "{"id","name":"farid","email":"farid@email.com"}"

Я должен сказать, что если я изменю тип поля со скрытого на текстовый, он покажет идентификатор, переданный из реквизитов, поэтому я не могу понять, почему он не отправляется с массивом данных. Кроме того, если я удалю привязку данных и вручную заполню поле «id», его значение будет правильно отправлено в серверную часть с массивом данных.

Есть идеи, как это решить?

Заранее благодарю вас.

Ответ №1:

Просто для дальнейшего использования я нашел решение в документации inertiajs. https://inertiajs.com/forms

В transform() помощнике формы есть метод, который выполняет трюк при отправке формы:

 methods: {
    submit() {
        this.form
            .transform((data) => ({
                ...data,
                id: this.promo.id,
            }))
            .post(this.route("promotion.submit-request"), {
                preserveScroll: true,
                onSuccess: () => form.reset(),
            });
    },
    close() {
        this.$emit('closeModal');
    }
}
 

Таким образом promo.id , он добавляется в массив данных только в событии отправки, и все работает нормально.