我正在阅读createAsyncThunk文档,对流程感到有点困惑。这是文档中的内容:
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import { userAPI } from './userAPI'
// First, create the thunk
const fetchUserById = createAsyncThunk(
'users/fetchByIdStatus',
async (userId, thunkAPI) => {
const response = await userAPI.fetchById(userId)
return response.data
}
)
// Then, handle actions in your reducers:
const usersSlice = createSlice({
name: 'users',
initialState: { entities: [], loading: 'idle' },
reducers: {
// standard reducer logic, with auto-generated action types per reducer
},
extraReducers: {
// Add reducers for additional action types here, and handle loading state as needed
[fetchUserById.fulfilled]: (state, action) => {
// Add user to the state array
state.entities.push(action.payload)
}
}
})
// Later, dispatch the thunk as needed in the app
dispatch(fetchUserById(123))我需要在reducers和extraReducers中写些什么?标准的reducer逻辑?
我有这个CodeSandbox,我用旧的redux方式实现了它。现在,需要在其中实现redux-toolkit。
发布于 2021-04-23 13:56:06
createSlice的reducers属性允许您创建一个操作创建器函数,并在一个步骤中响应这些操作。您可以使用extraReducers来响应已在别处创建的操作,例如在异步thunk中。extraReducer只是响应一个动作,而不是创建一个动作创建器函数。
该示例说明,除了extraReducers之外,您还可以拥有一些常规的reducers。但我查看了您的CodeSandbox,在您的情况下,您不需要任何其他reducers,因为您正在响应的唯一操作是来自async thunk的三个操作。
由于您的createSlice不会创建任何操作创建器,因此您实际上不需要使用createSlice。您可以使用它,但也可以只使用createReducer。
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import { userAPI } from './userAPI'
export const fetchUserFromGithub = createAsyncThunk(
'users/fetch',
async (username) => {
const response = await axios.get(
`https://api.github.com/users/${username}`
);
return response.data
}
)
const usersSlice = createSlice({
name: 'users',
initialState: {
user: null,
fetchingUser: false,
fetchingError: null
},
reducers: {},
extraReducers: {
[fetchUserFromGithub.pending]: (state, action) => {
state.fetchingUser = true;
state.fetchingError = null;
},
[fetchUserFromGithub.rejected]: (state, action) => {
state.fetchingUser = false;
state.fetchingError = action.error;
}
[fetchUserFromGithub.fulfilled]: (state, action) => {
state.fetchingUser = false;
state.user = action.payload;
}
}
})https://stackoverflow.com/questions/62020623
复制相似问题