J'ai un composant principal react qui distribue l'action redux sur componentDidMount
, l'action récupérera les données de l'API.
Le problème est: lorsque je démarre mon application, mon code componentDidMount > et le composant principal sont exécutés deux fois. Ainsi, il effectue 2 appels d'API pour chaque fois que l'application se charge. L'API a une limite pour le nombre total d'appels que je fais, je ne veux pas atteindre ma limite.
J'ai déjà essayé de résoudre le problème en supprimant le constructeur, en utilisant componentWillMount
le problème n'est pas résolu.
import {createStore, applyMiddleware} from 'redux'; import MapStateToProps from './components/mapStateToProps'; import rootReducer from './redux/reducers/rootReducer'; import {Provider} from 'react-redux'; import thunk from 'redux-thunk'; //const initialState = {}; const middleware = [thunk]; const store = createStore(rootReducer, applyMiddleware(...middleware)); ReactDOM.render(<Provider store={store}><MapStateToProps/></Provider>, document.getElementById("root"));
/// actions
import { combineReducers } from 'redux'; import DataReducer from './dataReducer'; export default combineReducers({ data: DataReducer });
// réducteur
let initialState = { coins: [], data_available: false, }; export default function (state = initialState, action) { switch (action.type) { case 'FETCH_DATA': return { ...state, coins: action.payload, data_available: true } default: return state; } }
//rootreducer
import axios from 'axios'; export function fetchall(sort) { return function (dispatch) { axios.get(`https://cors-anywhere.herokuapp.com/https:-----------`) .then(function (response) { dispatch({ type: 'FETCH_DATA', payload: response.data }) }) .catch(function (error) { console.log(error); }) } }
////index
import React, { Component } from 'react'; import { connect } from 'react-redux'; import * as actions from '../redux/actions/fetchActions'; import TableHeader from './tableHeader'; class Main extends Component { componentDidMount() { console.log("mounted"); // this.props.dispatch(actions.fetchall("market_cap")); } render() { console.log("rendered"); // console.log(this.props.cdata); // console.log(this.props.cdata.data.data_available); return <div className=""> <TableHeader {...this.props} /> </div> } } export default Main;
l'image de la console est postée pour la référence "rendu" est enregistrée dans le composant principal
"runned1" est enregistré dans le sous-composant principal
"monté" enregistré dans le composantDidMount
3 Réponses :
Je pense que vous pouvez contourner ce problème en fournissant une logique supplémentaire dans votre componentDidmount
. Vous devez également utiliser l ' état
de votre composant.
Ecrivez quelque chose comme ceci:
constructor(props){ super(props) this.state = { mounted: false } } componentDidMount(){ if(!this.state.mounted){ this.props.dispatchmyAction() this.setState({ mounted: true }) } }
Ceci dit essentiellement, si votre composant est déjà monté une fois, vous ne ferez pas votre demande de créateur d'action.
L'utilisation de l'état n'a rien changé
Le problème est résolu lorsque j'ai supprimé le webpack du projet. Mais quelqu'un peut-il répondre comment puis-je résoudre ce problème tout en utilisant le Webpack?
Avez-vous déjà trouvé une solution à cela? J'ai le même problème.
Si vous regardez attentivement votre console.log
, vous pouvez remarquer que votre plug-in HMR Hot Module Reloading
, remonte votre composant et c'est la raison principale derrière cela occurrence.
Ce que fait ce plugin, c'est qu'il surveille les changements de code de vos bundles et à chaque fois que vous enregistrez, il ré-rend votre composant. Il y a eu également beaucoup de discussions sur le fait que ce plugin ne fonctionne pas dans tous les cas comme prévu.
Voici quelques informations que vous pourriez envisager d'utiliser si vous souhaitez utiliser HMR.
Écriture sur HMR - https://codeburst.io/react-hot-loader-consemed-harmful- 321fe3b6ca74
Guide de l'utilisateur pour HMR - https://medium.com/@ rajaraodv / webpacks-hmr-react-hot-loader-le-manuel-manquant-232336dc0d96