我正在构建一个工作人员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。
对此有任何帮助吗?
答案 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,
}))