Redux action не отправляется.TypeError: недопустимая попытка распространить не повторяемый экземпляр - PullRequest
0 голосов
/ 28 февраля 2019

В моем приложении я хочу добавить «тикет» в массив в объекте «событие».В действии я отправляю новый тикет в базу данных, и после этого отправляю действие в редуктор.Используя регистратор Redux, я могу получить ошибку:

enter image description here

Действие 'createTicket' таково:

// actions/tickets.js

export const TICKET_CREATE_SUCCESS = 'TICKET_CREATE_SUCCESS';

const ticketCreateSuccess = tickets => ({
  type: TICKET_CREATE_SUCCESS,
  tickets
});

export const createTicket = (eventId, data) => (dispatch, getState) => {
  const jwt = getState().currentUser.token;
  const id = getState().currentUser.userId;
  const email = getState().currentUser.email;
  const name = getState().currentUser.name;

  request
    .post(`${baseUrl}/events/${eventId}/tickets`)
    .set('Authorization', `Bearer ${jwt}`)
    .send(data)
    .then(response => {
      dispatch(ticketCreateSuccess({ ...response.body, user: { id, email, name } }));
    })
    .catch(error => error);
};

Редуктор

// reducers/events.js    

import { EVENT_FETCHED } from '../actions/events';
import { TICKET_EDIT_SUCCESS, TICKET_CREATE_SUCCESS } from '../actions/tickets';

export default (state = null, action = {}) => {
  switch (action.type) {
    case EVENT_FETCHED:
      return action.event;
    case TICKET_EDIT_SUCCESS:
      return {
        ...state,
        tickets: state.tickets.map(ticket => {
          if (ticket.id === action.ticket.id) {
            return action.ticket;
          }
          return ticket;
        })
      };
    case TICKET_CREATE_SUCCESS:
      console.log({ ...state, tickets: [...state.tickets, action.tickets] });
      return { ...state, tickets: [...state.tickets, action.tickets] };
    default:
      return state;
  }
};

Редукторы объединены в:

import { combineReducers } from 'redux';

import currentUser from './currentUser';
import events from './events';
import event from './event';
import ticket from './ticket';
import tickets from './tickets';
import numberOfTickets from './numberOfTickets';

export default combineReducers({ currentUser, events, event, ticket, tickets, numberOfTickets });

1 Ответ

0 голосов
/ 28 февраля 2019

Может быть, вы пытаетесь распространить свое состояние редуктора, когда его значение равно null:

export default (state = null, action = {}) => {
return {
  ...state, // Here
  // rest
}

Возможно, вашим состоянием по умолчанию должен быть объект, например:

const InitialState = {
  tickets: []
};

export default (state = InitialState, action) => {
  // Some code
  case TICKET_CREATE_SUCCESS:
    return {
      ...state,
      tickets: [
        ...state.tickets,
        action.tickets
      ]
    }
}
...