2017-09-26 1 views
0

J'utilise reac-native avec react-redux et redux-thunk. Fondamentalement, j'ai un Component connecté à store qui modifie certaines informations à partir de . Bien que chaque opération semble être synchrone, je reçois des données anciennes sur la ligne suivante après modification.Comment puis-je attendre que l'affectation du magasin réducteur soit terminée?

//reducer 
import {assign as _assign} from 'lodash-es'; 
let initialState = {name: '1'}; 
export default (state = initialState, action) => { 
    switch (action.type) { 
     case 'Project renamed': 
      return _assign({}, state, {name: action.data}); 

     default: 
      return state; 
    } 
}; 

//Component 
import React, {Component} from 'react'; 
import {connect} from 'react-redux'; 
import Prompt from 'react-native-prompt'; 

class HomeScreen extends Component { 
    render() { 
     return <Prompt 
       onSubmit={() => { 
        this.props.onProjectRenamed('2'); 
        console.log(this.props.currentProject.name) //Still get '1' here!!! 
       }} 
      />; 
    } 
} 

const mapStateToProps = state => ({ 
    currentProject: state.currentProject 
}); 
const mapDispatchToProps = dispatch => ({ 
    onProjectRenamed: (data) => dispatch({ 
     type: 'Project renamed', 
     data: data 
    }) 
}); 
export default connect(mapStateToProps, mapDispatchToProps)(HomeScreen); 

Comment puis-je obtenir la nouvelle valeur this.props.currentProject.name?

Répondre

1

Vous pouvez retourner une promesse de votre action et

const mapDispatchToProps = dispatch => ({ 
    onProjectRenamed: (data) => { 
     dispatch({ 
      type: 'Project renamed', 
      data: data 
     }) 
     return Promise.resolve() 
    } 
}); 

Maintenant, vous pouvez utiliser then sur onProjectRenamed

onSubmit={() => { 
    this.props.onProjectRenamed('2').then(() => console.log(this.props.currentProject.name)) 
}} 
+0

Oh, bien sûr que je l'ai. Juste une faute de frappe dans mon message. – JustLogin

+0

@ JustLogin voir mise à jour – FuzzyTree

+1

cela fonctionne, mais comment? Tout dans votre 'onProjectRenamed' semble rester synchrone (' dispatch' d'abord, renvoyant 'resolve' alors). Pourquoi 'renvoie-t-on les déclencheurs Promise.resolve()' uniquement après que 'store' a été modifié? – JustLogin

1

Vous déclenchez une action lorsque onSubmit est invoquée. Cette action met à jour l'objet d'état, ce qui signifie que votre composant recevra de nouveaux accessoires. Si vous implémentez, ComponentWillReceiveProps ou ComponentWillUpdate méthodes de votre composant, puis essayez d'imprimer, console.log(nextprops.currentProject.name) l'intérieur, vous obtiendrez une réponse 2. Essayez simplement,

componentWillReceiveProps(nextProps) { 
    console.log(nexProps.currentProject.name) 
} 

Rappelez-vous quand la méthode render de votre composant est appelée après l'état a été mis à jour, this.props.currentProject.name aura la dernière valeur, c.-à-d. 2.

Référez-vous au composant Réagissez lifeCycle methods pour plus de détails.

+0

Substituer 'ComponentWillReceiveProps' fonctionne pour moi, mais n'y a-t-il pas un moyen de passer le rappel ou la promesse dans' this.props.onProjectRenamed'? – JustLogin

+0

Je ne pense pas. Si vous pouvez expliquer, pourquoi vous voulez un rappel, je pourrais être en mesure de proposer une solution pour cela. – ggsrivas