2
votes

Pourquoi redux mapStateToProps ne met pas à jour les accessoires de composant même si le magasin est mis à jour?

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)


1 commentaires

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).


4 Réponses :


-2
votes

Essayez ceci, cela devrait fonctionner

export default connect(mapStateToProps,null)(Profile)


0 commentaires

0
votes

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.


1 commentaires

Le bogue a été résolu sur expo v32, si vous êtes confronté à ce bogue, vous devriez commencer à mettre à jour expo.



0
votes

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.

 Voici l'image de changement dans Expo v32


0 commentaires

0
votes
export default connect(mapStateToProps,{getUserPublis})(Profile)

2 commentaires

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.