如何在yup中分配对象验证以进行反应选择(单选)

时间:2019-02-28 10:14:30

标签: reactjs react-select formik yup

我正在尝试使用yup概念对react-select(单选)实施验证。但我收到此错误:

  

对象作为React子对象无效(找到:带有键{label,value}的对象)。如果要渲染子级集合,请改用数组。

我想知道如何在验证模式中为yup概念分配对象

<Formik
  initialValues={{
    department:"",
  }}
  onSubmit={this.submitForm}
  validationSchema={Yup.object().shape({
    department: Yup.object().shape({
      label: Yup.string().required(),
      value: Yup.string().required(),
    }),
})}>
{ props => {
  const {
    values,
    touched,
    errors,
    isSubmitting,
    handleChange,
    handleBlur,
    handleSubmit,
    selectedOption
  } = props;
  return (
    <React.Fragment>

    <InputLabel shrink htmlFor={'department'}>
    Department</InputLabel>
    <Select
          inputId="department"
          options={options}
          value={values.department}
          onChange={this.onChangeOption}
          onBlur={handleBlur}         
       />
{errors.department && touched.department && ( {errors.department} )} 
Submit </div> </React.Fragment> ); }} 

2 个答案:

答案 0 :(得分:0)

  

我想知道如何在验证模式中为yup概念分配对象

您做对了(据我所知):

validationSchema={Yup.object().shape({
  department: Yup.object().shape({
    label: Yup.string().required(),
    value: Yup.string().required(),
  })
}

React抱怨的是这一行:

{errors.department && touched.department && ( {errors.department} )} 

如果errors有一个称为department的键,而如果touched有一个名为department的键,则呈现对象errors.department。 React无法做到这一点。如果要显示错误,建议您在选择的内容之外为其添加专用的组件(例如<p>标签)。像这样:

{errors.department && touched.department && (<p>{errors.department.label}</p>)}

您可以为value做类似的事情。

PS:您的代码似乎不完整且格式不正确(例如,浮动<div />标记)。

答案 1 :(得分:0)

您可以使用nullable()required()完善形状方案。

示例

const requiredOption = Yup.object()
  .shape({
    value: Yup.string(),
    label: Yup.string(),
  })
  .nullable()
  .required('This field is required.');

为什么nullable()required()变成形状!

  1. 如果输入集中,并且用户决定跳过输入,则该输入的值仍设置为null并触发验证。最终,您将遇到这样的错误。

输入必须为object类型,但最终值为:null。如果 “ null”旨在用作空值,请确保将架构标记为 .nullable()

  1. 如果您确定形状模式的各个属性不是必需的,则可以确定所有属性都是必需的,而可以直接在对象形状上调用所需的函数。