2016-06-21 2 views
0

меня ниже действий и редуктора:Написать действие и редуктор эффективные и экологически чистые (реагирует Redux)

действие:

import { OPEN_NODE, CLOSE_NODE, GET_NODES } from '../constants/NodeActionTypes'; 

export function openNode(path) { 
    return { 
    type: OPEN_NODE, 
    path: path 
    }; 
} 

export function closeNode() { 
    return { 
    type: CLOSE_NODE 
    }; 
} 


export function getNodes(path) { 
    return { 
    type: GET_NODES, 
    path: path 
    }; 
} 

редуктор:

export default function opener(state = initialState, action) { 
    switch (action.type) { 
    case OPEN_NODE: 
    var { path } = action 
    var {nodes} = getFileList(path) 
    return { 
     ...state, 
     open:true, 
     nodes:nodes 
    }; 
    case CLOSE_NODE: 
    return { 
     ...state, 
     open:false 
    }; 
    case GET_NODES: 
    var { path } = action 
    var {nodes} = getFileList(path) 
    return { 
     ...state, 
     nodes:nodes 
    }; 
    default: 
    return state; 
    } 
} 

Очевидно, OPEN_NODE содержат GET_NODES (только плюс open:true), но существует много способов организовать код:

  1. pack GET_NODES редуктор к функции, позвоните по телефону OPEN_NODE и добавьте open:true.

  2. изменить openNode действие, отправить [OPEN_NODE, GET_NODES] вместе, но как написать switch(action.type) 's case?

  3. позволяют OPEN_NODE редуктор направить getNodes действие, чтобы вызвать GET_NODES редуктор

, который лучше всего? Или любой другой лучший способ?

+0

вы, по сути вопросом, как составить свой редуктор. Позвольте мне указать вам в правильном направлении: https://egghead.io/courses/getting-started-with-redux. понимание этого курса может помочь во всех четырех вопросах вашего редукта. – xiaofan2406

ответ

0

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

export default function opener(state = initialState, action) { 
    switch (action.type) { 
    case OPEN_NODE: 
    case GET_NODES: 
    var { path } = action 
    var {nodes} = getFileList(path) 
    return { 
     ...state, 
     nodes:nodes 
     open: action.type === OPEN_NODE ? true : state.open 
    }; 
    case CLOSE_NODE: 
    return { 
     ...state, 
     open:false 
    }; 
    default: 
    return state; 
    } 
} 
+0

Я не думаю, что это хороший способ. Если 'OPEN_NODE' требуется больше состояний в будущем или что-то вызывает' OPEN_NODE_2', нужно новое состояние 'open2', код будет уродливым, полным' action.type === xxx? true: xxx' – Mithril

+0

Если вы видите этот шаблон во много раз, это эффективно сильный сигнал, который вы должны реорганизовать. Но для вашего конкретного случая использования это не так уж плохо. – Pcriulan

1

Вы не должны держать все внутри вашего переключателя заявление. Если у вас есть 2 похожих действия, просто перейдите в частную функцию и вызовите ее.

В вашем случае, это может быть что-то вроде:

// your reducer helper 
const getNodes = (state) => { 
var { path } = action 
var {nodes} = getFileList(path) 
return { 
    ...state, 
    nodes:nodes 
}; 
}; 

// your reducer function 
export default function opener(state = initialState, action) { 
    switch (action.type) { 
    case OPEN_NODE: 
    return { ...getNodes(state), open:true }; 
    case GET_NODES: 
    return getNodes(state); 
    // .... 
} 
+0

Да, я думаю, что вариант 1 тоже хорош, но любая мысль о вариантах 2 и 3? Какие преимущества и недостатки? – Mithril

Смежные вопросы