1
votes

React - mapper sur un objet de tableau et passer à l'option prop dans react-select

J'essaie de mapper sur un tableau d'objets et d'utiliser la clé de nom pour le passer au prop d'options dans react-select . Puis-je simplement faire cela en utilisant JS standard? J'essaie d'incorporer cet exemple .

Mes données factices

<Select
  id="color"
  options={this.state.schemas}
  isMulti={false}
  value={this.state.schemas.filter(
    ({ name }) => name === this.state.name
  )}
  getOptionLabel={({ name }) => name}
  getOptionValue={({ id }) => id}
  onChange={({ value }) => this.setState({ name: value })}
  onBlur={this.handleBlur}
/>

Dans cDM , je mets à jour l'état avec la réponse et je la stocke dans schémas

  componentDidMount() {
    axios.get("/dataschemas").then(function(response) {
      console.log(response.data.data);
      this.setState({
        schemas: response.data.data
      });
      console.log(this.state.schemas);
    });
  }

Ensuite, dans mon composant de sélection, je configure les schémas sur la prop options et mappe celle-ci dans la prop values ​​

XXX

Je n'arrive pas à obtenir les bonnes valeurs dans les accessoires, pour afficher les noms des schémas de données dans la sélection déroulante de mon exemple codesandbox

Plus d'informations sur documents react-select relatifs à ce problème


6 commentaires

plus précisément, vous utilisez la fonction alors que vous devriez utiliser une flèche response =>


codesandbox.io/s/23jx8op9l0


C'est un problème, j'ai oublié de le changer pour utiliser response =>


Les documents que je lisais sur l'adaptateur simulé utilisaient ES5 au lieu d'ES6 et j'ai négligé la différence


Cela a été incorrectement marqué comme un double. Les questions "en double" mentionnées concernent un problème différent et non lié qui s'est avéré être présent dans la boîte de codes et non le problème réel sur lequel on a posé la question.


Ouais je ne sais pas comment annuler mon vote


3 Réponses :


1
votes

Le prop du composant value attend un seul objet / valeur. Cependant dans le code suivant:

this.state.schemas.find(
  ({ name }) => name === this.state.name
)

L'appel de .filter sur un tableau renvoie un autre tableau. Vous passez donc un tableau à value , pas à un seul objet. Il vous suffit d'ajouter un [0] pour dérouler le tableau:

this.state.schemas.filter(
  ({ name }) => name === this.state.name
)[0]

Ou utilisez plutôt .find :

this.state.schemas.filter(
  ({ name }) => name === this.state.name
)


1 commentaires

.find est en effet une meilleure option. Merci



-2
votes

Vous essayez d'accéder à l'état depuis la portée de la fonction de réponse. changez votre componentDidMount en ceci:

async componentDidMount() {
  const response = await axios.get("/dataschemas");
  if (response.data && response.data.data) {
    this.setState({ schemas: response.data.data });
  }
}


0 commentaires

1
votes

voici un working codesandbox

il semble que le problème soit que vous utilisiez la syntaxe de la fonction au lieu de la syntaxe de la grosse flèche et que, par conséquent, cela était lié de manière incorrecte, this.setState n'était pas défini

 entrez la description de l'image ici

plus d'informations sur la différence entre la syntaxe de la fonction et de la grosse flèche ici

Comment ça marche? J'aime penser que les fonctions de grosse flèche ne le font pas ont leur propre ou ne modifient pas le contexte de «ceci». Ils la quittent seul pour qu'il reste le même que le contexte dans lequel la fonction a été créé.

Pour le débogage de futurs problèmes comme celui-ci, je recommande de commencer par regarder les erreurs de la console javascript - le conseil initial était une erreur là-bas que this.setState n'était pas défini


2 commentaires

Cette réponse aborde un problème qui se trouvait être présent dans la boîte de dialogue, et non le problème de réaction-sélection réel sur lequel la question posait.


@GeorgeP mon interprétation de la question était que c'était le problème "Je n'arrive pas à obtenir les bonnes valeurs dans les accessoires, pour afficher les noms des schémas de données dans la liste déroulante de mon exemple de codesandbox" suite à un appel incorrect de setState, aucune valeur ne s'affichait dans la liste déroulante car this.state.schemas était [] ... basé sur console.logs il semble que c'était le problème sous-jacent sur lequel ils se posaient