javascript - 完全获取数据后加载状态变化

标签 javascript reactjs redux react-redux redux-thunk

我有 Action 创建者从 API 获取数据,还有另一个 Action 创建者用于加载状态,并希望在数据完全获取时更改加载状态。

现在,我编写了以下代码但效果不佳,加载状态在数据完全获取之前更改为 false。

我的 ActionCreator:

export const loadingStatus = (bool) => {
    return {
        type: Constants.LOADING_STATUS,
        isLoading: bool
    };
}
const allFlashCards = (action) => {
    return{
        type: Constants.ALL_CARD,
        ...action
    }
};

export const fetchAllFlashCards = () => {
    return (dispatch) => {
        dispatch(loadingStatus(true));
        return axios.post(API.DISPLAY_ALL_CARDS)
            .then((data)=>{
                console.warn(data);
                dispatch(allFlashCards(data));
                dispatch(loadingStatus(false));
            }).catch((error)=>{
                console.warn(error)
            });
    }
};

和我的 Reducer:

const FlashCard = (state = [], action) => {
    switch (action.type) {
        case Constants.ADD_CARD:
            return {...state, data: action.data};
            break;
        case Constants.ALL_CARD:
            return {...state, data: action};
            break;
        default:
            return state;
    }
};

export const Loading = (status= false, action) => {
    switch (action.type) {
        case Constants.LOADING_STATUS:
            return action.isLoading;
            break;
        default:
            return status;
    }
}

在我的组件中:

componentDidMount() {
    this.props.fetchCards();
}

render() {
    return(
        <div>
            {this.props.loading ?
                    <Loading/> :
                    Object.keys(this.props.cards.data).map(this.renderCard)
                }
        </div>
    );
}

const mapStateToProps = (state) => ({
    cards: state.main,
    loading: state.loading
});
const mapDispatchToProps = (dispatch) => ({
    fetchCards: bindActionCreators(fetchAllFlashCards, dispatch)
});

combineReducer 是:

import { combineReducers } from 'redux';
import FlashCard , { Loading } from './FlashCard.js';
import { routerReducer } from "react-router-redux";

export default combineReducers({
    main: FlashCard,
    loading: Loading,
    routing: routerReducer
});

在我的页面中,控制台出现错误,它是: Uncaught TypeError: Cannot read property 'data' of undefined 如果将我的代码超时修复我的错误:/

我该怎么办?

最佳答案

这里你的默认状态是错误的:

const FlashCard = (state = [], action) => {
    switch (action.type) {
        case Constants.ADD_CARD:
            return {...state, data: action.data};
            break;
        case Constants.ALL_CARD:
            return {...state, data: action};
            break;
        default:
            return state;
    }
};

它应该是一个空对象 {} 而不是一个空数组 [],因为您要返回对象。

这段代码

export const fetchAllFlashCards = () => {
    return (dispatch) => {
        dispatch(loadingStatus(true));
        return axios.post(API.DISPLAY_ALL_CARDS)
            .then((data)=>{
                console.warn(data);
                dispatch(allFlashCards(data));
                dispatch(loadingStatus(false));
            }).catch((error)=>{
                console.warn(error)
            });
    }
};

看起来完全没问题。 loadingStatus(false) 不应在设置闪存卡之前调用。您的 reducer 和 action creator 是同步的(它们应该如此)。所以,那里没有什么值得注意的。

我看到您在 Constants.ADD_CARD 操作案例中使用了 action.data,但在您的代码中您没有分派(dispatch)任何具有该类型的操作。你在别的地方做吗?也许这就是错误所在?

编辑:

您正在使用 .data 的另一个地方是在您的渲染器中:this.props.cards.datastate.main 的值是多少? 你是如何创建你的 rootReducer 的?它应该是这样的:

const rootReducer = combineReducers({
  main: FlashCard,
  loading: Loading,
});

你在那里使用 main 吗?或者卡片

关于javascript - 完全获取数据后加载状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48430943/

相关文章:

javascript - 使用 redux-orm 引导多对多关系

javascript - 传入数据和导出对象的最佳方式是什么?

javascript - Div 一次出现而不是单独出现

javascript - 将图像缩小到鼠标点击位置的坐标? (jQuery)

javascript - React-Router v4.2.2 不工作(我想我在 Route 标签中做错了什么?)

javascript - Lodash 查找数组中是否存在对象属性

javascript - 如何从 phonegap 的 html5 输入字段文件对象获取路径

javascript - 为什么 AMD 的相对导入在 requirejs 中不起作用?

javascript - react 渲染数组以添加到列表中 - 简单的返回不起作用

javascript - ReactJS 当我使用 Redux 时所有组件都是类组件,这正常吗?