redux用法总结

redux用法总结

目录

  1. 基本概念
  2. 工作原理
  3. 核心概念
  4. 基本使用
  5. 异步操作
    • Redux Thunk
    • Redux Saga
  6. React 集成
  7. Redux Toolkit
  8. 最佳实践

基本概念

什么是 Redux?

Redux 是一个可预测的状态容器,用于管理 JavaScript 应用的状态。它遵循三个基本原则:

  • 单一数据源:整个应用的状态存储在单个 store 中
  • 状态是只读的:唯一改变状态的方式是触发 action
  • 使用纯函数进行修改:使用 reducer 来指定状态如何更新

核心概念图

Action --> Dispatcher --> Store --> View
   ^                                |
   |                                |
   +--------------------------------+

在这里插入图片描述

工作原理

1. 基本流程

// 1. 创建 action
const addTodo = (text: string) => ({
  type: 'ADD_TODO',
  payload: text
});

// 2. Reducer 处理 action
const todoReducer = (state = [], action) => {
  switch (action.type) {
    case 'ADD_TODO':
      return [...state, action.payload];
    default:
      return state;
  }
};

// 3. 创建 store
const store = createStore(todoReducer);

// 4. 订阅变化
store.subscribe(() => {
  console.log('State updated:', store.getState());
});

// 5. 发送 action
store.dispatch(addTodo('Learn Redux'));

核心概念

1. Action

// Action 类型定义
interface Action {
  type: string;
  payload?: any;
}

// Action Creator
const increment = (amount: number): Action => ({
  type: 'INCREMENT',
  payload: amount
});

2. Reducer

// 基本 reducer
const counterReducer = (state = 0, action: ActionType) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + action.payload;
    case 'DECREMENT':
      return state - action.payload;
    default:
      return state;
  }
};

// 组合 reducers
const rootReducer = combineReducers({
  counter: counterReducer,
  todos: todosReducer
});

3. Store

// 创建 store
const store = createStore(rootReducer);

// 获取状态
console.log(store.getState());

// 订阅变化
const unsubscribe = store.subscribe(() => {
  console.log('State updated:', store.getState());
});

// 发送 action
store.dispatch(increment(5));

异步操作

1. Redux Thunk

// actions/userActions.ts
import { Dispatch } from 'redux';

export const fetchUser = (id: string) => {
  return async (dispatch: Dispatch) => {
    dispatch({ type: 'FETCH_USER_REQUEST' });
    
    try {
      const response = await fetch(`/api/users/${id}`);
      const data = await response.json();
      dispatch({ type: 'FETCH_USER_SUCCESS', payload: data });
    } catch (error) {
      dispatch({ type: 'FETCH_USER_FAILURE', payload: error.message });
    }
  };
};

2. Redux Saga

2.1 基本概念

Redux Saga 是一个用于处理副作用的中间件,使用 ES6 的 Generator 函数。

2.2 核心 Effect Creators
  • take: 等待指定 action 被触发
  • put: 触发一个新的 action
  • call: 调用异步函数
  • fork: 非阻塞调用
  • select: 获取 state 数据
  • takeLatest: 只执行最新的调用
  • takeEvery: 执行每一次调用
  • all: 并行执行
  • race: 竞态处理
2.3 基本配置
// 配置 Saga 中间件
import createSagaMiddleware from 'redux-saga';
import rootSaga from './sagas';

const sagaMiddleware = createSagaMiddleware();

const store = createStore(
  rootReducer,
  applyMiddleware(sagaMiddleware)
);

sagaMiddleware.run(rootSaga);
2.4 常见使用场景
  1. API 请求处理
function* fetchUserSaga(action) {
  try {
    const user = yield call(api.fetchUser, action.payload);
    yield put({ type: 'FETCH_USER_SUCCESS', payload: user });
  } catch (error) {
    yield put({ type: 'FETCH_USER_FAILURE', error });
  }
}

function* watchFetchUser() {
  yield takeLatest('FETCH_USER_REQUEST', fetchUserSaga);
}
  1. 并发控制
function* fetchAll() {
  const [users, posts] = yield all([
    call(api.fetchUsers),
    call(api.fetchPosts)
  ]);
  
  yield put({ type: 'FETCH_ALL_SUCCESS', payload: { users, posts } });
}
  1. 轮询
function* pollData() {
  while (true) {
    try {
      const data = yield call(api.fetchData);
      yield put({ type: 'POLL_SUCCESS', payload: data });
      yield delay(5000);
    } catch (error) {
      yield put({ type: 'POLL_FAILURE', error });
    }
  }
}
  1. 取消操作
