使用 react-select 和 react-hook-form 返回正确的值

Posted

技术标签:

【中文标题】使用 react-select 和 react-hook-form 返回正确的值【英文标题】:Returning correct value using react-select and react-hook-form 【发布时间】:2020-10-28 22:17:06 【问题描述】:

我在 AsyncSelect 周围使用 react-hook-forms Controller api,从 react-select 加载选项,因为用户从外部 API 键入。一切正常,除了返回值作为字符串 "[object Object]" 而不是对象的 fullName 属性返回。

我的组件:

           <Controller
            control=control
            name="businessCategory"
            as=
              <AsyncSelect
                className="react-select-container"
                loadOptions=v => handleAutocompleteLookup(v)
                onChange=handleCategoryInputChange
                getOptionLabel=option => option.name
                getOptionValue=option => option.fullName
              />
            
          />

我的 handleChange 函数。 SetValue 来自 react-hook-form:

  const handleCategoryInputChange = newValue => 
    return setValue('businessCategory', newValue, true);
  ;

我的任何数据都是具有以下形状的对象数组:


  fullName: "DJ service"
  id: "gcid:dj"
  name: "DJ service"
  publisher: "GMB"

如有任何线索,我们将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

通过 react-hook-form 使用自定义寄存器来解决此问题,如下所示:

https://react-hook-form.com/get-started#Registerfields

【讨论】:

【参考方案2】:

我让它像这样工作:

const options = [
    value: '', label: ''
]
import  useForm, Controller  from "react-hook-form";

import  ErrorMessage  from "@hookform/error-message";

import Select from "react-select";


const methods = useForm();


<section>
    <label>Label</label>

    <Controller
      as=Select
      name="Name"
      options=options
      isMulti
      control=methods.control
    />

    <ErrorMessage errors=methods.errors name="Name" />
</section>

【讨论】:

我可以确认这很有魅力。只是为其他人添加,将所有 Select 道具传递到控制器中。 它在控制器上抛出TypeError: props.render is not a function【参考方案3】:

按以下方式更新您的代码

在您的导入中

import  useForm, Controller  from 'react-hook-form';
import Select from 'react-select';

在你的钩子组件中

function Yourcomponent(props)

    const methods = useForm();
    const  handleSubmit  = methods;
    

    const options = [
      value: '1', label: 'Apple',
      value: '2', label: 'Ball',
      value: '3', label: 'Cat',
    ];
    
    const default_value = 1; // you can replace with your default value
    

    // other codes of the component 
    

    function submitHandler(formData)
    
    // values are available in formData

    


    return(
      <div>
        
        * other part of your component *
        <form onSubmit=handleSubmit(submitHandler) >

           * other part of your form *
            <Controller
                control=methods.control
                defaultValue=default_value
                name="field_name_product"
                render=( onChange, value, name, ref ) => (
                    <Select
                        inputRef=ref
                        classNamePrefix="addl-class"
                        options=options
                        value=options.find(c => c.value === value)
                        onChange=val => onChange(val.value)
                    />
                )
            />

           * other part of your form *
        </form>

        * other part of your component *
      </div>
    )

【讨论】:

这是一个对我有用的例子。谢谢。【参考方案4】:

对于多选(适用于 react-hook-form v7):

import Select from "react-select";
import  useForm, Controller  from "react-hook-form";

const 
  control
 = useForm();

<Controller
  control=control
  defaultValue=options.map(c => c.value)
  name="options"
  render=( field:  onChange, value, ref ) => (
    <Select
      inputRef=ref
      value=options.filter(c => value.includes(c.value))
      onChange=val => onChange(val.map(c => c.value))
      options=options
      isMulti
    />
  )
/>

【讨论】:

【参考方案5】:
import Select from "react-select";
import  useForm, Controller  from "react-hook-form";
const options = [
      value: '1', label: 'Apple',
      value: '2', label: 'Ball',
      value: '3', label: 'Cat',
    ];
const control = useForm();
<Controller
 control=control
 name="AnyName"
 render=( field:  onChange, value, name, ref  ) => (
        <Select
        inputRef=ref
        classNamePrefix="addl-class"
        options=options
        value=options.find((c) => c.value === value)
        onChange=(val) => onChange(val.map((c) =>c.value))
        isMulti
        />
        )
/>

【讨论】:

以上是关于使用 react-select 和 react-hook-form 返回正确的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-select 和 react-hook-form 返回正确的值

使用 redux-form 和 react-select.creatable 为啥模糊事件会清除输入?

react-select:如何解决“警告:道具`id`不匹配”

使用 css 类名和 react-virtualized 或 react-select

使用带有formik的react-select时无法读取未定义的属性“类型”

使用 cypress 选择 react-select 下拉列表选项