首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何重构Redux-Toolkit、createAsyncThunk和extraReducers中的重复代码?

如何重构Redux-Toolkit、createAsyncThunk和extraReducers中的重复代码?
EN

Stack Overflow用户
提问于 2021-06-29 18:35:14
回答 1查看 164关注 0票数 0

这是我第一次在React项目中使用Redux。我在这里添加的代码用于基于cookie的身份验证。我担心这里的所有内容都是正确的格式。这里似乎有很多重复的代码。尤其是对于createSlice部分中的挂起和拒绝状态。我如何重构这段代码?在这种情况下,正确的编码风格是什么?

代码语言:javascript
运行
AI代码解释
复制
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";

import API from "../API";

// Register user:

export const signup = createAsyncThunk(
  "user/signup",
  async (userInfo, { rejectWithValue }) => {
    try {
      const { data } = await API.post("/signup", userInfo);
      return data;
    } catch (error) {
      return rejectWithValue(error.response.data);
    }
  }
);

// Login:
export const login = createAsyncThunk(
  "user/login",
  async (loginInfo, { rejectWithValue }) => {
    try {
      const { data } = await API.post("/login", loginInfo);
      return data;
    } catch (error) {
      return rejectWithValue(error.response.data);
    }
  }
);

// Logout:
export const logout = createAsyncThunk(
  "user/logout",
  async (args, { rejectWithValue }) => {
    try {
      const { data } = await API.get("/logout");
      return data;
    } catch (error) {
      return rejectWithValue(error.response.data);
    }
  }
);

// Chek-Auth:
export const isAuthenticated = createAsyncThunk(
  "user/isAuthenticated",
  async (args, { rejectWithValue }) => {
    try {
      const { data } = await API.get("/check-auth");
      return data;
    } catch (error) {
      return rejectWithValue(error.response.data);
    }
  }
);

// createSlice portion is here:
export const userSlice = createSlice({
  name: "user",
  initialState: {
    loading: true,
    isLoggedIn: false,
    message: "",
    user: null,
    error: null,
  },
  reducers: {},
  extraReducers: {
    [signup.pending]: (state, action) => {
      state.loading = true;
    },
    [signup.fulfilled]: (state, action) => {
      state.loading = false;
      state.isLoggedIn = true;
      state.message = action.payload.message;
      state.user = action.payload.user;
      state.error = null;
    },
    [signup.rejected]: (state, action) => {
      state.loading = false;
      state.error = action.payload || action.error;
    },
    [login.pending]: (state, action) => {
      state.loading = true;
    },
    [login.fulfilled]: (state, action) => {
      state.loading = false;
      state.isLoggedIn = true;
      state.message = action.payload.message;
      state.user = action.payload.user;
      state.error = null;
    },
    [login.rejected]: (state, action) => {
      state.loading = false;
      state.error = action.payload || action.error;
    },
    [logout.pending]: (state, action) => {
      state.loading = true;
    },
    [logout.fulfilled]: (state, action) => {
      state.loading = false;
      state.isLoggedIn = false;
      state.message = action.payload.message;
      state.user = null;
    },
    [logout.rejected]: (state, action) => {
      state.loading = false;
      state.error = action.payload || action.error;
    },
    [isAuthenticated.pending]: (state, action) => {
      state.loading = true;
    },
    [isAuthenticated.fulfilled]: (state, action) => {
      state.loading = false;
      state.isLoggedIn = true;
      state.message = action.payload.message;
      state.user = action.payload.user;
    },
    [isAuthenticated.rejected]: (state, action) => {
      state.loading = false;
      state.error = action.payload || action.error;
    },
  },
});

// export const {  } = userSlice.actions;

export default userSlice.reducer;
EN

回答 1

Stack Overflow用户

发布于 2021-06-29 21:37:45

我们通常建议使用构建器表示法,而不是对象表示法。这使得这样的事情变得更容易:

代码语言:javascript
运行
AI代码解释
复制
extraReducers: builder => {
  for (const thunk in [signup, login, logout, isAuthenticated]) {
    builder.addCase(thunk.pending, (state) => { state.loading = true })
    builder.addCase(thunk.rejected, (state, action) => { 
      state.loading = false;
      state.error = action.payload || action.error;
    })
  }
}

但请记住,将许多异步操作放在相同的状态中,共享一个加载状态,可能会导致竞争条件。

一般来说,对于api缓存的东西,你应该看看Redux Toolkit的Api缓存抽象,RTK-Query:https://redux-toolkit.js.org/rtk-query/overview

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68184008

