React

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > React > React  Redux 单向数据流

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

作者:漠月瑾

本文彻底剖析 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 连接起来:

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

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

4.1 不可变数据(Immutability)

4.2 纯函数(Pure Function)

五、 总结:闭环的意义

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

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

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

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

您可能感兴趣的文章:
阅读全文