0

0

Redux VS Redux 工具包 && Redux Thunk VS Redux-Saga

王林

王林

发布时间:2024-07-11 18:28:16

|

1139人浏览过

|

来源于dev.to

转载

redux vs redux 工具包 && redux thunk vs redux-saga

简介

在现代 web 开发中,尤其是 react,有效管理状态对于构建动态、响应式应用程序至关重要。状态表示可以随时间变化的数据,例如用户输入、获取的数据或任何其他动态内容。如果没有适当的状态管理,应用程序可能会变得难以维护和调试,从而导致 ui 不一致和行为不可预测。这就是状态管理工具的用武之地,帮助开发人员在其应用程序中有效地维护和操作状态。

当地州

使用 react 的 usestate 钩子在各个组件内管理本地状态。此方法非常简单,非常适合简单的、特定于组件的状态需求。

示例:

慧中标AI标书
慧中标AI标书

慧中标AI标书是一款AI智能辅助写标书工具。

下载
import react, { usestate } from 'react';

function counter() {
  const [count, setcount] = usestate(0);

  return (
    

count: {count}

); }

用例: 本地状态非常适合小型、独立的组件,其中状态不需要由其他组件共享或访问。

上下文api

context api 允许在多个组件之间共享状态,而无需进行 prop 钻取,使其成为更复杂的状态共享需求的良好解决方案。

示例:

import react, { createcontext, usecontext, usestate } from 'react';

const themecontext = createcontext();

function themeprovider({ children }) {
  const [theme, settheme] = usestate('light');

  return (
    
      {children}
    
  );
}

function themedcomponent() {
  const { theme, settheme } = usecontext(themecontext);

  return (
    

current theme: {theme}

); }

用例: context api 对于全局状态非常有用,例如需要由组件树中的多个组件访问的主题或用户身份验证。

redux

redux 是一个状态管理库,它提供了一个集中存储,用于使用减速器和操作来管理具有可预测状态转换的全局状态。

示例:

// store.js
import { createstore } from 'redux';

const initialstate = { count: 0 };

function counterreducer(state = initialstate, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    default:
      return state;
  }
}

const store = createstore(counterreducer);

redux 工具包

redux toolkit 是官方推荐的使用 redux 的方式,它简化了设置并减少了样板代码。

示例:

// store.js
import { configurestore, createslice } from '@reduxjs/toolkit';

const counterslice = createslice({
  name: 'counter',
  initialstate: { count: 0 },
  reducers: {
    increment: state => { state.count += 1; },
  },
});

const store = configurestore({
  reducer: {
    counter: counterslice.reducer,
  },
});

export const { increment } = counterslice.actions;
export default store;

local state、context api、redux 和 redux toolkit 之间的区别

- 本地状态与上下文 api:
本地状态仅限于单个组件,这使其成为小型、独立状态需求的理想选择。另一方面,context api 允许跨多个组件共享状态,从而避免了 prop 钻探。

- redux 与 redux 工具包:
redux 提供了一种带有大量样板的传统状态管理方法。 redux toolkit 使用 createslice 和 createasyncthunk 等实用程序简化了流程,使编写干净、可维护的代码变得更加容易。

中间件:

redux 中的中间件充当调度操作和到达减速器之间的强大扩展点。 redux thunk 和 redux saga 等中间件可实现处理异步操作和管理副作用等高级功能。

中间件的必要性
中间件对于管理 redux 应用程序中的异步操作和副作用至关重要。它们有助于保持操作创建者和减速器的纯净且没有副作用,从而产生更干净、更易于维护的代码。

1. redux thunk

redux thunk 简化了异步调度,允许操作创建者返回函数而不是普通对象。

示例:

const fetchdata = () => async dispatch => {
  dispatch({ type: 'fetch_data_start' });
  try {
    const data = await fetch('/api/data').then(res => res.json());
    dispatch({ type: 'fetch_data_success', payload: data });
  } catch (error) {
    dispatch({ type: 'fetch_data_failure', error });
  }
};

用例: redux thunk 适用于简单的异步操作,例如从 api 获取数据。

2. redux 传奇

redux saga 使用生成器函数管理复杂的副作用,为异步逻辑提供了一种更加结构化和可管理的方法。

示例:

import { call, put, takeEvery } from 'redux-saga/effects';

function* fetchDataSaga() {
  yield put({ type: 'FETCH_DATA_START' });
  try {
    const data = yield call(() => fetch('/api/data').then(res => res.json()));
    yield put({ type: 'FETCH_DATA_SUCCESS', payload: data });
  } catch (error) {
    yield put({ type: 'FETCH_DATA_FAILURE', error });
  }
}

function* watchFetchData() {
  yield takeEvery('FETCH_DATA_REQUEST', fetchDataSaga);
}

用例: redux saga 非常适合处理复杂的异步工作流程,例如涉及多个步骤、重试或复杂条件逻辑的工作流程。

redux thunk 和 redux saga 之间的区别

- redux thunk:
最适合更简单、直接的异步操作。它允许动作创建者返回函数,并且易于理解和实现。

- redux saga:
最适合更复杂、结构化的异步工作流程。它使用生成器函数来处理副作用,并提供更强大但更复杂的管理异步逻辑的解决方案。

结论

有效的状态管理对于构建可扩展且可维护的 react 应用程序至关重要。虽然本地状态和 context api 可以很好地满足更简单的用例,但 redux 和 redux toolkit 为大型应用程序提供了强大的解决方案。像 redux thunk 和 redux saga 这样的中间件通过处理异步操作和副作用进一步增强了这些状态管理工具,每个工具都满足应用程序逻辑中不同复杂程度的需求。

除了这些工具之外,还有其他可以与 react 一起使用的状态管理库,包括:

recoil: 专为 react 设计的状态管理库,提供细粒度的控制和跨组件的轻松状态共享。它通过分别使用状态和派生状态的原子和选择器来简化状态管理。
mobx: 专注于简单性和可观察状态,使其更容易处理复杂的表单和实时更新。 mobx 提供了更具反应性的编程模型,可以自动跟踪状态变化并相应更新 ui。
zustand: 一个小型、快速且可扩展的状态管理解决方案。它使用钩子来管理状态,并提供简单的 api 来创建存储和更新状态。
选择正确的工具取决于应用程序的具体需求和复杂性。了解每个工具的优势和用例可以在您的 react 应用程序中实现更高效和可维护的状态管理。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

213

2025.12.18

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

3

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

14

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号