在Redux教程中,createAsyncThunk
返回的动作创建者的还原符作为extraReducers
传递给createSlice
,如下所示:
export const fetchTodos = createAsyncThunk('todos/fetchTodos', async () => {
// async logic
})
const todosSlice = createSlice({
// omit unnecessary code
extraReducers: builder => {
builder
.addCase(fetchTodos.pending, (state, action) => {
state.status = 'loading'
})
}
})
是否可以将动作创建者添加到reducers
?例如:
//omit createAsyncThunk
const todosSlice = createSlice({
name: 'todos',
initialState,
reducers: {
// omit reducer cases
fetchTodos.fulfilled = (state, action) => {
// some code to update state based on action.payload
}
})
医生说
我们无法处理createSlice.reducers字段中的那些,因为它们也会生成新的操作类型。
为什么会出现这种情况?
不,不可能是.
reducers
字段用于定义大小写缩减器,并生成与这些缩减器相对应的新操作类型,这些操作类型将以片的name
命名。换句话说,它用于帮助在切片本身内部定义新的动作类型。
extraReducers
用于定义将响应在切片之外定义的其他操作而运行的事例缩减器。
createAsyncThunk
定义了新的动作类型,这些动作类型将在切片之外定义。因此,切片必须使用extraReducers
来处理这些操作。
如果createAsyncThunk
中的动作创建者作为计算的键名添加到reducers
中,这将最终创建重复的动作类型,这些动作类型将切片name
前缀和thunk的动作类型字符串组合在一起。这意味着,当thunk调度其操作时,它们将与切片所寻找的类型不匹配,并且reducer将永远不会运行。