Javascript Formik嵌套初始值、表单字段名和点符号? TL:DR
在formik中,如果我有一个用点表示法写的字段名(例如Javascript Formik嵌套初始值、表单字段名和点符号? TL:DR,javascript,reactjs,typescript,formik,Javascript,Reactjs,Typescript,Formik,在formik中,如果我有一个用点表示法写的字段名(例如name=“hands.left”),它链接到initialValue中嵌套对象的属性(例如hands:{left:,right:}),那么在使用验证错误(即访问对象属性)时如何使用该字段名(errors.hands.left和errors[“hands.left”]不起作用) 由于我的Typescript扩展接口定义,我有一个带有嵌套初始值的动态Formik表单,例如: <Formik initialValues={{
name=“hands.left”
),它链接到initialValue中嵌套对象的属性(例如hands:{left:,right:}
),那么在使用验证错误(即访问对象属性)时如何使用该字段名(errors.hands.left
和errors[“hands.left”]
不起作用)
由于我的Typescript扩展接口定义,我有一个带有嵌套初始值的动态Formik表单,例如:
<Formik
initialValues={{
description: "",
specialist: "",
discharge: {
date: "",
criteria: "",
},
// ...
如果我尝试使用点符号(errors.discharge.date)访问错误,我会收到一条警告:“类型‘string’上不存在属性‘date’”
我的解决方案是将字段名从“Discharged.date”更改为“dischargeDate”:
它确实适用于错误对象,但会断开字段与初始值(Discharged>date)的连接,因此当我在字段中输入文本时,将创建一个新的单独变量“dischargeDate”,而不是更改嵌套对象值(dischargeDate)的状态:
命名字段以访问嵌套的initialValue(initialValues>discharge>date)和错误对象属性(errors.discharge.date)时,我应该怎么做?(errors.discharge.date)是重命名我的Typescript类型的唯一解决方案
interface BaseEntry {
description: string;
specialist: string;
}
interface Discharge {
date: string;
criteria: string;
}
export interface HospitalEntryType extends BaseEntry {
discharge: Discharge;
}
从'formik'导入{formickerors};
接口基条目{
描述:字符串;
专家:弦;
}
界面放电{
日期:字符串;
标准:字符串;
}
导出接口HospitalEntryType扩展BaseEntry{
出院:出院;
}
接口FormValues扩展HospitalEntryType{}
验证=(值:FormValues)=>{
let errors:formickerors={};
const requireError=“字段为必填项”;
如果(!values.discharge.date){
错误={
出院:{
日期:requiredError
}
}
}
返回错误;
}
validate={(values) => {
const requiredError = "Field is required";
const errors: { [field: string]: string } = {};
if (!values.discharge.date) {
errors.discharge.date = requiredError;
}
// ...
<Field
name="dischargeDate"
component={TextField}
/>
if (!values.discharge.date) {
errors.dischargeDate = requiredError;
}
interface BaseEntry {
description: string;
specialist: string;
}
interface Discharge {
date: string;
criteria: string;
}
export interface HospitalEntryType extends BaseEntry {
discharge: Discharge;
}
import { FormikErrors } from 'formik';
interface BaseEntry {
description: string;
specialist: string;
}
interface Discharge {
date: string;
criteria: string;
}
export interface HospitalEntryType extends BaseEntry {
discharge: Discharge;
}
interface FormValues extends HospitalEntryType {}
validate = (values: FormValues) => {
let errors: FormikErrors<FormValues> = {};
const requiredError = "Field is required";
if (!values.discharge.date) {
errors = {
discharge: {
date: requiredError
}
}
}
return errors;
}