簡體   English   中英

為什么要返回默認大小寫而不是在Redux的reducer中拋出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM