mapStateToProps将数据传递给props

时间:2018-05-25 09:58:37

标签: javascript reactjs api redux react-redux

我正在构建一个工作人员rota系统,我有一个mapStateToProps函数,但是props rotaData会以undefined的形式返回 这是我的行动:

import settings from '../../aws-config.js';
import Amplify, { Auth, API } from 'aws-amplify';
export const GET_STAFF_SHIFTS = 'get_staff_shifts';
export function getShifts() {
console.log('Fetching list of shifts for user...');

const request = API.get("StaffAPI", "/shifts", {
headers: {
       'Accept': 'application/json',
       'Content-Type': 'application/json',
   }
});
return {
  type : GET_STAFF_SHIFTS,
  payload : request
 }
}

这是我的减速机

import _ from "lodash"
import { GET_STAFF_SHIFTS} from '../actions';

export default function(state = {}, action) {
switch(action.type){
case GET_STAFF_SHIFTS:
    return { ...state, rotaData: action.payload.data };
 }
}

这是我的mapStateToProps函数

function mapStateToProps(state){
return{ rotaData: state.rotaData };
}
export default connect(mapStateToProps, {getShifts: getShifts}) 
(StaffRota);

但是在我的StaffRota类中,当控制台记录this.props时,rotaData返回undefined。

对此有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

API.get() 同步,而是返回Promise,因此您需要等待它完成,然后在加载完成后再发送另一个操作。您需要安装redux-thunk才能发送功能。

export const getShifts = () => dispatch => {
    const request = API.get("StaffAPI", "/shifts", {
        headers: {
               'Accept': 'application/json',
               'Content-Type': 'application/json',
        }
    })
    .then(response => 
        dispatch({type: 'SHIFTS_LOAD_SUCCESS', response})
    )
    .catch(err => 
        dispatch({type: 'SHIFTS_LOAD_FAIL'})
    )
}

然后,您可以在reducer中处理包含响应的SHIFTS_LOAD_SUCCESS。然后在mapDispatchToProps中,您可以将getShifts函数作为props提供给组件:

export default connect(mapStateToProps, dispatch => {loadAllShifts: dispatch(getShifts())})(...)

答案 1 :(得分:0)

API.get会返回Promise,因此您需要使用已解析的结果。

您还需要使用像redux-thunk这样的库来延迟调度操作,直到API结算。

const getShifts = () => dispatch =>
  API.get(...).then(response => dispatch({
    type: GET_STAFF_SHIFTS,
    payload: response,
  }))