Je suis nouveau dans React/Redux et j'ai un problème avec l'état.
TrajectContainer.jsx
class TrajectContainer extends React.Component {
constructor(props) {
super(props);
this.state = {
trajects: props.trajects,
onClick: props.onClick
};
}
componentWillReceiveProps(nextProps) {
console.log('componentWillReceiveProps', nextProps);
this.setState(nextProps);
}
render() {
// When the componentWillReceiveProps is not present, the this.state will hold the old state
console.log('rerender', this.state);
return (<div className="col-md-6">
<h2>Trajects</h2>
<button className="btn btn-primary" onClick={this.state.onClick}>Add new Traject</button>
{this.state.trajects.map(traject => <Traject traject={traject} key={traject.name}/>)}
</div>)
}
}
const mapStateToProps = function (store) {
console.log('mapToStateProps', store);
return {
trajects: store.trajects
};
};
const mapDispatchToProps = function (dispatch, ownProps) {
return {
onClick: function () {
dispatch(addTraject());
}
}
};
export default connect(mapStateToProps, mapDispatchToProps)(TrajectContainer);
Lorsqu'un reducer renvoie un nouvel état, le composant sera rendu avec les nouvelles données.
Cependant : si je supprime la fonction componentWillReceiveProps, la fonction render() conserve l'ancien état.
J'ai vérifié les données reçues dans mapStateToProps, et il s'agit du nouveau New State. Je ne comprends donc pas pourquoi j'ai besoin de la fonction componentWillReceiveProps pour que la fonction de rendu reçoive les nouvelles données.
Est-ce que je fais quelque chose de mal ?
1 votes
Vous n'avez pas besoin
state
pour gérer ces changements.trajects
appartient à la foisstate
etprops
(provenant de l'application reduxconnect
). De même, le fait de définir un état sur chaquecomponentWillReceiveProps
n'est pas une bonne pratique. Je supprimeraistrajects
de l'État et ne travaillent qu'avec des accessoires entrants. Ils seront modifiés chaque fois que nécessaire et vous aurez toujours les valeurs les plus récentes.1 votes
@HemersonCarlin C'est ce que je veux oui, mais l'état dans render() n'est pas l'état à jour transmis par mapStateToProps, c'est mon problème. Je n'obtiens le nouvel état que lorsque j'utilise .setState, c'est pourquoi j'ai posé cette question à StackOverflow !
0 votes
Essayez de supprimer l'état et utilisez
this.props.trajects
à la place.