[英]Why return default case instead of throw in Redux's reducer?
我已經閱讀了很多Redux教程,所有教程都返回默認大小寫,而不是拋出異常,它們編寫如下內容:
const counter = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
};
既然我們已經知道必須為開發人員分配不存在的操作類型,為什么不拋出錯誤呢? 像這樣:
const counter = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
throw new Error(`Unknow action type: ${action.type}`)
}
};
為什么不扔?
在Redux的情況下,您可能有多個reducers,您可以使用combineReducers
組合在一起以形成一個商店。 當您分派一個動作時,它會分派給所有的reducer,而只會分派給預期的那一個。 因此,在默認情況下,您將返回當前狀態。
並且,當將動作分派給所有的reducer時,只有那些必須處理該動作的人會監聽它並更新狀態。 這可能會導致某個動作被分派,但沒有任何減速器進行處理,但是肯定不會引起問題,除非您忘記編寫此代碼,否則絕對不會發生。
但是,如果使用單個reducer而不將它們組合在一起(在useReducer
鈎子中經常發生這種情況),如果沒有調度匹配的動作,則可能引發錯誤。
創建減速器時,目的不是要取回錯誤來代替我們的新狀態,而是要在沒有新狀態可用時返回現有狀態。
const hiringProcess = (oldListOfCandidates, action) => {
if (action.type === 'CREATE_CANDIDATE') {
// we care about this action
return [...oldListOfCandidates, action.payload];
}
// we don't care about this action
}
因此,使用ES2015語法,我獲取了一個oldListOfCandidates
數組,並將它們添加到全新的數組中,然后添加了一個新的action.payload
記錄。
無論如何,您的問題不是關於鍵插值語法,而是為什么要return state;
而不是拋出錯誤。
為了簡化器的目的以及整個redux體系結構應該為我們做的事情,我們不關心返回錯誤,我們要返回的是現有數據或state
如果沒有新數據,那就是這些減速器的全部要點。
const hiringProcess = (oldListOfCandidates, action) => {
if (action.type === 'CREATE_CANDIDATE') {
// we care about this action
return [...oldListOfCandidates, action.payload];
}
// we don't care about this action
return oldListOfCandidates;
}
因此,如果沒有要添加到state
新候選者,那么我們就不需要或想要一個錯誤來解釋為什么不更新state
我們只想return state;
我們已經擁有的。
正如您已經知道的那樣,reducer第一次被調用時,它將收到undefined的值,我們只需要像這樣默認將state
的第一個參數的值默認為:
const hiringProcess = (oldListOfCandidates = [], action) => {
if (action.type === 'CREATE_CANDIDATE') {
// we care about this action
return [...oldListOfCandidates, action.payload];
}
// we don't care about this action
return oldListOfCandidates;
}
我之所以說是出於state
是因為我在商店里做過工作,他們沒有默認action
對象的值,並且無法向我解釋為什么這樣做並且同時沒有費心去糾正它,所以不要那樣做。這不是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.