web-dev-qa-db-fra.com

L'envoi de redux-thunk ne fonctionne pas

Je regarde Thunk et j'essaie de comprendre comment implémenter un appel API. Cela ne fonctionne pas, je suis donc retourné à l'essentiel. Lorsque je clique sur le bouton, il affiche 'Getting here! Dans la console, mais rien ne s'affiche lorsque je console.log(dispatch). Est-ce que j'ai râté quelque chose?

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore, applyMiddleware } from 'redux';
import { connect, Provider } from 'react-redux';
import thunk from 'redux-thunk' 
import axios from 'axis';

const store = createStore(
    reducer,
    applyMiddleware(thunk)
);

function fetchUser() {
    return axios.get('https://randomuser.me/api/');
}

function addUser() {
    console.log('Getting here');
    return (dispatch) => {
        console.log(dispatch) //not showing anything
        return fetchUser().then(function(data){
          console.log(data);
        });
    };
}

class App extends React.Component {
    addUser() {
        addUser();
    }

    render() {
        return (
           <button onClick={this.addUser.bind(this)}>+</button>
        )       
    }
}

const mapPropsToState = function(store){
    return {
        newState: store
    }
}

var ConnectApp = connect(mapPropsToState)(App);

ReactDOM.render(
    <Provider store={store}>
        <ConnectApp />
    </Provider>,
    document.getElementById('app')
)
11
user6002037

Vous ne pouvez pas appeler addUser() depuis votre composant en tant que fonction normale. Vous devez utiliser une fonction mapDispatchToProps et la transmettre à votre appel connect afin de pouvoir envoyer addUser().

const mapDispatchToProps = dispatch => ({addUser: () => dispatch(addUser())})

puis

ConnectApp = connect(mapPropsToState, mapDispatchToProps)(App);

Vous pouvez maintenant l'appeler comme accessoire.

addUser() {
        this.props.addUser();
    }
15
Rami Enbashi

Vous n'êtes pas en train d'envoyer le thunk. Vous l'appelez directement. Vous devez passer la fonction thunk interne () => {} À dispatch.

Il y a plusieurs façons de gérer cela. Puisque vous ne fournissez pas d'argument mapDispatchToProps à connect, le composant App recevra automatiquement this.props.dispatch(). Donc, dans App.addUser(), vous pouvez faire this.props.dispatch(addUser()).

Une autre façon serait de pré-lier le créateur d'action addUser. Vous pouvez le faire avec la syntaxe var ConnectApp = connect(mapPropsToState, {addUser})(App). Ensuite, lorsque vous appelez this.props.addUser(), il enverra automatiquement le résultat.

J'ai une discussion sur l'utilisation des créateurs d'action et la liaison sur http://blog.isquaredsoftware.com/2016/10/idiomatic-redux-why-use-action-creators/ , et quelques informations avec un exemple de code pour la liaison et la répartition sur https://Gist.github.com/markerikson/6c7608eee5d2421966d3df5edbb8f05c et https://Gist.github.com/markerikson/f46688603e3842af0f9720dea05b1a9e .

4
markerikson