'How to set a default value in react-select
I have an issue using react-select. I use redux form and I've made my react-select component compatible with redux form. Here is the code:
const MySelect = props => (
<Select
{...props}
value={props.input.value}
onChange={value => props.input.onChange(value)}
onBlur={() => props.input.onBlur(props.input.value)}
options={props.options}
placeholder={props.placeholder}
selectedValue={props.selectedValue}
/>
);
and here how I render it:
<div className="select-box__container">
<Field
id="side"
name="side"
component={SelectInput}
options={sideOptions}
clearable={false}
placeholder="Select Side"
selectedValue={label: 'Any', value: 'Any'}
/>
</div>
But the problem is that that my dropdown has not a default value as I wish. What I'm doing wrong? Any ideas?
Solution 1:[1]
I guess you need something like this:
const MySelect = props => (
<Select
{...props}
value = {
props.options.filter(option =>
option.label === 'Some label')
}
onChange = {value => props.input.onChange(value)}
onBlur={() => props.input.onBlur(props.input.value)}
options={props.options}
placeholder={props.placeholder}
/>
);
Solution 2:[2]
I used the defaultValue parameter, below is the code how I achieved a default value as well as update the default value when an option is selected from the drop-down.
<Select
name="form-dept-select"
options={depts}
defaultValue={{ label: "Select Dept", value: 0 }}
onChange={e => {
this.setState({
department: e.label,
deptId: e.value
});
}}
/>
Solution 3:[3]
If you've come here for react-select v2, and still having trouble - version 2 now only accepts an object as value
, defaultValue
, etc.
That is, try using value={{value: 'one', label: 'One'}}
, instead of just value={'one'}
.
Solution 4:[4]
I was having a similar error. Make sure your options have a value attribute.
<option key={index} value={item}> {item} </option>
Then match the selects element value initially to the options value.
<select
value={this.value} />
Solution 5:[5]
Extending on @isaac-pak's answer, if you want to pass the default value to your component in a prop, you can save it in state in the componentDidMount() lifecycle method to ensure the default is selected the first time.
Note, I've updated the following code to make it more complete and to use an empty string as the initial value per the comment.
export default class MySelect extends Component {
constructor(props) {
super(props);
this.state = {
selectedValue: '',
};
this.handleChange = this.handleChange.bind(this);
this.options = [
{value: 'foo', label: 'Foo'},
{value: 'bar', label: 'Bar'},
{value: 'baz', label: 'Baz'}
];
}
componentDidMount() {
this.setState({
selectedValue: this.props.defaultValue,
})
}
handleChange(selectedOption) {
this.setState({selectedValue: selectedOption.target.value});
}
render() {
return (
<Select
value={this.options.filter(({value}) => value === this.state.selectedValue)}
onChange={this.handleChange}
options={this.options}
/>
)
}
}
MySelect.propTypes = {
defaultValue: PropTypes.string.isRequired
};
Solution 6:[6]
Use defaultInputValue props like so:
<Select
name="name"
isClearable
onChange={handleChanges}
options={colourOptions}
isSearchable="true"
placeholder="Brand Name"
defaultInputValue="defaultInputValue"
/>
for more reference https://www.npmjs.com/package/react-select
Solution 7:[7]
As I followed all the answers above, it came to my mind, I should write this.
you have to set the prop value, not the DefaultValue. I spent hours by using this, read the documentation, they mentioned to use the DefaultValue, but it is not working. correct way would be,
options=[{label:'mylabel1',value:1},{label:'mylabel2',value:2}]
seleted_option={label:'mylabel1',value:1}
<Select
options={options}
value={selected_option}/>
Solution 8:[8]
pass value
object :
<Select
isClearable={false}
options={[
{
label: 'Financials - Google',
options: [
{ value: 'revenue1', label: 'Revenue' },
{ value: 'sales1', label: 'Sales' },
{ value: 'return1', label: 'Return' },
],
},
{
label: 'Financials - Apple',
options: [
{ value: 'revenue2', label: 'Revenue' },
{ value: 'sales2', label: 'Sales' },
{ value: 'return2', label: 'Return' },
],
},
{
label: 'Financials - Microsoft',
options: [
{ value: 'revenue3', label: 'Revenue' },
{ value: 'sales3', label: 'Sales' },
{ value: 'return3', label: 'Return' },
],
},
]}
className="react-select w-50"
classNamePrefix="select"
value={{ value: 'revenue1', label: 'Revenue' }}
isSearchable={false}
placeholder="Select A Matric"
onChange={onDropdownChange}
/>
Solution 9:[9]
I just went through this myself and chose to set the default value at the reducer INIT function.
If you bind your select with redux then best not 'de-bind' it with a select default value that doesn't represent the actual value, instead set the value when you initialize the object.
Solution 10:[10]
You need to do deep search if you use groups in options:
options={[
{ value: 'all', label: 'All' },
{
label: 'Specific',
options: [
{ value: 'one', label: 'One' },
{ value: 'two', label: 'Two' },
{ value: 'three', label: 'Three' },
],
},
]}
const deepSearch = (options, value, tempObj = {}) => {
if (options && value != null) {
options.find((node) => {
if (node.value === value) {
tempObj.found = node;
return node;
}
return deepSearch(node.options, value, tempObj);
});
if (tempObj.found) {
return tempObj.found;
}
}
return undefined;
};
Solution 11:[11]
If you are not using redux-form and you are using local state for changes then your react-select component might look like this:
class MySelect extends Component {
constructor() {
super()
}
state = {
selectedValue: 'default' // your default value goes here
}
render() {
<Select
...
value={this.state.selectedValue}
...
/>
)}
Solution 12:[12]
I'm using frequently something like this.
Default value from props in this example
if(Defaultvalue ===item.value) {
return <option key={item.key} defaultValue value={item.value}>{plantel.value} </option>
} else {
return <option key={item.key} value={item.value}>{plantel.value} </option>
}
Solution 13:[13]
Use
<select value={stateValue}>
. Make sure that the value in stateValue
is among the options given in the select field.
Solution 14:[14]
couple of points:
defaultValue works for initial render, it will not be updated on sequential render passes. Make sure you are rendering your Select after you have defaultValue in hand.
defaultValue should be defined in form of Object or Array of Objects like this:
{value:'1', label:'Guest'}
, most bulletproof way is to set it as item of options list:myOptionsList[selectedIndex]
Solution 15:[15]
If your options are like this
var options = [
{ value: 'one', label: 'One' },
{ value: 'two', label: 'Two' }
];
Your {props.input.value}
should match one of the 'value'
in your {props.options}
Meaning, props.input.value
should be either 'one'
or 'two'
Solution 16:[16]
To auto-select the value of in select.
<div className="form-group">
<label htmlFor="contactmethod">Contact Method</label>
<select id="contactmethod" className="form-control" value={this.state.contactmethod || ''} onChange={this.handleChange} name="contactmethod">
<option value='Email'>URL</option>
<option value='Phone'>Phone</option>
<option value="SMS">SMS</option>
</select>
</div>
Use the value attribute in the select tag
value={this.state.contactmethod || ''}
the solution is working for me.
Solution 17:[17]
- Create a state property for the default option text in the constructor
- Don't worry about the default option value
- Add an option tag to the render function. Only show using state and ternary expression
- Create a function to handle when an option was selected
Change the state of the default option value in this event handler function to null
Class MySelect extends React.Component { constructor() { super() this.handleChange = this.handleChange.bind(this); this.state = { selectDefault: "Select An Option" } } handleChange(event) { const selectedValue = event.target.value; //do something with selectedValue this.setState({ selectDefault: null }); } render() { return ( <select name="selectInput" id="selectInput" onChange={this.handleChange} value= {this.selectedValue}> {this.state.selectDefault ? <option>{this.state.selectDefault}</option> : ''} {'map list or static list of options here'} </select> ) } }
Solution 18:[18]
Use defaultValue
instead of selected
If you want to hide the value from the menu, use hidden
:
<option defaultValue hidden>
{'--'}
</option>
{options.map(opt => (
<option key={opt} value={opt.replaceAll(/[,'!?\s]/gi, '')}>
{opt}
</option>
))}
Solution 19:[19]
Wanted to add my two cents to this, using Hooks,
You can subscribe to props in the DropDown
import React, { useEffect, useState } from 'react';
import Select from 'react-select';
const DropDown = (props) => {
const { options, isMulti, handleChange , defaultValue } = props;
const [ defaultValueFromProps, setdefaultValueFromProps ] = useState(undefined)
useEffect(() => {
if (defaultValue) {
setdefaultValueFromProps(defaultValue)
}
}, [props])
const maybeRenderDefaultValue = () => {
if (defaultValue) {
return { label: defaultValueFromProps, value: defaultValueFromProps }
}
}
return (
<div>
<Select
width='200px'
menuColor='red'
isMulti={isMulti}
options={options}
value={maybeRenderDefaultValue()}
clearIndicator
onChange={(e) => handleChange(e)}
/>
</div>
)
}
export default DropDown;
and then in the parent component either pass the initial value or changed value from state
<DropDown options={GenreOptions} required={true} defaultValue={recipeGenre === undefined ? recipe.genre : recipeGenre} handleChange={handleGenreChange}/>
Then if it's a fresh form (no default value) you won't have to worry since the useEffect will ignore setting anything
Solution 20:[20]
2022 example with Redux react with useSelector
As of 2022 there is a defaultValue option in react-select. Please note that if you are using getOptionLabel, and getOptionValue, you need to make your default value match those option params you set....
for example
const responder = useSelector((state) => state.responder)
<Select
name="keyword"
required={true}
className="mb-3"
styles={customStyles}
components={animatedComponents}
closeMenuOnSelect={true}
options={keywords}
defaultValue={responder ? responder[0]?.responder?.keyword?.map((el) => { return {title: el.title, _id: el._id}}): ""}
getOptionLabel={({title}) => title}
getOptionValue={({_id}) => _id}
onChange={(_id) => setUpload({...upload, keyword: _id})}
isMulti
placeholder="select Keywords"
isSearchable={true}
errors={errors}
innerRef={register({
required: "Add your Keyword"
})}
/>
rather than setting your defaultValue with {label: "this", value: "that}
I needed to set mine with defaultValue({title:"this", _id: "that"})
Solution 21:[21]
In react-select if you want to define for the custom label, try this.
<Select
getOptionLabel={({ name }) => name}
/>
Solution 22:[22]
You can simply do this as:
In react-select, initial options value
const optionsAB = [
{ value: '1', label: 'Football' },
{ value: '2', label: 'Cricket' },
{ value: '3', label: 'Tenis' }
];
API giving only:
apiData = [
{ games: '1', name: 'Football', City: 'Kolkata' },
{ games: '2', name: 'Cricket', City: 'Delhi' },
{ games: '3', name: 'Tenis', City: 'Sikkim' }
];
In react-select, for defaultValue=[{value: 1, label: Hi}]
. Use defaultValue
like this example:
<Select
isSearchable
isClearable
placeholder="GAMES"
options={optionsAB}
defaultValue={{
value: apiData[0]?.games ,
label: (optionsAB || []).filter(x => (x.value.includes(apiData[0]?.games)))[0]?.label
}}
onChange={(newValue, name) => handleChange(newValue, 'games')}
/>
You can use this in Java normal also.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow