Last active
June 8, 2020 14:59
-
-
Save leocristofani/98312e61807db8f32e720c9f97a186e5 to your computer and use it in GitHub Desktop.
How to integrate React Select with Redux Form
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React, { PropTypes } from 'react'; | |
import Select from 'react-select'; | |
import 'react-select/dist/react-select.css'; | |
RFReactSelect.defaultProps = { | |
multi: false, | |
className: "" | |
}; | |
RFReactSelect.propTypes = { | |
input: PropTypes.shape({ | |
name: PropTypes.string.isRequired, | |
value: PropTypes.string.isRequired, | |
onBlur: PropTypes.func.isRequired, | |
onChange: PropTypes.func.isRequired, | |
onFocus: PropTypes.func.isRequired, | |
}).isRequired, | |
options: PropTypes.array.isRequired, | |
multi: PropTypes.bool, | |
className: PropTypes.string | |
}; | |
export default function RFReactSelect({ input , options, multi, className }) { | |
const { name, value, onBlur, onChange, onFocus } = input; | |
const transformedValue = transformValue(value, options, multi); | |
return ( | |
<Select | |
valueKey="value" | |
name={name} | |
value={transformedValue} | |
multi={multi} | |
options={options} | |
onChange={multi | |
? multiChangeHandler(onChange) | |
: singleChangeHandler(onChange) | |
} | |
onBlur={() => onBlur(value)} | |
onFocus={onFocus} | |
className={className} | |
/> | |
); | |
} | |
/** | |
* onChange from Redux Form Field has to be called explicity. | |
*/ | |
function singleChangeHandler(func) { | |
return function handleSingleChange(value) { | |
func(value ? value.value : ''); | |
}; | |
} | |
/** | |
* onBlur from Redux Form Field has to be called explicity. | |
*/ | |
function multiChangeHandler(func) { | |
return function handleMultiHandler(values) { | |
func(values.map(value => value.value)); | |
}; | |
} | |
/** | |
* For single select, Redux Form keeps the value as a string, while React Select | |
* wants the value in the form { value: "grape", label: "Grape" } | |
* | |
* * For multi select, Redux Form keeps the value as array of strings, while React Select | |
* wants the array of values in the form [{ value: "grape", label: "Grape" }] | |
*/ | |
function transformValue(value, options, multi) { | |
if (multi && typeof value === 'string') return []; | |
const filteredOptions = options.filter(option => { | |
return multi | |
? value.indexOf(option.value) !== -1 | |
: option.value === value; | |
}); | |
return multi ? filteredOptions : filteredOptions[0]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@gurmeetsinghmalhotra thanks for your comment, but I no longer maintain this gist since I moved away from using Redux and Redux Form long ago. Best of luck!