复制
相关文章
如何提高redux开发效率?当然是redux-tookit啦!
使用 react-redux 的朋友都经历过这种痛苦吧? 定义一个 store 仓库,首先创建各种文件,比如 reducer、action、store...,然后 将 redux 和 react 连接使用。整个流程繁琐,写起来代码冗余。 react-redux 创建仓库,文件目录如下:
程序员王天
2023/10/18
2830
如何提高redux开发效率?当然是redux-tookit啦!
redux 文档到底说了什么(下)
上一篇文章主要介绍了 redux 文档里所用到的基本优化方案,但是很多都是手工实现的,不够自动化。这篇文章主要讲的是怎么用 redux-toolkit 组织 redux 代码。
写代码的海怪
2022/03/29
7900
何时应该重构代码?如何重构代码?
日常工作中,相信大家都见过一些看见就想骂人的代码,那么今天呢,我们就来聊聊何时应该重构代码,以及如何重构代码。文章有点长,但是看完一定会有很多收获哦~
kirito-moe
2021/09/08
1.7K0
我是这样在 React 中实践 TDD 编程的
在Redux中编写测试听起来肯定有悖直觉。如果你使用了Redux,它可能看起来更加复杂。
前端修罗场
2022/07/29
2K0
图重构-重复关系重构
今天看到社区有人提问如何进行关系重构,顺手回答了一下。在此记录下关系重构的方法。
马超的博客
2022/07/04
8900
图重构-重复关系重构
在 TS 中如何减少重复代码
相信有些读者已经听说过 DRY 原则,DRY 的全称是 —— Don’t Repeat Yourself ,是指编程过程中不写重复代码,将能够公共的部分抽象出来,封装成工具类或者用抽象类来抽象公共的东西,从而降低代码的耦合性,这样不仅提高代码的灵活性、健壮性以及可读性,也方便后期的维护。
阿宝哥
2020/05/06
2.3K0
reduxjs-toolkit 案例 — 登录
redux新版本移动了@reduxjs/toolkit 这个库中, 不再使用类似redux-thunk等中间件,大大地简化了开发的流程。
用户9914333
2022/12/14
1.2K0
reduxjs-toolkit 案例 — 登录
代码重构的原则和技巧
项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。
架构之家
2022/07/12
6050
代码重构的原则和技巧
vscode 插件合集
提供了一组代码片段和快捷方式,用于快速开发 React、Redux 和 React Native 应用。可以快速导入 React、Redux 相关的模块,自动生成组件的 PropTypes 类型检查等等。这些功能可以节省你在编辑器中的时间和精力,帮助你更专注于实际的开发任务。
程序员王天
2023/10/18
2850
vscode 插件合集
2018-07-19 如何重构“箭头型”代码如何重构“箭头型”代码
原文地址:https://coolshell.cn/articles/17757.html
Albert陈凯
2018/07/24
9910
2018-07-19 如何重构“箭头型”代码如何重构“箭头型”代码
说说Shell在代码重构中的应用
代码重构(Code refactoring)有时是很枯燥的,字符串替换之类的操作不仅乏味,而且还容易出错,好在有一些工具可用,以PHP为例,如:Rephactor,Scisr等等,不过现成的工具往往意味着不够灵活,所以今天我要说说Shell在代码重构中的应用。
LA0WAN9
2021/12/14
6490
代码重构
在项目初期,我们只做了pc端的应用,但是项目到了一定阶段后,我们需要开发app;此时发现,由于前期没有很好的规划,项目的架构无法拓展,虽然项目也是按照web层,service层,dao层来设计的,但是很多本该写在service层的逻辑,为了省事儿,都写在了web层,这样的service层是没法让app项目来公用的。
IT云清
2019/01/22
5610
代码重构(六):代码重构完整案例
无论做什么事情呢,都要善始善终呢。前边连续发表了5篇关于重构的博客,其中分门别类的介绍了一些重构手法。今天的这篇博客就使用一个完整的示例来总结一下之前的重构规则,也算给之前的关于重构的博客画一个句号。今天的示例借鉴于《重构,改善既有代码的设计》这本书中的第一章的示例,在其基础上做了一些修改。今天博客从头到尾就是一个完整的重构过程。首先会给出需要重构的代码,然后对其进行分析,然后对症下药,使用之前我们分享的重构规则对其进行一步步的重构。 先来聊一下该示例的使用场景(如果你有重构这本书的话,可以参加第一章中的示
lizelu
2018/01/11
1.9K0
代码重构(六):代码重构完整案例
代码重构
保持代码处于一个可控状态,而且对个人来说也非常锻炼人,可以很好的使用学到的设计模式、编码原则等
十毛
2021/11/24
3730
代码重构的方法
Add Parameter Change Bidirectional Association to Undirectional Change Reference to Value Change Undirectional Association to Bidirectional Change Value to Reference Collapse Hierarchy Consolidate Conditional Expression Consolidate Duplicate Conditional Fr
Clive
2018/06/14
7190
代码重构的艺术
所谓重构是这样一个过程:在不改变代码外在行为的前提下,对源代码做出修改,以改进程序的内部结构,从而使代码变得易于理解,可维护和可扩展。本质上来说重构就是在代码写好之后改进它的设计。
coder_koala
2020/12/17
8400
代码重构的艺术
重构-如何编写一段好的代码
关于重构,很多人可能都有惨痛的经验, 就不说去阅读别人的代码了, 有时候自己写的代码过半年,可能自己都看不明白, 这时候再来重构代码是一件很痛苦的事情。
PhoenixZheng
2018/08/07
6910
重构代码的Tricks
腾讯IVWEB团队
2017/09/28
1.3K0
React/ReactNative 状态管理: redux-toolkit 如何使用
有同学反馈开发 ReactNative 应用时状态管理不是很明白,接下来几篇文章我们来对比下 React 及 ReactNative 状态管理常用的几种框架的使用和优缺点。
张拭心 shixinzhang
2023/03/27
1.8K0
点击加载更多

相似问题

使用redux-toolkit登录createAsyncThunk和编写reducer

10

Redux-Toolkit createAsyncThunk函数不返回错误

11

redux-toolkit中的createAsyncThunk错误响应类型错误

21

Redux-Toolkit createAsyncThunk请求返回未定义的

110

如何重构重复代码?

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文