React + Redux 从单向数据流到闭环实现

 更新时间:2026年06月10日 09:11:07   作者:漠月瑾  
本文彻底剖析 React、Redux 及 Store、Action、Reducer 之间的逻辑关系与实现原理,构建一个完整的“数据流闭环”认知模型,感兴趣的可以了解一下

一、 核心关系:为什么需要 Redux?

在 React 中,数据通过 props 单向流动。但当应用变得复杂时,跨层级组件通信状态共享变得困难。Redux 应运而生,它提供了一个全局状态容器(Store),让所有组件都能通过统一的规则访问和修改数据。

1.1 核心角色定义

角色类比职责
Store图书馆总登记簿存储整个应用的状态(State),是唯一的数据源
Action申请表描述“发生了什么”的普通对象,是改变状态的唯一方式
Reducer图书管理员纯函数,接收旧 State 和 Action,返回新 State
Dispatch申请提交箱触发 Action 的唯一方法

二、 逻辑闭环:单向数据流是如何运作的?

Redux 的核心是严格的单向数据流。整个数据流动遵循一个清晰的闭环路径:

2.1 详细步骤解析

  1. View 触发 Action

    • 场景:用户在界面点击按钮(如“添加待办事项”)。
    • 实现:组件调用 dispatch(action) 方法,发送一个 Action 对象。
    • Action 结构:必须包含 type 字段,描述动作类型。
    // Action 示例
    { type: 'ADD_TODO', text: 'Learn Redux' }
  2. Reducer 计算新状态

    • 场景:Store 接收到 Action。
    • 实现:Store 将当前的 State 和收到的 Action 一起传给 Reducer 函数。
    • Reducer 逻辑:根据 Action 的 type,计算并返回全新的 State 对象(不可变数据)。
    // Reducer 示例
    function todoReducer(state = [], action) {
      switch (action.type) {
        case 'ADD_TODO':
          return [...state, { text: action.text, completed: false }];
        default:
          return state;
      }
    }
    
  3. Store 更新状态

    • 场景:Reducer 返回了新 State。
    • 实现:Store 用新 State 替换旧 State,并触发所有已注册的监听器(Listener)。
  4. View 响应更新

    • 场景:监听器被触发。
    • 实现:通过 connectuseSelector 连接的 React 组件接收到新的 State,触发重新渲染(Re-render),界面更新。

三、 实现原理:Redux 的“黑魔法”揭秘

3.1 Store 的实现(发布-订阅模式)

Redux 的 Store 本质上是一个发布-订阅模式的实现。它维护了一个状态树和一个监听器数组。

// 简化版 createStore 实现
function createStore(reducer, initialState) {
  let state = initialState;
  let listeners = [];

  // 获取当前状态
  function getState() {
    return state;
  }

  // 分发 Action
  function dispatch(action) {
    // 关键步骤:调用 Reducer 计算新状态
    state = reducer(state, action);
    // 通知所有订阅者
    listeners.forEach(listener => listener());
    return action;
  }

  // 订阅状态变化
  function subscribe(listener) {
    listeners.push(listener);
    // 返回取消订阅的函数
    return () => {
      listeners = listeners.filter(l => l !== listener);
    };
  }

  return { getState, dispatch, subscribe };
}

3.2 React-Redux 的连接机制(Context + HOC)

React-Redux 通过 Providerconnect 将 React 和 Redux 连接起来:

  • Provider:利用 React 的 Context API,将 Store 注入到整个应用树下。
  • Connect:高阶组件(HOC),它订阅 Store 的变化,并将 Store 中的 State 和 Dispatch 方法映射为组件的 Props。

关键逻辑connect 在组件挂载时调用 store.subscribe(),当 Store 变化时,它会执行 mapStateToProps 获取新数据,并通过浅比较(Shallow Compare)决定是否触发组件的 setState,从而避免不必要的重渲染。

四、 设计哲学:为什么这样设计?

4.1 不可变数据(Immutability)

  • 原因:Reducer 必须返回新对象,而不是修改原对象。
  • 优势
    • 可预测性:相同的输入永远得到相同的输出。
    • 性能优化:通过引用比较(===)可以快速判断数据是否变化,避免深比较。
    • 时间旅行调试:可以保存历史状态快照。

4.2 纯函数(Pure Function)

  • 原因:Reducer 必须是纯函数。
  • 优势
    • 无副作用:不修改传入参数,不依赖外部变量,易于测试和调试。
    • 确定性:状态变更逻辑集中且清晰。

五、 总结:闭环的意义

React + Redux 的闭环设计,本质上是在前端应用中建立了一套**“审批流程”**:

  1. 统一入口:所有状态变更必须通过 dispatch(action),杜绝了随意修改数据的混乱。
  2. 集中处理:所有变更逻辑集中在 Reducer 中,便于追踪和调试。
  3. 自动同步:Store 的变化自动同步到 View,实现了数据与 UI 的分离。

这种单向数据流的闭环,使得大型应用的状态管理变得可预测、可维护、可测试,是构建复杂前端应用的基石。

到此这篇关于React + Redux 从单向数据流到闭环实现的文章就介绍到这了,更多相关React  Redux 单向数据流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • react中使用js实现页面滚动监听(推荐)

    react中使用js实现页面滚动监听(推荐)

    这篇文章主要介绍了react中使用js实现页面滚动监听,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • 一文详解手动实现Recoil状态管理基本原理

    一文详解手动实现Recoil状态管理基本原理

    这篇文章主要为大家介绍了一文详解手动实现Recoil状态管理基本原理实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • React+Webpack快速上手指南(小结)

    React+Webpack快速上手指南(小结)

    这篇文章主要介绍了React+Webpack快速上手指南(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 浅谈react 同构之样式直出

    浅谈react 同构之样式直出

    这篇文章主要介绍了浅谈react 同构之样式直出,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Router添加路由拦截方法讲解

    Router添加路由拦截方法讲解

    在vue项目中使用vue-router做页面跳转时,路由的方式有两种,一种是静态路由,另一种是动态路由。而要实现对路由的控制需要使用vuex和router全局守卫进行判断拦截
    2023-03-03
  • react ant protable自定义实现搜索下拉框

    react ant protable自定义实现搜索下拉框

    这篇文章主要介绍了react ant protable自定义实现搜索下拉框,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 使用Ant Design Anchor组件的一个坑及解决

    使用Ant Design Anchor组件的一个坑及解决

    这篇文章主要介绍了使用Ant Design Anchor组件的一个坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • React hooks中useState踩坑之异步的问题

    React hooks中useState踩坑之异步的问题

    这篇文章主要介绍了React hooks中useState踩坑之异步的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 详解React中函数式组件与类组件的不同

    详解React中函数式组件与类组件的不同

    React 函数式组件与类组件的主要区别在于它们的定义和声明方式以及它们之间的一些特性,所以本文就详细的给大家讲讲React中函数式组件与类组件有何不同,需要的朋友可以参考下
    2023-09-09
  • React大屏可视化脚手架教程示例

    React大屏可视化脚手架教程示例

    这篇文章主要为大家介绍了React大屏可视化脚手架教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论