Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning correct value using react-select and react-hook-form

I'm using react-hook-forms Controller api around AsyncSelect from react-select to load options as the user types from an external API. Everything works fine except the returned value is coming back as the string "[object Object]" instead of the fullName property from the object.

My component:

           <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}
              />
            }
          />

My handleChange function. SetValue is from react-hook-form:

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

Any my data is an array of objects with the following shape:

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

Any clues on this would be appreciated, thank you!

like image 509
geeberry Avatar asked Jul 08 '20 13:07

geeberry


People also ask

How do you set the value of a select in React hook form?

In React Hook Form the Select field have a "key/value" response. Show activity on this post. You can do something like this: const Form: FC = () => { const { register, handleSubmit, control, reset, setValue } = useForm(); const [color, setColor] = useState({name:"", color_id:-1}) useEffect(() => { getData().

How do I get the selected value in React select?

To fetch the selected value from the select element, you can use the onChange event handler prop. Just like the input or textarea elements, you can use the onChange event handler to get the value from the event object. Now, make this select input element controlled by using the state to pass the value.

Do React Hooks return a value?

React hooks are not required to return anything.

Can you return a component from a hook React?

As seen in the code examples, using hooks to encapsulate shared logic is a good start, but we can keep exploring more. Inspired by the concept of “partial application”, we can try to return a component with props that have been partially bound from a custom hook.

How to manage the form data dynamically in react Hook form?

There are some easy APIs in React Hook form. We will get to know how to register, handleSubmit and reset APIs to manage the form data easily and dynamically. reset (): This method allows resetting the entire form state or a small part of the form. We will use this API to reset the form values in this React Hook form example.

What are the benefits of using React Hook form?

If you come from React background, then you must be aware of how challenging it might be to deal with forms. Thanks to React hook form package. You can efficiently manage the form state, validation, errors. Ideally, it makes all the tedious form-related work so much easy.

What is the difference between HTML5 form and react form?

In HTML5 we have form elements like input, textarea, select they maintain there own internal state in the dom but in react we maintain the form elements state inside the component so that we can have full control over the form elements. Form handling means how we handle the form data when a user changes the value or submits the form.

What is form handling in react?

Form handling means how we handle the form data when a user changes the value or submits the form. Let’s see an example of how we handle the input element data with react hooks.


2 Answers

Update your code in following way

In your import

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

In your hook component

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>
    )
}
like image 183
Malay M Avatar answered Oct 03 '22 23:10

Malay M


For multi-select (works with 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
    />
  )}
/>
like image 36
Abdessamad Avatar answered Oct 04 '22 01:10

Abdessamad