178 votes

Comment définir une valeur par défaut dans react-select ?

J'ai un problème avec react-select. J'utilise redux form et j'ai rendu mon composant react-select compatible avec redux form. 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 l'ai rendu :

<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 de mal ? Avez-vous des idées ?

0 votes

Ceci est correct : value={props.input.value}. Quel est le problème que vous rencontrez ?

1 votes

Mon problème est que je veux que ma sélection ait une valeur par défaut lorsque je la rends pour la première fois, mais je n'y arrive pas.

1 votes

Quelle est la valeur de props.input.value lors du premier rendu ?

139voto

Ved Points 95

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

8 votes

L'intérêt de la liaison avec Redux/React est que l'interface utilisateur reflète la valeur de l'objet en temps réel. Cette approche découple cette liaison. Pensez à définir la valeur par défaut dans le reducer.

3 votes

@JosephJuhnke vérifiez d'abord la question. Il s'agit de savoir comment définir la valeur par défaut.

8 votes

selectedValue a été changé en value . Vérifiez les documents react-select.com/props

112voto

TejasPancholi Points 191

J'ai utilisé le paramètre defaultValue, ci-dessous le code qui me permet d'obtenir une valeur par défaut et de mettre à jour 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
              });
           }}
/>

24 votes

Merci, maintenant je sais que defaultValue prend l'objet au lieu d'une simple valeur.

1 votes

Pas selon les documents de React ou intelisense : reactjs.org/docs/uncontrolled-components.html#default-values

5 votes

@Alex - (et pour tous ceux qui sont ici 2 ans plus tard), cette question faisait référence à react-select, une bibliothèque de composants. Les documents que vous avez cités font référence aux éléments de sélection HTML natifs.

49voto

eedrah Points 470

Si vous êtes venu ici pour react-select v2, et que vous avez toujours des problèmes - la version 2 n'accepte maintenant qu'un objet comme value , defaultValue etc.

C'est-à-dire, essayez d'utiliser value={{value: 'one', label: 'One'}} au lieu de simplement value={'one'} .

3 votes

Incomplet. Si vous définissez cette valeur, vous ne pourrez plus la modifier.

0 votes

@Toskan - oui, c'est l'un des principes de ReactJS et de la liaison de données à sens unique, et cela affecte tous les éléments de formulaire, pas seulement cette bibliothèque. Vous devez gérer le changement vous-même en dehors de React si vous choisissez d'avoir un composant contrôlé. Cette réponse en parle et renvoie à la documentation de React : stackoverflow.com/questions/42522515/

0 votes

Ok d'accord, alors quel problème votre solution résout-elle ? c'est à dire, coder en dur une valeur ?

15voto

Drizzel Points 57

J'avais une erreur similaire. Assurez-vous que vos options ont un attribut de valeur.

<option key={index} value={item}> {item} </option>

Ensuite, la valeur de l'élément selects correspond initialement à la valeur des options.

<select 
    value={this.value} />

0 votes

Je pense que c'est la solution la meilleure/la plus élégante. Ai-je raison de penser cela ?

0 votes

La valeur ne changera pas si vous le faites, vous devez écrire la fonction onChange pour définir le changement.

4 votes

C'est pour un élément <select> HTML vanille, pas un <Select> react-select, qui est ce que la question était pour. La mise en forme peut faire toute la différence :)

2voto

Joseph Juhnke Points 116

Je viens de passer par là et j'ai choisi de définir la valeur par défaut dans la fonction INIT du réducteur.

Si vous liez votre select avec redux, il vaut mieux ne pas le "délier" avec une valeur par défaut qui ne représente pas la valeur réelle, mais plutôt définir la valeur lorsque vous initialisez l'objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X