function* fetchWithCancel() {
  const bgTask = yield fork(backgroundTask);
  yield take('CANCEL_FETCH');
  yield cancel(bgTask);
}
2.5 适用场景
  1. 适合使用 Saga 的场景:

    • 复杂的异步流程控制
    • 需要取消的操作
    • 并发控制
    • API 调用序列
    • 实时数据处理
    • 复杂的状态同步
  2. 不适合使用 Saga 的场景:

    • 简单的异步操作
    • 同步操作
    • 单一的 API 调用

React 集成

1. 使用 React-Redux

// App.tsx
import { Provider } from 'react-redux';
import store from './store';

function App() {
  return (
    <Provider store={store}>
      <TodoList />
    </Provider>
  );
}

// components/TodoList.tsx
import { useSelector, useDispatch } from 'react-redux';

function TodoList() {
  const todos = useSelector(state => state.todos);
  const dispatch = useDispatch();
  
  return (
    // JSX
  );
}

Redux Toolkit

1. 创建 Slice

import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: state => {
      state.value += 1;
    },
    decrement: state => {
      state.value -= 1;
    }
  }
});

export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

最佳实践

  1. 状态设计:

    • 保持状态扁平化
    • 避免冗余数据
    • 使用规范化的数据结构
  2. Action 设计:

    • 使用动作创建器
    • 保持 action 简单
    • 使用类型常量
  3. 异步处理:

    • 简单异步用 Thunk
    • 复杂异步用 Saga
    • 合理使用中间件
  4. 性能优化:

    • 使用选择器模式
    • 避免不必要的渲染
    • 合理使用缓存

总结

  1. Redux 优点:

    • 可预测的状态管理
    • 集中的状态管理
    • 易于调试
    • 强大的中间件生态
  2. 使用场景:

    • 大型应用
    • 复杂的状态逻辑
    • 多人协作项目
    • 需要状态持久化
  3. 最佳实践:

    • 使用 TypeScript
    • 采用 Redux Toolkit
    • 实现状态范式化
    • 使用选择器模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gitee上传项目代码教程(详细)

工具必备&#xff1a;Git Bash 上传步骤 1.在Gitee创建项目仓库 2.进入本地项目目录 右键打开Git Bash here 3.配置用户名和邮箱 如果之前给git配置过用户名和邮箱可跳过 查看Git是否配置成功&#xff1a;git config --list git config --global user.name "xxx"…

ARM CCA机密计算安全模型之安全生命周期管理

安全之安全(security)博客目录导读 目录 一、固件启用的调试 二、CCA系统安全生命周期 三、重新供应 四、可信子系统与CCA HES 启用 CCA&#xff08;机密计算架构&#xff09;的安全系统是指 CCA 平台的实现处于可信状态。 由于多种原因&#xff0c;CCA 启用系统可能处于不…

计算机视觉CV期末总复习

1.计算机视觉基础 数字图像表示 二值图像 仅包含黑白两种颜色的图像&#xff0c;只使用1个比特为&#xff08;0黑或1白&#xff09;表示 彩色图像&#xff1a;分不同的颜色空间 gray灰度图像 每个像素只有一个采样颜色&#xff0c;取值范围0--255&#xff0c;为8比特位&a…

web安全常用靶场

这里写自定义目录标题 phpstydy2018pikachuxss-labs phpstydy2018 网盘地址 提取码: nxnw ‌phpStudy是一款专为PHP开发者设计的集成环境工具&#xff0c;主要用于简化PHP开发环境的搭建过程。‌ 它集成了Apache、MySQL、PHP等核心组件&#xff0c;用户只需进行一次性安装&a…

每天40分玩转Django:Django实战 - 在线打印服务系统

Django实战 - 在线打印服务系统 一、系统功能概览表 模块主要功能技术要点文件上传PDF/Word文件上传、文件验证文件处理、MIME类型验证异步处理文件转换、打印队列Celery、Redis通知邮件打印状态通知、订单确认SMTP、邮件模板 二、系统架构设计 2.1 模型设计 # models.py …

WPS计算机二级•数据查找分析

听说这里是目录哦 通配符&#x1f30c;问号&#xff08;?&#xff09;星号&#xff08;*&#xff09;波形符&#xff08;~&#xff09; 排序&#x1f320;数字按大小排序以当前选定区域排序以扩展选定区域排序 文字按首字母排序 快速筛选分类数据☄️文字筛选数字筛选颜色筛选…

