无法使用 Formik 和 Yup 验证 react-select
Can't validate react-select using Formik with Yup
我正在尝试使用甲酸和是的反应。在这个项目中,selection 按钮是使用 React Select 在单独的组件中创建的。 select 标签的属性作为道具发送。当我在selection标签中select一个选项时,出现这个错误。
×
错误:对象作为 React 子项无效(找到:具有键 {id} 的对象)。如果您打算渲染一组子项,请改用数组。
是的验证方法
country: Yup.object({id: Yup.string().required('Please select a country'),}),
初始数据:
const formik = useFormik({
initialValues: {
country: {}
}
})
这是选项
const countryOptions = [
{ id:"1", value: "india", label: "India" },
{ id:"2", value: "sri lanka", label: "Sri Lanka" },
{ id:"3", value: "us", label: "US" },
];
使用select离子
<XSearchSelect
label="Country"
options={countryOptions}
id="country"
name="country"
onBlur={()=>{
formik.handleBlur({ target: {name:'country'} });
}}
onChange={(option) => {formik.setFieldValue("country",option.id);}}
error={formik.errors.country}
touched={formik.touched.country}
/>
定制select离子组分
import React from 'react'
import Select from 'react-select'
const XSearchSelect = ({ value, onChange, options, label,error,onBlur,id,name,touched }) => {
return (
<div>
<div className="block text-xaplink_gray_3 text-sm font-bold mb-2">{label}</div>
<Select
isClearable="true"
value={value}
options={options}
onChange={onChange}
id={id}
name={name}
onBlur={onBlur}
theme={theme => ({
...theme,
borderRadius: 5,
colors: {
...theme.colors,
primary25: 'silver',
primary50: 'gray',
primary: 'black',
},
})
}
/>
{touched && error ? (
<p className='text-xs pl-2 text-xaplink_red_2 mb-4'>{error}</p>
) : null}
</div>
)
}
导出默认 XSearchSelect
您遇到的问题是您尝试在此处呈现 error
:
<p className='text-xs pl-2 text-xaplink_red_2 mb-4'>{error}</p>
但它是一个对象,正如您在初始值中所描述的那样。您可能想将 error={formik.errors.country.id}
传递给 <XSearchSelect />
组件。
或者,作为另一种选择,您可以将国家/地区 ID 作为字符串存储在 Formik 中,如下所示:
const formik = useFormik({
initialValues: {
country: ""
}
})
这样您之前的代码应该可以进行一些更新,坚持您现在将 ID 存储为字符串而不是对象这一事实。
我正在尝试使用甲酸和是的反应。在这个项目中,selection 按钮是使用 React Select 在单独的组件中创建的。 select 标签的属性作为道具发送。当我在selection标签中select一个选项时,出现这个错误。
× 错误:对象作为 React 子项无效(找到:具有键 {id} 的对象)。如果您打算渲染一组子项,请改用数组。
是的验证方法
country: Yup.object({id: Yup.string().required('Please select a country'),}),
初始数据:
const formik = useFormik({
initialValues: {
country: {}
}
})
这是选项
const countryOptions = [
{ id:"1", value: "india", label: "India" },
{ id:"2", value: "sri lanka", label: "Sri Lanka" },
{ id:"3", value: "us", label: "US" },
];
使用select离子
<XSearchSelect
label="Country"
options={countryOptions}
id="country"
name="country"
onBlur={()=>{
formik.handleBlur({ target: {name:'country'} });
}}
onChange={(option) => {formik.setFieldValue("country",option.id);}}
error={formik.errors.country}
touched={formik.touched.country}
/>
定制select离子组分
import React from 'react'
import Select from 'react-select'
const XSearchSelect = ({ value, onChange, options, label,error,onBlur,id,name,touched }) => {
return (
<div>
<div className="block text-xaplink_gray_3 text-sm font-bold mb-2">{label}</div>
<Select
isClearable="true"
value={value}
options={options}
onChange={onChange}
id={id}
name={name}
onBlur={onBlur}
theme={theme => ({
...theme,
borderRadius: 5,
colors: {
...theme.colors,
primary25: 'silver',
primary50: 'gray',
primary: 'black',
},
})
}
/>
{touched && error ? (
<p className='text-xs pl-2 text-xaplink_red_2 mb-4'>{error}</p>
) : null}
</div>
)
}
导出默认 XSearchSelect
您遇到的问题是您尝试在此处呈现 error
:
<p className='text-xs pl-2 text-xaplink_red_2 mb-4'>{error}</p>
但它是一个对象,正如您在初始值中所描述的那样。您可能想将 error={formik.errors.country.id}
传递给 <XSearchSelect />
组件。
或者,作为另一种选择,您可以将国家/地区 ID 作为字符串存储在 Formik 中,如下所示:
const formik = useFormik({
initialValues: {
country: ""
}
})
这样您之前的代码应该可以进行一些更新,坚持您现在将 ID 存储为字符串而不是对象这一事实。