2017-08-07 1 views
1

Meine App verfügt bereits über eine große Auswahl von Selektoren, die von den verschiedenen Containerobjekten verwendet werden. Diese eignen sich hervorragend für den Zugriff auf verschiedene Teile des Zustands und erleichtern das Refactoring des Zustands erheblich.So verwenden Sie Selektoren erneut in einem Redux-Reduzierer

Jetzt möchte ich meine Selektoren in einigen meiner Reducer-Funktionen verwenden. Das Problem ist, dass innerhalb des Reduzierers der Parameter state auf eine bestimmte Teilmenge des Status verweist, während die Auswahlfunktionen erwarten, dass sie mit dem Statusstammobjekt aufgerufen werden.

konstruiertes Beispiel:

/* Selectors */ 
const getTodos = state => state.todos; 

const getUncompletedTodos = createSelector(
    [ getTodos ], 
    todos => todos.filter(t => !t.completed) 
); 

/* Reducer */ 
const todosReducer = (state, action) => { 
    switch (action.type) { 
    case 'ADD_TODO': 
     return [ 
     ...state, 
     { 
      id: action.id, 
      text: action.text, 
      completed: false 
     } 
     ]; 
    case 'REMOVE_COMPLETED_TODOS': 
     return getUncompletedTodos(state); // <-- this won't work 
    } 
} 

Antwort

5

Sie Selektor Arbeiten aus Wurzelstatusobjekt.

zu fälschen diese könnten Sie

return getUncompletedTodos({todos: state}); 

tun, aber meiner Meinung nach eine bessere Idee Filterfunktion wieder zu verwenden wäre wollen

/* Selectors */ 
const getTodos = state => state.todos; 

const filterCompleted = todos => todos.filter(t => !t.completed) 

const getUncompletedTodos = createSelector(
    [ getTodos ], 
    filterCompleted 
); 

// inside reducer 
case 'REMOVE_COMPLETED_TODOS': 
    return filterCompleted(state); 
+0

Ja, gute Lösung – burtyish

+0

Warum würden Sie nicht die Vorteile der memoization nehmen im getUncompletedTodos-Selektor? – user2602152

+1

@ user2602152 Sie rufen Reducer auf, um den Status zu ändern. Memoization hier ist wie immer Cache fehlt. –

Verwandte Themen