news 2026/4/17 13:47:16

React 用 Flux 怎么管理状态?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
React 用 Flux 怎么管理状态?

前端应用的一个重要特性是状态管理。React 为其组件提供了自己的状态管理技术。React 的状态管理仅在组件级别工作。即使组件之间存在父子关系(嵌套组件),一个组件的状态也不会被另一个组件访问。为了解决这个问题,有许多第三方状态管理库,如 redux、mobx 等。

Flux 是有效管理应用状态的一种技术。Flux 由 Facebook 引入,并在它的 Web 应用中广泛使用。Flux 使用单向数据流模式来提供清晰的状态管理。在本章中,我们将学习什么是 Flux 以及如何使用它。

使用 Flux 管理状态

Flux 使用单向数据流模式。它有四个不同的部分:

Store− 顾名思义,所有业务数据都存储在 store 中。Store 执行两个过程。

  • Store 会通过从注册的 dispatcher 收集数据来自行更新其数据。Dispatcher 向 store 提供数据和相关的 action。

  • 数据更新后,store 会发出 change 数据事件,以通知 view 数据已更改。View 会监听 change 事件,并在接收到 change 事件时通过从 store 访问更新的数据来更新其视图。

Action− Action 只是要处理的操作及其必要数据的表示。View 会根据用户交互创建带有必要数据的 action,并将其发送到 dispatcher。例如,下面提到的 payload 是由 view(action creator)根据用户交互创建的,用于添加用户。

{ actionType: "add", data: { name: "Peter" } }

上述 action 将被传递给 dispatcher,后者会将信息发送到所有注册的 store。Store 会相应地更新数据,并向所有与之注册的 view 发送 change 事件。

Dispatcher− Dispatcher 接收带有正确 payload 的 action,并将其发送到所有注册的 store 以进行进一步处理。

View− View 根据用户交互创建 action 并发送到 dispatcher。它与 store 注册以获取更改,一旦通过事件接收到更改,就会用新数据更新自身。

为了 Flux 的高效工作,需要初始化以下几项:

  • 应用应使用适当的 action 及其 callback 初始化 dispatcher。

  • Store 应初始化并与 dispatcher 注册以接收数据更新。

  • View 应使用 dispatcher 和 store 初始化。View 应注册以监听 store 的更改(事件)。

Flux 架构的工作流程如下:

  • 用户交互并在 view 中触发事件。

  • View 处理事件并根据用户操作创建 action。

  • View 将 action 发送到 dispatcher。

  • Dispatcher 将 action 发布到所有与之注册的 store。

  • 注册的 store 会接收带有 payload 的 action。Store 会根据 action 更新自身。

  • Store 会向 view 发出 change 事件。

  • 监听 store 更改的 view 会使用更新后的数据更新前端。

应用 Flux

在本节中,让我们创建一个新的 React 应用来学习如何应用 Flux 概念。首先,使用以下命令创建一个新的 React 应用并启动它。

create-react-app myapp cd myapp npm start

接下来,使用 npm 安装 flux 包,如下所示 −

npm install flux --save

接下来,打开App.css(src/App.css) 并移除所有 CSS 类。

Dispatcher.js

接下来,创建一个 Flux dispatcher,即 Dispatcher (src/Flux/Dispatcher.js),如下所示 −

import {Dispatcher} from "flux"; export default new Dispatcher();

在这里,我们从 flux 包中创建了一个新的 dispatcher。

UserActions.js

接下来,创建 actions(和 action creator),即UserActions(src/Flux/UserActions.js),如下所示 −

import dispatcher from "./Dispatcher"; export const USER_ACTIONS = { ADD: 'addUser' }; export function addUser(userName) { dispatcher.dispatch({ type: USER_ACTIONS.ADD, value: { name: userName } }) }

在这里,

  • USER_ACTIONS.ADD 是一个常量,用于引用用户的添加操作。

  • addUser()是用于创建包含用户数据的 action 并将其分发到 dispatcher 的方法。

UserStore.js

接下来,创建一个 store,即UserStore(src/Flux/UserStore.js),如下所示 −

import dispatcher from "./Dispatcher"; import {EventEmitter} from "events"; import * as UserActions from "./UserActions"; class UserStore extends EventEmitter { constructor() { super(); this.users = []; } handleActions(action) { switch (action.type) { case UserActions.USER_ACTIONS.ADD: { this.users.push(action.value); this.emit("storeUpdated"); break; } default: { } } } getUsers() { return this.users; } } const userStore = new userStore(); dispatcher.register(userStore.handleActions.bind(userStore)); export default userStore;

在这里,

  • UserStore继承自EventEmitter以发出变化事件。

  • handleActions从 dispatcher 获取用户详情并更新自身(this.users)。

  • handleActions发出 store 更新事件,以通知 views store 已更新。

  • getUsers()方法将返回当前用户列表信息。

UserInput.js

接下来,创建一个用户输入组件 UserInput,用于获取新用户信息的组件,如下所示 −

