Nextjs NextUi 带有 React hook 表单的多重选择

问题描述 投票:0回答:1

我在使用 React Hook Form 实现 NextUI 的多重选择组件时遇到问题。我正在显示配置文件数据并使用数据中选定的值填充选择框。现在我收到如下打字稿错误。

键入 '{ 子项:(项目:选项)=> 元素; onChange: (...事件: 任何[]) => void; onBlur:Noop;值:配置文件组[];禁用?:布尔值|不明确的; ... 7 个以上 ...;选定的键:字符串[]; }' 不可分配给类型“Props

这是我的国家组选项

export const countryGroupOptions: Option<string>[] = [
  { value: 'US 1', label: 'US 1' },
  { value: 'US 2', label: 'US 2' },
  { value: 'US 3', label: 'US 3' },
  { value: 'Reserve', label: 'Reserve' },
]

以及一些与我的组件问题相关的代码

const ProfileDetails: React.FC<ProfileDetailProps> = ({ profileId }) => {
  const {
    register,
    handleSubmit,
    setValue,
    watch,
    reset,
    control,
    formState: { errors }
  } = useForm<Profile>({
    defaultValues: profile
  })
  const [countries, setCountries] = useState<string[]>([])

  const onGroupChanged = (groups: string[]) => {
    const profileGroups: ProfileGroup[] = []

    forEach(groups, (item: string) => {
      const [countryCode, groupName] = item.split(" ")

      profileGroups.push({
        profile_id: profile?.id,
        country_code: countryCode,
        group: groupName
      })
    })

    setValue("groups", profileGroups)
    setCountries(groups)
  }

  useEffect(() => {
    if (profile) {
      reset(profile)
      setCountries(profile.formattedGroups ?? [])
    }
  }, [profile, reset, setValue])

  return (
    <div>
      <form onSubmit={handleSubmit(onSubmit)}>
        <Controller
          name="groups"
          control={control}
          rules={{ required: "Country group is required" }}
          render={({ field }) => (
            <Select
              items={countryGroupOptions}
              label="Country"
              labelPlacement="outside"
              placeholder="Select"
              selectionMode="multiple"
              selectedKeys={countries}
              onChange={onGroupChanged}
              {...field}
            >
              {(item) => <SelectItem key={item.value}>{item.label}</SelectItem>}
            </Select>
          )}
        ></Controller>
      </form>
    </div>
  )
}

我一直在寻找如何实现这项工作的方法,但没有成功。

我试过了,但还是不行

<Controller
  name="groups"
  control={control}
  render={({ field }) => (
    <Select
      items={countryGroupOptions}
      label="Country"
      labelPlacement="outside"
      placeholder="Select"
      selectionMode="multiple"
      selectedKeys={field.value?.map((group: ProfileGroup) => `${group.country_code} ${group.group}`) ?? []}
      onSelectionChange={() => onGroupChanged(field)}
      {...field}
    >
      {(item) => (
        <SelectItem key={item.value}>
          {item.label}
        </SelectItem>
      )}
    </Select>
  )}
/>
next.js react-hook-form nextui
1个回答
0
投票

好的,这是我遇到的问题的解决方案。将在此发布此内容以帮助其他人。

所以我所做的就是传递由 Select 组件的 onChange 属性触发的事件,并在 onGroupChanged 函数上处理它。

const onGroupChanged = (event: any) => {
  const value = event.target.value.trim()
  if (!value) return

  const groups = value.split(',')
  const profileGroups: ProfileGroup[] = groups.map((item: string) => {
    const [countryCode, groupName] = item.split(' ')
    return {
      profile_id: profile?.id,
      country_code: countryCode,
      group: groupName,
    }
  })

  setValue('groups', profileGroups)
  setCountries(groups)
}


<Controller
  name="groups"
  control={control}
  rules={{ required: 'Country group is required' }}
  render={({ field: { onChange, value } }) => {
    return (
      <Select
        items={countryGroupOptions}
        label="Country"
        labelPlacement="outside"
        placeholder="Select"
        selectionMode="multiple"
        selectedKeys={countries}
        onChange={(e) => {
          onGroupChanged(e)
        }}
      >
        {(item) => (
          <SelectItem key={item.value}>
            {item.label}
          </SelectItem>
        )}
      </Select>
    )
  }}
></Controller>
© www.soinside.com 2019 - 2024. All rights reserved.