Le magasin Redux se met à jour correctement mais les accessoires des composants de réaction ne le sont pas. J'ai vérifié l'état global de redux avec un outil de développement distant et il est mis à jour comme prévu.
Mais quand je vérifie les accessoires de composants avec react-devtools, cela ne se met pas à jour.
Si j'appelle getUserPublis () dans un composant d'ordre supérieur (index par exemple), mapStateToProps mappe correctement ces accessoires, mais lorsque je crée un nouvel élément, il n'est pas mappé (mais il est correctement mis à jour dans le magasin).
C'est comme si mapStateToProps () n'était pas appelé lors de la mise à jour de l'état du redux
const initialState = [] function publis(state = initialState, action) { switch (action.type) { case 'FIRESTORE_PUBLI_SNAPSHOT': { return [ ...state, action.payload.data ] } default: return state } } export default publis
Réducteur:
class Profile extends Component { static navigationOptions = ({navigation, screenProps}) => ({ title: 'Perfil', headerRight: <HeaderButton navigation={navigation}/>, }); componentDidMount(){ getUserPublis(this.props.userData.ownPublis) } onPressCard = (publi) => { this.props.navigation.navigate('cardDescription', { data: publi, user: props.userName }) } maybeRenderAddButton = () => { if (this.props.userData.isCommerce){ return( <FloatingButton icon="md-add" color="white" onPress={() => this.props.navigation.navigate('offerNew', { title: "Crear anuncio" })} /> ) } else { return console.log('no hay add button') } } render(){ this.maybeRenderAddButton() if (this.props.publis.length === 0) { return( <Text> Loading </Text> ) } return ( <ScrollView> { this.props.publis.map((publi, index) => { return( <CardGeneral key={index} onPressCard={() => onPressCard(publi)} data={publi} user={this.props.user.displayName} /> ) } ) } </ScrollView> ); } } function mapStateToProps(state) { return { user: state.auth.user, userData: state.firestore.userData, publis: state.publis } } export default connect(mapStateToProps)(Profile)
4 Réponses :
Essayez ceci, cela devrait fonctionner
export default connect(mapStateToProps,null)(Profile)
Ok, enfin j'ai la réponse, c'est incroyable car j'ai passé presque 5 jours avec ce bug et comme vous pouvez le voir il n'y a rien de visiblement faux dans le code.
Pour cette application, ma pile est: react-native, expo , react-navigation et redux.
Le problème, est apparemment avec expo parce que lorsque j'utilise un simulateur pour exécuter l'application en mode développement, le problème est là (mapStateToProps est appelé une seule fois lorsque le composant est monté), mais lorsque j'ai exécuté l'application sur un appareil Android, tout va bien , mais juste pour la première fois que j'ai couru ... La prochaine fois que l'application a le même problème dans le périphérique Android et le simulateur iOS. J'ai donc essayé d'exécuter l'application en `` mode de développement expo '', et comme par magie, tout se passe bien.
C'est un problème car le mode développeur est lent et je ne peux pas utiliser les outils de développement, mais il est bon de savoir quel est le vrai problème. Maintenant, je vais publier ça sur le forum expo.
PD: J'ai déjà mis à jour expo et effacé le cache de l'expo.
Le bogue a été résolu sur expo v32, si vous êtes confronté à ce bogue, vous devriez commencer à mettre à jour expo.
J'ai eu la même erreur avec expo + react-navigation + redux + firebase, j'ai passé une semaine à chercher une solution. Redux State a été mis à jour correctement, il était visible sur Dev Tools, mais il n'y a pas eu de changement dans les accessoires du composant. Les propriétés n'étaient mises à jour que lors du premier rendu du composant.
Dans mon cas, le problème a été résolu en passant du mode de l'Expo au mode de production.
export default connect(mapStateToProps,{getUserPublis})(Profile)
Pouvez-vous ajouter une brève description?
toutes les actions qui sont appelées par votre composant, vous devez également vous connecter avec votre composant react entre accolades, ou les définir dans mapDispatchToProps, qui est analogue à mapStateToProps.
Essayez d'ajouter un simple
console.log
dans la fonction mapStateToProps pour voir s'il est appelé lorsque state.publis change. Si ce n'est pas le cas, quelque chose ne va pas avec l'implémentation de redux (il manque peut-être un Fourni ou un réducteur non inclus dans rootStore).