我已经阅读了很多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}`)
}
};
为什么不扔?
答案 0 :(得分:2)
在Redux的情况下,您可能具有多个化简器,它们可以使用combineReducers
组合在一起以形成一个商店。当您分派一个动作时,它会分派给所有的reducer,而只会分派给预期的那一个。因此,在默认情况下,您将返回当前状态。
在将动作分派给所有reducer的同时,只有那些必须处理该动作的人会监听它并更新状态。这可能会导致某个动作被分派,但没有被任何化简器处理,但是肯定不会引起问题,除非您忘记编写此代码,否则绝不会发生。
但是,如果您使用单个化合器而不组合它们(这通常是使用useReducer
钩子的情况),那么如果没有调度匹配的动作,则会引发错误。
答案 1 :(得分:1)
创建减速器时,目的不是要取回错误来代替我们的新状态,而是要在没有新状态可用时返回现有状态。
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
对象的值的商店做过工作,无法向我解释为什么这样做,而同时又没有这样做麻烦去纠正它,所以不要这样做是不必要的。