Je suis nouveau sur Redux et j'essaie d'utiliser Redux dans mon application React.
Voici mes réducteurs.
Le réducteur roor -
const mapStateToProps=(state)=>{
console.log(state);
return state;
}
export default connect(mapStateToProps,{dataLoaded})(Main)
et réducteur de dataList-
componentDidMount()
{
FetchService(this.state.url)
.then((res)=> res.json())
.then( (result)=>this.updateState(result)
).catch(function(error){console.log(error)});
}
updateState(result)
{
this.props.dataLoaded(result);
}
Voici la classe de créateur d'action -
export const dataLoaded=(data)=>{
return {
type:'full_data',
payload:{gridData:data}
}
}
Maintenant du composant ci-dessous, je suis faire un appel Fetch au réseau et lorsque l'appel revient, je veux mettre à jour l'état de l'application avec les dernières données -
const INITITAL_STATE={gridData:[]}
const dataListReducer=(state=INITITAL_STATE,action)=>{
switch(action.type){
default: return {...state}
}
return state;
}
export default dataListReducer;
Le composant effectue un appel pour se connecter comme prescrit -
import {combineReducers} from 'redux';
import dataListReducer from './dataList';
export default combineReducers({
dataListReducer
})
Pourquoi console.log n'imprime-t-il pas les dernières données?
Que me manque-t-il ici?
Veuillez laisser je sais si je peux clarifier davantage.
3 Réponses :
Cher ami, vous n'avez rien défini dans votre réducteur pour traiter les actions qui lui sont envoyées.
Pour ce faire, vous devez configurer certains cas dans votre réducteur comme ceci:
const dataListReducer=(state=INITITAL_STATE,action)=>{
switch(action.type){
case "full_data":
return {...state, myData}
default:
return state
}
J'ai un défaut dans le commutateur qui copie l'état dans un nouvel objet et le renvoie. Cela aurait dû fonctionner correctement?
Cela fonctionne, mais il définit le même état que précédemment - pas de mise à jour. Vous devez à la place définir la date de la charge utile dans l'état, afin que vous puissiez voir la mise à jour réelle de l'interface utilisateur.
Ce que vous avez fait dans votre réducteur est de renvoyer le même état qu'il a déjà. C'est donc un réducteur de vide - comme ne rien faire. Ce que vous devez faire est au retour du réducteur, de prendre en compte ce qui est passé dans la charge utile de l'action.
case "full_data":
return {... état, action.payload}
ou je suggérerais même de spécifier explicitement la propriété, de sorte que d'autres extensions soient possibles et ne remplaceront aucun frère
case "full_data":
return {... état, ... gridData: action.payload.gridData}
logique. Mais pourquoi cette ligne affiche une erreur (Erreur d'analyse: jeton inattendu, attendu ",") return {... state, action.payload}
Dans l'exemple, j'utilise l'opérateur spread , qui est une fonctionnalité d'ES6. Vous pouvez utiliser Object.assign à la place si vous utilisez une ancienne version de JS.
Cela devrait fonctionner pour vous.
const INITITAL_STATE={gridData:[]}
const dataListReducer=(state=INITITAL_STATE,action)=>{
switch(action.type){
case: 'full_data':
return { ...state, gridData: action.payload.gridData }
default: return {...state}
}
}
export default dataListReducer;