2016-12-11 66 views
0

在Redux中聲明動作的常用模式是爲字符串指定常量。在Redux操作中減少混亂的方法是什麼?

const ACTION = 'ACTION'; 

但是在現實世界中,這種方法使得您的應用程序的操作部分變得臃腫。很難添加和編寫這樣的低級別的東西。我自己看到並寫了很多這種荒謬的constants.js,它只包含了與const相關的字符串。那麼,這讓我感覺到老派和COBOLish,但這是我對這種方法的唯一好處。

我相信,這對現實生活中的應用來說不是一個好的模式。

什麼是你聲明和重用操作的方式?

爲什麼Redux lib是這樣設計的?

回答

3

什麼具體不是一個好的模式?常量?字符串?

沒有任何要求的動作類型必須是字符串–這就是a convention。類型可以是符號,對象或可用於在代碼中作出決定的任何其他內容。

FSAs are explicitly intended to be human-friendly,人類善於閱讀文字。

查看Reducing Boilerplate部分,例如,actioncreatorlibraries中的任何一個。

+0

>什麼具體不是一個好的模式?常量?字符串? 不,一般寫作一些樣板文章,contsants和動作創作者。 –

+0

感謝您提供的鏈接 –

+1

也就是說,'type'字段_應該可序列化以確保時間旅行調試正常工作,並且字符串的工作效果最好,因爲它們都是可序列化和可讀的。有關更多信息,請參閱http://redux.js.org/docs/faq/Actions.html#actions-string-constants。 – markerikson

1

您可以使用redux-ducks提案來使您的動作/縮減器更加模塊化和可維護。沒有更多的constants.js文件充滿了操作類型。

https://github.com/erikras/ducks-modular-redux

至於再利用的行動,你可以使用終極版的thunk /傳奇打造的動作鏈。這種方式可以多次重複使用操作。

1

那麼我個人甚至通過聲明一個常量文件來激怒我。它膨脹了我的項目,並且捆綁包的大小不斷增加。

我會說如果你有一個減速器做不同的動作相同的工作,你應該看看higher order reducers。鏈接來自redux docs本身。

我會嘗試在下面的代碼的幫助下解釋這一點。

考慮你有常量文件中,我做

export default RECEIVE_DICT_2 = 'RECEIVE_DICT_2' 
export default RECEIVE_DICT_1 = 'RECEIVE_DICT_1' 

考慮你有減速

首先減速

const state = { 
    dict : {}, 
} 

function firstReducer(state = state,action){ 
    switch(action.type){ 

    case 'RECEIVE_DICT_1': 
     return Object.assign({},state,{ 
     dict : action.dict 
    }) 
} 

二減速

const state = { 
    dict : {}, 
} 
function secondReducer(state = state,action){ 
    switch(action.type){ 

    case 'RECEIVE_DICT_2': 
     return Object.assign({},state,{ 
     dict : action.dict 
    }) 
} 

現在,如果你看到兩個減速做完全一樣的事情,但同時調度的行動,因爲我們指定這個常量你需要指定每個鍵。

所以,你的行動會像

firstAction(dict){ 
return { 
    action:'RECEIVE_DICT_1', 
    dict 
    } 
} 

secondAction(dict){ 
return { 
    action:'RECEIVE_DICT_2', 
    dict 
    } 
} 

這顯然是太多了代碼膨脹。所以在這裏我們可以使用更高階的reducer,只需扔掉那個常量文件即可。現在

你減速會是這樣的

export default function parentReducer(code){ 
return function commons(state = state,action){ 
    switch(action.type){ 
    case `RECEIVE_DICT_${code}`: 
     return Object.assign({},state,{ 
     dict : action.dict 
     }) 
    } 
    } 
} 

我希望你得到的圖片。您可以在我上面分享的鏈接中閱讀更多關於此的內容。

+0

太棒了,您的想法與ES2015字符串模板可以在某些情況下有所幫助。 –