Redux: Mapper l'état aux accessoires en utilisant prop?

Créé le 6 sept. 2015  ·  4Commentaires  ·  Source: reduxjs/redux

Salut,

J'utilise redux avec react-native et jusqu'à présent, c'est génial!
Dans mon application, j'ai des profils d'utilisateurs et mon état ressemble à:

{
  users: {
    "1": {id: "1", name: "Ran"},
    "2": {id: "2", name: "Dan"}
  }
}

Maintenant, j'ai un composant <Profile> qui rend un seul utilisateur

class Profile extends React.Component {
  componentDidMount() {
    const { dispatch, userId } = this.props;
    dispatch(loadUser(userId));
  }
  render() {
    console.log(this.props.user.name);
  }
}

Quand le composant monte, j'expédie l'action loadUser avec le userId passé comme accessoire.
Cela envoie une requête à l'API et ajoute la réponse de l'utilisateur à mon état users .

Maintenant, je veux que mon composant de profil reçoive l'utilisateur pour le rendre comme accessoire.
Donc, fondamentalement, je veux faire quelque chose comme:

function mapStateToProps(state) {
  return {
    user: state.users[props.userId]
  };
}
module.exports = connect(mapStateToProps)(Profile);

Évidemment, cela ne peut pas fonctionner car je n'ai pas accès aux accessoires.
Je ne peux pas utiliser un état comme selectedProfile pour filtrer car je rend plusieurs profils dans ma pile de navigation, chacun a un userId différent, si j'utilise l'état global selectedProfile, cela casse le bouton de retour.

La seule solution de contournement que j'ai trouvée est de créer un composant ProfileContainer , qui filtrera l'état par son accessoire et passera l'utilisateur unique au composant Profile .

class ProfileContainer extends React.Component {
  render() {
    let user = this.props.users[this.prop.userId];
    return <Profile user={user} />
  }
}

Est-ce que ça fait du sens? Quelqu'un d'autre rencontre ce problème?

Merci,
Ran.

question

Commentaire le plus utile

Hey,

C'est plus un problème de react-redux ... Il me manque peut-être quelque chose, mais cela me semble très simple, utilisez l'argument "ownProps" qui est passé à mapStateToProps, donc votre code ci-dessus ressemblera:

function mapStateToProps(state, ownProps) {
  return {
    user: state.users[ownProps.userId]
  };
}
module.exports = connect(mapStateToProps)(Profile);

Vous avez certainement accès aux accessoires du composant. À quoi ça ressemble? Voir https://github.com/rackt/react-redux#connectmapstatetoprops -mapdispatchtoprops-mergeprops-options pour plus de détails ou https://github.com/rackt/redux/blob/master/examples/real-world/containers/ UserPage.js pour l'exemple du monde réel ...

Tous les 4 commentaires

Hey,

C'est plus un problème de react-redux ... Il me manque peut-être quelque chose, mais cela me semble très simple, utilisez l'argument "ownProps" qui est passé à mapStateToProps, donc votre code ci-dessus ressemblera:

function mapStateToProps(state, ownProps) {
  return {
    user: state.users[ownProps.userId]
  };
}
module.exports = connect(mapStateToProps)(Profile);

Vous avez certainement accès aux accessoires du composant. À quoi ça ressemble? Voir https://github.com/rackt/react-redux#connectmapstatetoprops -mapdispatchtoprops-mergeprops-options pour plus de détails ou https://github.com/rackt/redux/blob/master/examples/real-world/containers/ UserPage.js pour l'exemple du monde réel ...

Je ne peux pas croire que j'ai raté ça! Merci @alanrubin

:pouces vers le haut:

Veuillez signaler ces problèmes dans react-redux à l'avenir.
Ce n'est pas lié à ce référentiel.

Cette page vous a été utile?
0 / 5 - 0 notes