大佬教程收集整理的这篇文章主要介绍了使用 redux 工具包时,在操作中定义副作用(不是异步 thunk)的正确方法是什么?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
目前我正在使用 Typescript 深入研究 Redux Toolkit,但我一直坚持注销操作。它基本上不应该有任何有效负载,但应该修改 localstorage 和 axios 配置。 我知道两种工作方式略有不同。
一种是在 prepare
内使用 createSlice
回调定义 reducer:
const authSlice = createSlice({
name: "authentication",initialState,reducers: {
logout: {
reducer: () => initialState,prepare: () => {
API.logout();
return { payload: undefined,error: undefined,Meta: undefined };
},},...
在这种情况下,prepare 回调的类型签名迫使我显式返回 payload
、error
和 @H_635_5@meta 属性。
另一种方法是使用带有 createAction
回调的 prepare
:
export const logout = createAction("authentication/logout",() => {
API.logout();
return { payload: undefined };
});
这是一个更好看的解决方案。至少我不必传递 error
和 @H_635_5@meta。但仍然被迫返回 payload
,即使它不需要。
有点困惑为什么 prepare
函数签名不同,但这不是重点。
我的问题是您将如何处理此类情况。也许我做错了什么?
我知道也有使用中间件的选项,但设置只处理一个操作的中间件看起来像是一种开销。
您在这里有点混淆了术语 - 并且遗漏了一个重要术语;)
action@H_616_55@ 是具有 type
属性的对象。你永远无法在那里执行代码。
action creator@H_616_55@ 是一个返回 action@H_616_55@ 的函数。您可以在此处执行代码,但它将在分派结果操作之前执行。
async thunk@H_616_55@ 是一种特殊形式的 thunk@H_616_55@,它将生命周期操作(待定/完成/拒绝)附加到 thunk@H_616_55@。准确地说,createAsyncThunk
函数创建了一个异步 thunk 动作创建者@H_616_55@ - 一个创建可以调度@H_616_55@以触发它的东西的函数。
那么,缺少的东西:什么是thunk@H_616_55@?
thunk 是一个被调度的函数 - 然后由 redux-thunk@H_616_55@ 中间件执行。该函数将通过 dispatch
作为第一个参数,将 getState
作为第二个参数传递,因此您可以在必要时从那里触发更多与 redux 相关的内容。
所以你正在寻找一个thunk。通常,这些是由动作创建者编写的,因此您正在寻找 thunk 动作创建者@H_616_55@。
const logout = (potentiallySomeArgument) => (dispatch,getStatE) => {
api.logout(potentiallySomeArgument);
// maybe you also want to dispatch an action to clear state
dispatch(userSlice.clear())
}
这将像任何其他操作一样被调度,因此功能与您的组件完全无关:
dispatch(logout("whatever"))
,
我敢打赌 api.logout
是异步函数。
如果是 async
,则应使用 createAsyncThunk 而不是 createAction
请看例子:
import { createAsyncThunk } from '@reduxjs/toolkit'
const api = async () => { }
const increment = createAsyncThunk('counter/increment',api)
const action = increment() // AsyncThunkAction<void,void,{}>
Playground
以上是大佬教程为你收集整理的使用 redux 工具包时,在操作中定义副作用(不是异步 thunk)的正确方法是什么?全部内容,希望文章能够帮你解决使用 redux 工具包时,在操作中定义副作用(不是异步 thunk)的正确方法是什么?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。