typescript 如何在Material UI TextField组件中有条件地使用props

yqyhoc1h  于 2023-05-23  发布在  TypeScript
关注(0)|答案(1)|浏览(164)

我想创建一个基于Material UI TextField和Formik的通用组件
我已经处理了剩下的 prop ,但我不知道如何使用value和onChange,
我可以通过使用两个函数来解决这个问题,但我发现必须使用onChangeDefault作为函数并手动执行setFieldValue(),而如果我不修改onChange,它可以自动完成,如果我玩onChange,它会忘记它的默认行为,即setFieldValue()。

onChange={customOnChange || onChangeDefault}

我知道这不可能,但它会像这样

<Field
   isUsingCustomOnChange && onChange={customOnChange()}
/>
<Field
   as={TextFieldStyled}
   label={inputLabel}
   name={inputName}
   // ------------------------
   onChange={
     customOnChangeMethod ? customOnChangeMethod : don't do anything as if I didn´t modify the onChange
   }
   value={
     customValue ? customValue : use default value
   }
   // ------------------------
  />
iezvtpos

iezvtpos1#

你可以这样做:

function MyFormField({
  isDisabled,
  inputLabel,
  inputName,
  hasError,
  onChange,
  customOnChange = null,
  value,
  customValue = null
  //otherProps
}) {
  return (
    <TextField
      disabled={isDisabled}
      label={inputLabel}
      name={inputName}
      error={hasError}
      //other props
      onChange={customOnChange || onChange}
      value={customValue || value}
    />
  );
}

所以customValuecustomOnChange是可选的,默认为null。只有当你把它们放在组件 prop 中时,它们才会被使用。

<MyFormField
  // these are common between all your form fields:
  value={value}
  onChange={handleChange}
  //these you can put wherever you like and will override the previous ones:
  customValue={customValue}
  customOnChange={handleCustomChange}
  //...other props
/>

编辑:

为了使valueonCahnge可选,也可以使用***默认函数参数***。

(onChange = null,
customOnChange = null,
value = null,
customValue = null,)

但是您需要小心,因为在调用组件时您可能忘记提供默认和自定义的props,并且您不会看到任何错误,但是您的代码将中断,因为这两个props都是null。

Typescript版本

具有?的类型是可选的。

function MyFormField({
  isDisabled,
  inputLabel,
  inputName,
  hasError,
  //other props
  onChange = null,
  customOnChange = null,
  value = null,
  customValue = null,
}: {
  isDisabled: boolean;
  inputLabel: string;
  inputName: string;
  hasError: boolean;
  //other props types
  //change these 'any' types based on your desired design:
  onChange?: any;
  customOnChange?: any;
  value?: any;
  customValue?: any;
}) {
  return (
    <TextField
      disabled={isDisabled}
      label={inputLabel}
      name={inputName}
      error={hasError}
      //other props
      onChange={customOnChange || onChange}
      value={customValue || value}
    />
  );
}

相关问题