reactjs - کامپوننت select قابل ایجاد سفارشی react-select و خطای تایپاسکریپت در reach-hook-form


من یک کامپوننت سفارشی دارم که از react-select استفاده میکند. این از Createable Select استفاده میکند و چیزی شبیه به این به نظر میرسد:

import CreatableSelect from "react-select/creatable";
import {
  ActionMeta,
  MultiValue,
  MultiValueGenericProps,
  OptionProps,
  StylesConfig,
  components,
} from "react-select";


type UserOption = {
  value: number;
  label: string;
  logo?: string;
};


type CustomUserInputProps = {
  userOptions: UserOption[];
  onChange: (
    newValue: MultiValue<UserOption>,
    actionMeta: ActionMeta<UserOption>
  ) => void;
  onBlur: ChangeEventHandler;
  value: UserOption[];
  name: string;
}


export function CustomUserInput ({
  userOptions,
  onChange,
  onBlur,
  value,
  name,
  disabled,
  isEdited,
}: CustomUserInputProps ) {
   ...
   return (
         <CreatableSelect
          options={userOptions}
          onChange={onChange}
          placeholder={""}
          isMulti={true}
          onBlur={onBlur}
          value={value}
          name={name}
          components={{
            Option: CustomOption,
            MultiValueLabel: CustomSelectValue,
          }}
          styles={style}
      />
);};

حال وقتی که سعی میکنم از این با React Hook Form استفاده کنم، بهخصوص هنگام ویرایش یک فرم، چیزی شبیه به این دارم:

interface SelectedUser extends UserOption { isFreeText?:boolean };

type MyFormProps = { initialUsers: SelectedUser[] };

const ThisIsMyForm( {initialUsers}: MyFormProps ) => {
 const defaultValues = {
    users: initialUsers,
  };

  ...
  return ( 
    <Controller
      control={control}
      name="users"
      render={({ field: { onChange, onBlur, value, name } }) => (
      <CustomUserInput 
         userOptions={userOptions}
         onChange={onChange}
         onBlur={onBlur}
         value={value}
         name={name}
       />
     )}
 />
};

با این، من یک خطای تایپاسکریپت در onChange دارم که میگوید:

(event: ChangeEvent<Element> | { value: number; label: string; logo: string; isFreeText: boolean | undefined; }[]) => void' 
is not assignable to type 
'(newValue: MultiValue<UserOption>, actionMeta: ActionMeta<UserOption>) => void

من مطمئن نیستم چگونه نوع react-hook-form را روی onChange و react-selects onChange برای یک CreateableSelect برآورده کنم

پاسخ شماره ۱

وقتی که prop onChange را منتقل میکنید، باید آن را در یک تابع دیگر با نوع '(newValue: MultiValue, actionMeta: ActionMeta) => void' قرار دهید. در داخل آن تابع، دادهها را به فرمت react-hook-form تبدیل کرده و سپس با آن، تابع onChange را فراخوانی میکنید.

مثل این:

<Controller
  control={control}
  name="users"
  render={({ field: { onChange, onBlur, value, name } }) => (
  <CustomUserInput 
      userOptions={userOptions}
      onChange={(multiValue: MultiValue, actionMeta:ActionMeta)=>{
        // convert the data and call onChange
      }}
      onBlur={onBlur}
      value={value}
      name={name}
    />
  )}
/>