首页 文章

reducer.state.props在嵌套动作react / redux中未定义

提问于
浏览
0

下面是我的动作和reducer文件 - 在我的组件状态中我只看到this.props.mainData - 但是其他的subdataOneData等,没有被加载到状态 - 直到reducer我看到正在调度正确的动作我还看到了子调用的数据 - 但它们没有到达我的组件 - 我有mapStatetoprops - 我在做的地方

新问题:根据更新的代码 - 当我在reducer中打印出有效负载时 - 我看到带有api数据的maindata但SubData [{},{},{}] ..?

更新代码:从'../constants/types'导入;

export function getMainData() {
  return async function getMainData(dispatch) {
    const { data } = await getMainDataAPI();
    const subData = data.map((item) => {
      const endpoint = 'build with item.name';
      return Request.get(endpoint);
    });
     console.log('subddd' + subData);  prints -> **[object Promise],[object Promise],[object Promise]**
    dispatch({
      type: GET_DATA_AND_SUBDATA,
      payload: { data, subData }
    });
  };
}

async function getMainDataAPI() {
  const endpoint = 'url';
  return Request.get(endpoint);
}

1 回答

  • 1

    问题在于您分派操作的方式 .

    您没有同时为 mainDatasubdataOneData 提供数据 .

    export function getData() {
        return async function getData(dispatch) {
            const { data } = await getDataAPI();
    
            // This will cause first re-render
            dispatch({ type: GET_DATA, payload: data }); 
    
            Object.keys(data).map((keyName, keyIndex) => {
                const endpoint = 'ENDPOINT';
                Request.get(endpoint).then((response) => {
                    // This will cause second re-render
                    dispatch({
                        type: GET_subdata + keyIndex,
                        payload: response.data });
                    }); 
    
                return keyIndex;
            });
        };
    }
    

    首先渲染你的 subdataOneData 是不可用的 .

    您甚至没有在reducer中指定默认值,因此它将是 undefined .

    你可以像这样改变你的动作

    export function getData() {
        return async function getData(dispatch) {
            const { data } = await getDataAPI();
    
            const subDataResponse =  await Promise.all( 
                Object.keys(data).map( () => {
                    const endpoint = 'ENDPOINT';
                    return Request.get(endpoint)                    
                })
            )
    
            const subData = subDataResponse.map( response => response.data )
    
            dispatch({
                type: GET_DATA_AND_SUBDATA
                payload: { data, subData }
            });
    
        };
    }
    

    并相应地更改您的减速机,以便立即设置所有数据 .

    export default function myReducer(state = {}, action) {
        switch (action.type) {
            case GET_DATA_AND_SUBDATA:
            return {
                ...state,
                mainData: action.payload.data,
                subdataOneData: action.payload.subData[0],
                subdataTwoData: action.payload.subData[1]
            };        
            default:
                return state;
        }
    }
    

    注意:在reducer中设置初始状态也是一种很好的做法 .

    const initialState = {
        mainData: // SET YOUR INITIAL DATA
        subdataOneData: // SET YOUR INITIAL DATA
        subdataTwoData: // SET YOUR INITIAL DATA
    }
    
    export default function myReducer(initialState, action) {
    

相关问题