基于海思soc的智能产品开发(camera sensor的两种接口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于嵌入式开发设备来说&#xff0c;除了图像显示&#xff0c;图像输入也是很重要的一部分。说到图像输入&#xff0c;就不得不提到camera。目前ca…

网安入门之MySQL后端基础

数据库 (Database) 数据库是指长期存储在计算机中的&#xff0c;有组织、可共享的数据集合。它通过表、列、行等结构来组织数据&#xff0c;目的是使数据可以高效存储、检索和管理。数据库通常包括多个表&#xff0c;每个表存储与特定主题或对象相关的数据 数据库管理系统 (D…

概率基本概念 --- 离散型随机变量实例

条件概率&独立事件 随机变量 - 离散型随机变量 - 非离散型随机变量 连续型随机变量奇异性型随机变量 概率表示 概率分布函数概率密度函数概率质量函数全概率公式贝叶斯公式 概率计算 数学期望方差协方差 计算实例 假设有两个离散型随机变量X和Y&#xff0c;它们代…

w139华强北商城二手手机管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

LLM大语言模型中RAG切片阶段改进策略

切片方法的特点和示例&#xff1a; Token 切片 适合对 Token 数量有严格要求的场景&#xff0c;比如使用上下文长度较小的模型时。 示例文本&#xff1a; “LlamaIndex是一个强大的RAG框架。它提供了多种文档处理方式。用可以根据需选择合适的方法。” 使用Token切片(chunk…

Earth靶场

打开靶机后使用 arp-scan -l 查询靶机 ip 我们使用 nmap 进行 dns 解析 把这两条解析添加到hosts文件中去&#xff0c;这样我们才可以访问页面 这样网站就可以正常打开 扫描ip时候我们发现443是打开的&#xff0c;扫描第二个dns解析的443端口能扫描出来一个 txt 文件 dirsear…

Kafka 消费者专题

目录 消费者消费者组消费方式消费规则独立消费主题代码示例&#xff08;极简&#xff09;代码示例&#xff08;独立消费分区&#xff09; offset自动提交代码示例&#xff08;自动提交&#xff09;手动提交代码示例&#xff08;同步&#xff09;代码示例&#xff08;异步&#…

重庆大学软件工程复试怎么准备?

重大软件复试相对来说不算刁钻&#xff0c;关键是对自己的竞赛和项目足够了解&#xff0c;能应对老师的提问。专业课范围广&#xff0c;英文文献看个人水平&#xff0c;难度不算大&#xff0c;整体只要表现得得体从容&#xff0c;以及充分的准备&#xff0c;老师不会为难你。 …

Hadoop•FinalShell连接VMware免密登录

听说这是目录哦 FinalShell连接VMware&#x1f324;️解决重连失效FinalShell的使用 免密登录⛈️能量站&#x1f61a; FinalShell连接VMware&#x1f324;️ 保持虚拟机的开机状态&#xff0c;打开FinalShell&#xff0c;如果虚拟机关机或者挂起&#xff0c;连接就会断开。 …

List-顺序表--2

目录 1、ArrayList 2、ArrayList构造方法 3、ArrayList常见方法 4、ArrayList的遍历 5、ArrayList的扩容机制 6、ArrayList的具体使用 6.1、杨辉三角 6.2、简单的洗牌算法 1、ArrayList 在集合框架中&#xff0c;ArrayList 是一个普通的类&#xff0c;实现了 List 接口…

通过串口通信控制led灯的亮灭

初始化led灯的gpio接口控制灯的亮灭 初始化uart1串口 将gpio9和gpio10设置为复用模式进行串口通信 通过串口的输入输出函数实现串口通信控制led灯的亮灭

git知识点汇总

git init 初始化一个git仓库&#xff0c;后面可以加仓库名&#xff0c;在当前目录下创建指定名称的目录并在该目录下创建仓库&#xff0c;若不加则直接在当前目录下创建仓库。git仓库的三个区域&#xff1a;工作区&#xff08;当前目录&#xff09;、暂存区&#xff08;.git/in…

电子电气架构 --- 中央HPC架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

让 Agent 具备语音交互能力:技术突破与应用前景(16/30)

让 Agent 具备语音交互能力&#xff1a;技术突破与应用前景 一、引言 在当今数字化时代&#xff0c;人机交互方式正经历着深刻的变革。从早期的命令行界面到图形用户界面&#xff0c;再到如今日益普及的语音交互&#xff0c;人们对于与机器沟通的便捷性和自然性有了更高的追求…