J'ai un problème avec react-select. J'utilise le formulaire redux et j'ai rendu mon composant react-select compatible avec le formulaire redux. Voici le 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}
/>
);
et voici comment je le rend:
<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>
Mais le problème est que ma liste déroulante n'a pas de valeur par défaut comme je le souhaite. Qu'est-ce que je fais mal? Des idées?
reactjs
default-value
react-select
user7334203
la source
la source
Réponses:
Je suppose que vous avez besoin de quelque chose comme ça:
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} /> );
la source
selectedValue
avait été changé envalue
. Vérifiez les documents react-select.com/propsdefaultValue
maintenant un champ dans la nouvelle version.J'ai utilisé le paramètre defaultValue, vous trouverez ci-dessous le code indiquant comment j'ai obtenu une valeur par défaut ainsi que la mise à jour de la valeur par défaut lorsqu'une option est sélectionnée dans la liste déroulante.
<Select name="form-dept-select" options={depts} defaultValue={{ label: "Select Dept", value: 0 }} onChange={e => { this.setState({ department: e.label, deptId: e.value }); }} />
la source
Si vous êtes ici pour réagir-select v2, et toujours des problèmes - la version 2 accepte maintenant seulement un objet comme
value
,defaultValue
, etc.Autrement dit, essayez d'utiliser
value={{value: 'one', label: 'One'}}
, au lieu de simplementvalue={'one'}
.la source
{value: 'one', label: 'One'}
donné ici n'est qu'un exemple. Dans votre application, ce serait une variable / prop avec une structure identique.J'avais une erreur similaire. Assurez-vous que vos options ont un attribut de valeur.
Faites ensuite correspondre initialement la valeur de l'élément selects à la valeur des options.
<select value={this.value} />
la source
En prolongeant la réponse de @ isaac-pak, si vous souhaitez transmettre la valeur par défaut à votre composant dans un accessoire, vous pouvez l'enregistrer dans l'état dans la méthode de cycle de vie componentDidMount () pour vous assurer que la valeur par défaut est sélectionnée la première fois.
Notez que j'ai mis à jour le code suivant pour le rendre plus complet et utiliser une chaîne vide comme valeur initiale par le commentaire.
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 };
la source
value
prop onselect
ne doit pas être nul. Pensez à utiliser une chaîne vide pour effacer le composant ouundefined
pour les composants non contrôlés.Warning: A component is changing a controlled input of type hidden to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa).
Je viens de faire cela moi-même et j'ai choisi de définir la valeur par défaut à la fonction INIT du réducteur.
Si vous liez votre select avec redux, mieux vaut ne pas le 'dé-lier' avec une valeur par défaut de sélection qui ne représente pas la valeur réelle, définissez plutôt la valeur lorsque vous initialisez l'objet.
la source
Si vous n'utilisez pas redux-form et que vous utilisez l'état local pour les modifications, votre composant react-select pourrait ressembler à ceci:
class MySelect extends Component { constructor() { super() } state = { selectedValue: 'default' // your default value goes here } render() { <Select ... value={this.state.selectedValue} ... /> )}
la source
Utilisez les accessoires defaultInputValue comme ceci:
<Select name="name" isClearable onChange={handleChanges} options={colourOptions} isSearchable="true" placeholder="Brand Name" defaultInputValue="defaultInputValue" />
pour plus de référence https://www.npmjs.com/package/react-select
la source
Si vos options sont comme ça
var options = [ { value: 'one', label: 'One' }, { value: 'two', label: 'Two' } ];
Votre
{props.input.value}
devrait correspondre à l'un des'value'
dans votre{props.options}
Signification,
props.input.value
devrait être soit'one'
ou'two'
la source
Pour sélectionner automatiquement la valeur de dans, sélectionnez.
<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>
Utilisez l'attribut value dans la balise select
value={this.state.contactmethod || ''}
la solution fonctionne pour moi.
la source
Changer l'état de la valeur d'option par défaut dans cette fonction de gestionnaire d'événements en 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> ) } }
la source
J'utilise fréquemment quelque chose comme ça.
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> }
la source
Vous devez effectuer une recherche approfondie si vous utilisez des groupes dans les 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; };
la source