我如何验证 yup 中对象内的对象?

ver*_*thS 13 reactjs yup formik

我正在使用 formik 和 yup 来处理我的表单,我需要验证 formik 在初始值中设置的两个对象:

\n\n
initialValues: {\n  company: { company_name: \'\', cnpj: \'\', fantasy_name: \'\', state_registration: \'\' },\n  user: { email: \'\', password: \'\' }\n},\nvalidationSchema: schema,\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的验证模式:

\n\n
  const schema = Yup.object().shape({\n    company_name: Yup.string().required(\'Informe o nome da filial!\'),\n    cnpj: Yup.string().required(\'Informe o cnpj!\'),\n    email: Yup.string().email(\'Email n\xc3\xa3o possui formato v\xc3\xa1lido\').required(\'Informe o e-mail\'),\n    password: Yup.string().required(\'Informe a senha\')\n  })\n
Run Code Online (Sandbox Code Playgroud)\n\n

我如何才能再增加一个级别(用户/公司)?\n我尝试了类似的操作:

\n\n
company.company_name: Yup.string().required(\'Informe o nome da filial!\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到:

\n\n
\n

解析错误:意外的标记,预期为“,”

\n
\n\n

我怎样才能做到这一点?

\n\n

我也尝试过:

\n\n
  const schema = Yup.object().shape({\n    company: Yup.object().shape({\n      company_name: Yup.string().required(\'Informe o nome da filial!\'),\n      cnpj: Yup.string().required(\'Informe o cnpj!\'),\n    }),\n    user: Yup.object().shape({\n      email: Yup.string().email(\'Email n\xc3\xa3o possui formato v\xc3\xa1lido\').required(\'Informe o e-mail\'),\n      password: Yup.string().required(\'Informe a senha\')\n    })\n  })\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到:

\n\n
\n

类型错误:无法读取未定义的属性“company_name”

\n
\n\n

我的模板组件:

\n\n
<TextField\n          value={formik.values.company.company_name}\n          onChange={formik.handleChange}\n          onBlur={formik.handleBlur} \n          helperText={formik.touched.company.company_name ? formik.errors.company.company_name : ""}\n          error={formik.touched.company && Boolean(formik.errors.company)}\n          variant="outlined"\n          margin="normal"\n          required\n          fullWidth\n          id="company_name"\n          label="Raz\xc3\xa3o social"\n          name="company_name"\n        />\n
Run Code Online (Sandbox Code Playgroud)\n

lar*_*arz 13

我认为你可以继续像这样嵌套它 -

const schema = Yup.object().shape({
  company: Yup.object().shape({
    company_name: Yup.string.required(),
    // etc
  }),
  user: Yup.object().shape({
    email: Yup.string.required(),
    password: Yup.string.required(),
  }),
});

Run Code Online (Sandbox Code Playgroud)

您收到该错误是因为company.company_name不是有效的密钥。如果您确实想做类似的事情,则必须使用计算密钥:

['company.company_name']: 'Company Name'