0

I have a form with this structure.

If I group the addressfields inside an own object in the data and schema object it doesn't works.

// works
const formData = ref({
  email: "",
  firstName: "",
  lastName: "",
  street: "",
  addressDetails: "",
    ...
});

const schema = z.object({
  email: z
    .string()
    .min(1, { message: "E-Mail is required" })
    .email("Invalid email"),
  firstName: z.string().min(1, { message: "First Name is required" }),
  lastName: z.string().min(1, { message: "Last Name is required" }),
    ...
});

// doesn't works
 const formData = ref({
  email: "",
  address: {
    firstName: "",
    lastName: "",
    ...
  }
});
const schema = z.object({
  email: z
    .string()
    .min(1, { message: "E-Mail is required" })
    .email("Invalid email"),
  address: z.object({
    firstName: z.string().min(1, { message: "First Name is required" }),
    lastName: z.string().min(1, { message: "Last Name is required" }),
    ...

  }),
});
  <UForm
    :state="formData"
    :schema="schema"
    @submit="onSubmit"
  >
    <checkoutAccount v-model="formData.email" />
    <formsAddress
      v-model:firstName="formData.address.firstName"
      v-model:lastName="formData.address.lastName"
      v-model:street="formData.address.street"
      v-model:addressDetails="formData.address.addressDetails"
      v-model:city="formData.address.city"
      v-model:postalcode="formData.address.postalcode"
      v-model:country="formData.address.country"
    />

Any ideas what I'm doing wrong?

added demo here https://stackblitz.com/edit/nuxt-ui-5rrpvr?file=app.vue,components%2FaddressForm.vue

thanks, gregor

0

1 Answer 1

0

ok the problem was not zod related, I was missing the full path in the name attribute.

//form.vue
const formData = ref({
  email: "",
  address: {
    firstName: "",
    lastName: "",
    ...
  }
});

const props = defineProps({
  name: { type: String },
});

<formsAddress
  name="address"
  v-model:firstName="formData.address.firstName"
  ...

//formsAddress.vue
<UFormGroup
  label="First Name"
  required
  :name="`${props.name}.firstName`" <<--full path
>
  <UInput size="xl" v-model="firstName" autocomplete="given-name" />
</UFormGroup>
...
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.