在src / actions / index.js中,addToCart函数在分派addToCartUnsafe之前检查是否(getState()。products.byId [productId] .inventory> 0)。
代码:
export const addToCart = productId => (dispatch, getState) => {
if (getState().products.byId[productId].inventory > 0) {
dispatch(addToCartUnsafe(productId))
}
}
在src / reducers / products.js中,[productId]是在调用byId的默认语句时定义的。该语句在定义[productId]之前检查action.productId是否存在,否则返回状态,这意味着只有addToCartUnsafe能够触发默认语句,因为它是唯一携带productId的操作。
代码:
const byId = (state = {}, action) => {
switch (action.type) {
case RECEIVE_PRODUCTS:
return {
...state,
...action.products.reduce((obj, product) => {
obj[product.id] = product
return obj
}, {})
}
default:
const { productId } = action
if (productId) {
return {
...state,
[productId]: products(state[productId], action)
}
}
return state
}
}