createAsyncThunk
在https://redux-toolkit.js.org/api/createasyncthunk
上从示例中
const uploadThumbnail = createAsyncThunk(
'mySlice/uploadThumbnail',
async (file: File, thunkAPI) => {
const response = await uploadAPI.upload(file) as API_RESPONSE
return response.data // IS THIS THE payload FOR THE fulfilled ACTION ?
}
)
这就是我如何处理生命周期行动?问题 我假设
createAsyncThunk
异步处理程序的返回是
payload
动作,是对吗?但是如何为
fulfilled
和payload
pending
类型?我应该在
rejected
处理程序中添加一个
try-catch
块吗?这是我应该做的相关性吗?
createAsyncThunk
pending === "UPLOAD_START"
fulfilled === "UPLOAD_SUCCESS"
rejected === "UPLOAD_FAILURE"
道具)。在这种情况下,使用extraReducers
createAsyncThunk
当使用Typescript时,您应该使用export const updateUser = createAsyncThunk<
User,
{ id: string } & Partial<User>,
{
rejectValue: ValidationErrors
}
>('users/update', async (userData, { rejectWithValue }) => {
try {
const { id, ...fields } = userData
const response = await userAPI.updateById<UpdateUserResponse>(id, fields)
return response.data.user
} catch (err) {
let error: AxiosError<ValidationErrors> = err // cast the error for access
if (!error.response) {
throw err
}
// We got validation errors, let's return those so we can reference in our component and set form errors
return rejectWithValue(error.response.data)
}
})
const usersSlice = createSlice({
name: 'users',
initialState,
reducers: {},
extraReducers: (builder) => {
// The `builder` callback form is used here because it provides correctly typed reducers from the action creators
builder.addCase(updateUser.fulfilled, (state, { payload }) => {
state.entities[payload.id] = payload
})
builder.addCase(updateUser.rejected, (state, action) => {
if (action.payload) {
// Being that we passed in ValidationErrors to rejectType in `createAsyncThunk`, the payload will be available here.
state.error = action.payload.errorMessage
} else {
state.error = action.error.message
}
})
},
})
样式符号为ExuroveUcers使用,并且您的所有类型都将自动为您推断。您不需要手工键入任何内容 - ever。 thunk的价值将是“满足”动作的
builder
如果您extraReducers
return
如果您只是
payload
,那将成为“被拒绝”动作的return rejectWithResult(value)
payload
,这是您传递给thunk呼叫的原始价值。
throw
实际上包含一个错误?
如果error
action.meta.arg
块中,并且将派遣另一个错误。因此,您将同时拥有成功和错误案例的thunk。尴尬的。可以通过将结果存储在范围的变量中并在Try-Catch-Block之外进行调度来规避这一点,但是实际上是谁这样做的? )
正是这些小事 const manualThunk = async (arg) => {
dispatch(pendingAction())
try {
const result = await foo(arg)
dispatch(successAction(result))
} catch (e) {
dispatch(errorAction(e))
}
}
照顾您,这使它在我眼中值得。
中src/store/reducer/api.ts
successAction
shice添加了被拒绝的案例
throw