程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 redux 工具包时,在操作中定义副作用(不是异步 thunk)的正确方法是什么?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用 redux 工具包时,在操作中定义副作用(不是异步 thunk)的正确方法是什么??

开发过程中遇到使用 redux 工具包时,在操作中定义副作用(不是异步 thunk)的正确方法是什么?的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 redux 工具包时,在操作中定义副作用(不是异步 thunk)的正确方法是什么?的解决方法建议,希望对你解决使用 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 回调的类型签名迫使我显式返回 payloaderror 和 @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,请注明来意。
标签:redux使用