サンクを見て、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')
)
_
コンポーネントからaddUser()
を通常の関数として呼び出すことはできません。 addUser()
をディスパッチするには、mapDispatchToProps
関数を使用してconnect
呼び出しに渡す必要があります。
const mapDispatchToProps = dispatch => ({addUser: () => dispatch(addUser())})
その後
ConnectApp = connect(mapPropsToState, mapDispatchToProps)(App);
今、あなたはそれを小道具と呼ぶことができます。
addUser() {
this.props.addUser();
}
サンクを実際にディスパッチしているわけではありません。あなたはそれを直接呼んでいます。内部の_() => {}
_サンク関数をdispatch
に渡す必要があります。
これを処理するにはいくつかの方法があります。 mapDispatchToProps
にconnect
引数を指定していないため、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 でバインドおよびディスパッチするためのサンプルコードを使用します。