2016-07-09 6 views
3

От Redux документации, я знаю, что мы никогда не должны мутировать состояние, поэтому мы должны использовать методы concat и slice, поэтому я получил следующий редуктор (большинство действий удалено для упрощения):Slice vs filter in redux удалить действие

export default function blocks(state = [], action) { 
    switch (action.type) { 
     case DELETE_BLOCK: 
      var index = state.findIndex(e => e.id === action.blockId); 
      return [...state.slice(0, index), ...state.slice(index + 1)]; 
     default: 
      return state; 
} 

в моем случае я не имею индекс элемента Я хочу удалить, поэтому я могу использовать filter? Как это:

export default function blocks(state = [], action) { 
    switch (action.type) { 
     case DELETE_BLOCK: 
      return state.filter(e => e.id !== action.blockId); 
     default: 
      return state; 
} 

ответ

6

filter не мутировать состояние, она возвращает новый Array так что нет ничего плохого здесь.

Мы стараемся избегать filter, когда имеем дело с данными immutable, так как он всегда возвращает новую ссылку, нарушая контрольную проверку равенства ===. Но если вы не используете эту ссылку, пытаясь вернуть предыдущую государственную ссылку, если вы считаете, что состояние не изменилось (и я думаю, что вы этого не делаете, все в порядке), вам не нужно беспокоиться об использовании filter.

0

Поскольку редуктор является нормальной функцией JavaScript, для него очень легко написать тесты. Вы просто дадите ему stateBefore и action и проверьте, возвращает ли он ожидаемый stateAfter. Вы можете называть что-то вроде deep-freeze на вашем stateBefore, тогда ваш тест не удастся, если вы случайно изменили состояние. Видеокарта Getting Started with Redux показывает эту технику.