皆さんこんばんは!
私はReact and Reduxの初心者ですので、これが完全に馬鹿げているように聞こえる場合はご容赦ください。アクションクリエーターからのリクエストをコンソールログに記録するとき、promise値は常に「未定義」であるため、これを正しく行っているかどうかはわかりません。
私の目標は、ペイロードオブジェクト内のデータから情報を取得し、コンポーネント内に表示することです。私は過去数日間これを機能させようとしていましたが、完全に迷っています。
Axios forとredux-promiseを使用して呼び出しを処理しています。
どんな助けも大歓迎です。
コンソールからの出力は次のとおりです。
Action Creator
import axios from 'axios';
export const FETCH_FLIGHT = 'FETCH_FLIGHT';
export function getAllFlights() {
const request = axios.get('http://localhost:3000/flug');
console.log(request);
return {
type: FETCH_FLIGHT,
payload: request
};
}
リデューサー
import { FETCH_FLIGHT } from '../actions/index';
export default function(state = [], action) {
switch (action.type) {
case FETCH_FLIGHT:
console.log(action)
return [ action.payload.data, ...state ]
}
return state;
}
コンポーネント
import React from 'react';
import { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { getAllFlights } from '../actions/index';
import Destinations from './Destinations';
class App extends Component {
componentWillMount(){
this.props.selectFlight();
}
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
<div>
</div>
);
}
function mapStateToProps(state) {
return {
dest: state.icelandair
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({ selectFlight: getAllFlights }, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(App);
axios
はプロミスなので、then
を使用して結果を取得する必要があります。別のファイルでapiをリクエストし、結果が戻ったときにアクションを呼び出す必要があります。
//WebAPIUtil.js
axios.get('http://localhost:3000/flug')
.then(function(result){
YourAction.getAllFlights(result)
});
アクションファイルでは次のようになります。
export function getAllFlights(request) {
console.log(request);
return {
type: FETCH_FLIGHT,
payload: request
};
}
サンクでこれを行うことができます。 https://github.com/gaearon/redux-thunk
then
でアクションをディスパッチでき、axios呼び出しから応答を取得すると状態を更新します。
export function someFunction() {
return(dispatch) => {
axios.get(URL)
.then((response) => {dispatch(YourAction(response));})
.catch((response) => {return Promise.reject(response);});
};
}
また、これを行う最良の方法はredux-axios-middlewareによるものだと思います。ストアは同様の方法で構成する必要があるため、セットアップは少し難しい場合があります。
import { createStore, applyMiddleware } from 'redux';
import axiosMiddleware from 'redux-axios-middleware';
import axios from 'axios';
import rootReducer from '../reducers';
const configureStore = () => {
return createStore(
rootReducer,
applyMiddleware(axiosMiddleware(axios))
);
}
const store = configureStore();
そして、アクション作成者は次のようになります。
import './axios' // that's your axios.js file, not the library
export const FETCH_FLIGHT = 'FETCH_FLIGHT';
export const getAllFlights = () => {
return {
type: FETCH_FLIGHT,
payload: {
request: {
method: 'post', // or get
url:'http://localhost:3000/flug'
}
}
}
}
次のようにこのタスクを処理しました。
import axios from 'axios';
export const receiveTreeData = data => ({
type: 'RECEIVE_TREE_DATA', data,
})
export const treeRequestFailed = (err) => ({
type: 'TREE_DATA_REQUEST_FAILED', err,
})
export const fetchTreeData = () => {
return dispatch => {
axios.get(config.endpoint + 'tree')
.then(res => dispatch(receiveTreeData(res.data)))
.catch(err => dispatch(treeRequestFailed(err)))
}
}
これを解決する最善の方法は、すべてのAPI要求を処理するためにreduxミドルウェア http://redux.js.org/docs/advanced/Middleware.html を追加することです。
https://github.com/svrcekmichal/redux-axios-middleware は、使用できるプラグアンドプレイミドルウェアです。