0
votes

Le composant principal de réagir est appelé deux fois en utilisant REDUX

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

" entrer l'image description ici


0 commentaires

3 Réponses :


1
votes

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.


1 commentaires

L'utilisation de l'état n'a rien changé



0
votes

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?


1 commentaires

Avez-vous déjà trouvé une solution à cela? J'ai le même problème.



1
votes

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


0 commentaires