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 钩子在各个组件内管理本地状态。此方法非常简单,非常适合简单的、特定于组件的状态需求。

示例:

Groq
Groq

GroqChat是一个全新的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

相关专题

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

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

175

2024.05.11

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

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

212

2025.12.18

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

61

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

198

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

热门下载

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

精品课程

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

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