import React from "react"; import * as UserActions from "./UserActions"; export default class ButtonComponent extends React.Component { constructor(props) { super(props); this.state = { username: '' } } onButtonClick = () => { UserActions.addUser(this.state.username) }; render() { return ( <div> <input name="username" onChange={(e) => this.setState({username: e.target.value})}/> <button onClick={() => this.onButtonClick()}>Add user</button> </div> ); } }

在这里,

  • 创建一个 input 元素,从用户那里获取新用户数据。

  • 添加一个按钮,将用户信息提交到 UserActions 的 addUser() 方法。

  • addUser将更新用户数据并连同适当的 action type 发送到 dispatcher。Dispatcher 将使用 action type 调用 store。Store 将更新用户列表并通知所有注册的 views。

UserList.js

接下来,创建一个用户列表组件 UserList,用于显示 store 中可用用户的组件,如下所示 −

import React from "react"; import UserStore from "./UserStore"; export default class UserList extends React.Component { constructor(props) { super(props); this.state = { users: UserStore.getUsers() } } componentDidMount() { UserStore.on("storeUpdated", this.updateUserList); } componentWillUnmount() { UserStore.removeListener("storeUpdated", this.updateUserList); } updateUserList = () => { this.setState({users: UserStore.getUsers()}) }; render() { return ( <ul>{ this.state.users && this.state.users.length > 0 && this.state.users.map((items) => <li>{items.name}</li>) } </ul> ); } }

在这里,

  • componentDidMount通过 UserStore.on 方法注册 store 事件(storeUpdated)。

  • componentWillUnmount通过 UserStore.removeListener 方法注销 store 事件(storeUpdated)。

  • updateUserList从 store 获取最新的用户数据并更新自身的 state。

  • render方法从其 state(this.state.users)渲染用户列表。

App.js

接下来,打开 App 组件 (src/App.js),并使用UserInputUserList组件,如下所示 −

import './App.css' import React, { Suspense, lazy } from 'react'; import UserInput from './Flux/UserInput'; import UserList from './Flux/UserList'; function App() { return ( <div className="container"> <div style={{ padding: "10px" }}> <div> <UserInput /> <UserList /> </div> </div> </div> ); } export default App;

在这里,

  • UserInput用于从用户获取信息。

  • UserList将从 store 获取最新的用户列表并渲染它。

最后,在浏览器中打开应用并检查最终结果。最初,用户列表将为空。一旦用户输入用户名并提交,下面列表将显示更新的用户列表,如下所示 −

总结

Flux 是 React 应用的一种简单、单向的状态管理模式。它有助于降低 React 应用的复杂性。它通过 dispatcher 以透明的方式连接 views 和 stores。React 社区增强了 Flux 模式,并发布了大量成熟的状态管理库(如 Redux),这些库更强大且易于使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:44:30

Obsidian终极B站视频播放指南:Media Extended B站插件完整教程

Obsidian终极B站视频播放指南&#xff1a;Media Extended B站插件完整教程 【免费下载链接】mx-bili-plugin 项目地址: https://gitcode.com/gh_mirrors/mx/mx-bili-plugin 你是否想在Obsidian笔记中直接嵌入B站视频&#xff0c;实现学习笔记与视频内容的完美结合&…

作者头像 李华
网站建设 2026/4/17 13:43:16

TIOBE编程语言历史数据分析报告(2015–2025)_AI_REPORT

TECH TIOBE编程语言历史数据分析报告&#xff08;2015–2025&#xff09; 2026年4月16日 1. 数据来源和方法说明 本报告的数据来源于TIOBE编程语言指数&#xff08;TIOBE Programming Community Index&#xff09;发布的2015年至2025年历史数据。TIOBE指数通过统计全球范围…

作者头像 李华
网站建设 2026/4/17 13:43:14

生成式AI用户画像构建全流程拆解(从冷启动到实时更新的8大技术断点)

第一章&#xff1a;生成式AI应用用户画像构建 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用的用户画像已不再局限于传统人口统计与行为日志的静态聚合&#xff0c;而是演进为融合多模态交互痕迹、提示工程偏好、响应反馈强度及上下文适应性的动态表征体系。用户…

作者头像 李华
网站建设 2026/4/17 13:42:14

从原理到选型:一文读懂天线核心参数与工程应用

1. 天线基础原理&#xff1a;从电磁波到辐射效率 天线作为无线通信系统的"嘴巴"和"耳朵"&#xff0c;其核心功能是实现电磁波与电信号的相互转换。想象一下你对着山谷大喊时声音传播的场景——天线的工作原理与之类似&#xff0c;只不过它处理的是看不见的…

作者头像 李华
网站建设 2026/4/17 13:35:13

BilibiliDown:跨平台B站视频下载解决方案全面解析

BilibiliDown&#xff1a;跨平台B站视频下载解决方案全面解析 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bi…

作者头像 李华
网站建设 2026/4/17 13:34:33

从智商测试到能力评估:如何设计更公平的现代人才选拔体系

1. 智商测试的局限性&#xff1a;为什么我们需要更公平的评估体系 传统的智商测试已经存在了近一个世纪&#xff0c;它们最初被设计用来预测学生在学术环境中的表现。但现实世界远比教室复杂得多。我在人力资源部门工作的十年里&#xff0c;见过太多高智商候选人在实际工作中表…

作者头像 李华