web-dev-qa-db-ja.com

Redux-thunkディスパッチが機能しない

サンクを見て、API呼び出しを実装する方法を理解しようとしています。機能していないので、基本に戻りました。ボタンをクリックすると、コンソールに_'Getting here!_と表示されますが、console.log(dispatch)と表示されません。ここで何か不足していますか?

_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

コンポーネントからaddUser()を通常の関数として呼び出すことはできません。 addUser()をディスパッチするには、mapDispatchToProps関数を使用してconnect呼び出しに渡す必要があります。

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

その後

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

今、あなたはそれを小道具と呼ぶことができます。

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

サンクを実際にディスパッチしているわけではありません。あなたはそれを直接呼んでいます。内部の_() => {}_サンク関数をdispatchに渡す必要があります。

これを処理するにはいくつかの方法があります。 mapDispatchToPropsconnect引数を指定していないため、Appコンポーネントには自動的にthis.props.dispatch()が与えられます。したがって、App.addUser()では、this.props.dispatch(addUser())を実行できます。

別の方法は、addUserアクション作成者を事前バインドすることです。構文var ConnectApp = connect(mapPropsToState, {addUser})(App)でこれを行うことができます。次に、this.props.addUser()を呼び出すと、結果が自動的にディスパッチされます。

http://blog.isquaredsoftware.com/2016/10/idiomatic-redux-why-use-action-creators/ で、アクションクリエーターの使用とバインディングに関するいくつかの議論があります。 https://Gist.github.com/markerikson/6c7608eee5d2421966d3df5edbb8f05c および https://Gist.github.com/markerikson/f46688603e3842af0f9720dea05b1a9e でバインドおよびディスパッチするためのサンプルコードを使用します。

4
markerikson