Valider les champs des objets dans le formulaire - Vue 3 + Vee-validate + oui
P粉486138196
P粉486138196 2023-11-16 13:56:09
0
1
754

J'ai un formulaire où certains champs sont à l'intérieur d'objets :

<script setup lang="ts">
    ...
    const schema: yup.SchemaOf<any> =
    yup.object({
      group: yup.string().nullable().required(),
      description: yup.string().nullable().required(),
      user: yup
        .object({
          first_name: yup.string().required(),
          last_name: yup.string().required(),
        })
        .required(),
    })
    const { errors, handleSubmit, isSubmitting } = useForm({
      validationSchema: schema,
      initialValues: {
        group: '',
        description: '',
        user: {}
      },
    });
    const { value: group } = useField<string>('group');
    const { value: description } = useField<string>('description');
    const { value: user } = useField<any>('user');
    const isValid = useIsFormValid();
    ...
</script>


<template>
  <div>
    <label for="group">Group:</label
    ><input id="group" v-model="group" type="text" />
  </div>
  <div>
    <label for="description">Description:</label
    ><input id="description" v-model="description" type="text" />
  </div>
  <div>
    <label for="first-name">First name</label
    ><input id="first-name" v-model="user.first_name" type="text" />
  </div>
  <div>
    <label for="last-name">Last name</label
    ><input id="last-name" v-model="user.last_name" type="text" />
  </div>
  <button :disabled="!isValid">Save</button>
...
</template>

Mais la validation des données de cet objet n'est considérée comme valide que lorsque ses champs externes sont modifiés, c'est-à-dire remplis. group, description, first_name, last_name (按相同顺序),并且表单不会仅当您再次编辑 groupdescription

Comment valider lorsque je change moi-même un champ ?

Voici le lien vers le code complet.

J'utilise la version suivante :

"vue":"^3.2.37",
"vee-validate": "^4.5.11",
"yup": "^0.32.11"


P粉486138196
P粉486138196

répondre à tous(1)
P粉191610580

Lorsque vous utilisez useField() avec un objet, les propriétés imbriquées perdront leurs connexions réactives. Voici donc deux options pour résoudre ce problème : enveloppez useField avec reactive() ou utilisez useField() distinct pour chaque propriété imbriquée.

Option 1

const { value: user } =reactive(useField('user'));

Option 2

const { value: first_name } = useField('user.first_name');
const { value: last_name } = useField('user.last_name');

Voici un exemple fonctionnel Ici

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal