TypeError: Невозможно прочитать свойство 'concat' из неопределенного в ReactJs - PullRequest
0 голосов
/ 05 ноября 2019

Я получаю:

TypeError: Невозможно прочитать свойство 'concat' из неопределенного

, однако, я определил массив 'orders' в моем initialState.

Кто-нибудь знает причину?

import * as actionTypes from '../actions/actionTypes.js';
import { updateObject } from '../utility.js';

const initialState = {
    orders: [],
    loading: false,
    purchased: false
};

const purchaseInit = (state, action) => {
    return updateObject(state, { purchased: false });
};

const purchaseBurgerStart = (state, action) => {
    return updateObject(state, { loading: true });
};

const purchaseBurgerSuccess = (state, action) => {
    const newOrder = updateObject(action.orderData, { id: action.orderId });
    return updateObject(state, {
        loading: false,
        purchased: true,
        orders: state.orders.concat(newOrder)
    });
};

const purchaseBurgerFail = (state, action) => {
    return updateObject(state, { loading: false });
};

const fetchOrdersStart = (state, action) => {
    return updateObject(state, { loading: true });
};

const fetchOrdersSuccess = (state, action) => {
    return updateObject(state, {
        orders: action.orders,
        loading: false
    });
};

const fetchOrdersFail = (state, action) => {
    return updateObject(state, { loading: false });
};

const reducer = (state = initialState, action) => {
    switch (action.type) {
        case actionTypes.PURCHASE_INIT: return purchaseInit(state, action);
        case actionTypes.PURCHASE_BURGER_START: return purchaseBurgerStart(state, action);
        case actionTypes.PURCHASE_BURGER_SUCCESS: return purchaseBurgerSuccess(state, action);
        case actionTypes.PURCHASE_BURGER_FAIL: return purchaseBurgerFail(state, action);          
        case actionTypes.FETCH_ORDERS_START: return fetchOrdersStart(state, action);
        case actionTypes.FETCH_ORDERS_SUCCESS: return fetchOrdersSuccess(state, action);
        case actionTypes.FETCH_ORDERS_FAIL: return fetchOrdersFail(state, action);       
        default: return { state };
    }
};

export default reducer;

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019

Пожалуйста, проверьте параметр состояния, у этого параметра нет массива состояний, вы можете использовать console.log, чтобы проверить, что этот параметр имеет.

0 голосов
/ 05 ноября 2019

Я думаю, вам не хватает назначить состояние как начальное состояние в параметре.

const purchaseBurgerSuccess = (state = initialState, action)

0 голосов
/ 05 ноября 2019

1) Эта строка ...

case actionTypes.PURCHASE_BURGER_SUCCESS: return purchaseBurgerSuccess(state, action);

... как и все остальные строки в этом операторе switch, должны возвращать новое состояние .

Так что в purchaseBurgerSucess вам нужно убедиться, что вы возвращаете новое состояние, используя состояние, которое вы передаете в качестве аргумента:

const purchaseBurgerSuccess = (state, action) => {
  const newOrder = updateObject(action.orderData, { id: action.orderId });

  // Spread out the state you pass in as an argument
  // and update those properties that have changed
  return {
    ...state,
    loading: false,
    purchased: true,
    orders: state.orders.concat(newOrder)
  };
};

Примечание: другие ваши функции попадают в эту ловушкутоже, поэтому их также необходимо обновить.

2) Ваш default кейс в вашем switch утверждении должен быть:

default: return state;
...