一、Flux基本概念
Flux是Facebook用于构建客户端Web应用程序的一种架构模式。它主要是为了解决单向数据流动的问题,是一种和MVC(Model - View - Controller)等模式不同的应用架构理念。
核心目标
- Flux的核心目标是通过严格的单向数据流来使应用的状态管理更加可预测。在复杂的JavaScript应用中,尤其是涉及到大量的用户交互和动态数据更新的情况下,数据的流动如果不加以规范,很容易导致混乱,比如难以追踪数据的变化源头、出现意外的UI更新等问题。Flux通过单向数据流来避免这些问题。
组成部分
- Dispatcher(调度器):它是Flux架构的中心枢纽。所有的数据变更请求都要通过Dispatcher来分发。例如,在一个简单的待办事项应用中,当用户添加一个新的待办事项时,这个“添加”操作的请求会被发送到Dispatcher。它接收来自视图(View)发出的各种动作(Action),并将这些动作分发给对应的存储(Store)。Dispatcher可以被看作是一个交通警察,指挥着各种动作消息的流向。
- Stores(存储):Stores包含了应用的状态和业务逻辑。它们负责保存数据,并对数据进行处理。继续以待办事项应用为例,一个待办事项的Store会保存所有的待办事项列表。当Dispatcher分发一个“添加待办事项”的动作时,待办事项Store会根据这个动作来更新自己内部保存的待办事项列表。Stores在更新数据后,会发出一个“change”事件来通知视图(View)数据已经发生了改变。
- Views(视图):视图是用户界面的呈现部分。它监听Stores发出的“change”事件,当接收到事件后,会从Stores获取最新的数据来更新自己的显示内容。在一个基于React构建的Flux应用中,React组件通常扮演着视图的角色。例如,一个显示待办事项列表的React组件会在收到Store的“change”事件后,重新获取待办事项列表数据,并重新渲染自己,将最新的待办事项列表展示给用户。
- Actions(动作):它是一个简单的JavaScript对象,包含一个动作类型(type)和一些可能的数据(payload)。动作通常是由视图(View)根据用户交互(如点击按钮、输入文字等)产生的。比如在待办事项应用中,一个“添加待办事项”的动作可能是{type: 'ADD_TODO', payload: '买牛奶'},其中“ADD_TODO”是动作类型,“买牛奶”是动作携带的数据。这些动作会被发送到Dispatcher,从而触发整个数据更新流程。
二、单向数据流示例
以一个简单的计数器应用为例来解释Flux的单向数据流。
- 用户交互阶段
- 当用户在视图(View)中点击一个“增加计数”的按钮时,视图会创建一个“INCREMENT_COUNT”类型的动作(Action),这个动作包含了关于增加计数的信息。
- 调度阶段
- 视图(View)会将这个动作发送到Dispatcher。Dispatcher接收到动作后,会查找注册了该类型动作的Stores,并将动作分发给它们。
- 存储更新阶段
- 计数器的Store接收到“INCREMENT_COUNT”动作后,会根据这个动作来更新自己内部保存的计数状态。比如,将当前计数加1。在更新完状态后,Store会发出一个“change”事件,表示数据已经发生了改变。
- 视图更新阶段
- 视图(View)监听到Store发出的“change”事件,会从Store获取最新的计数数据,然后更新自己的显示内容。这样,用户就能在界面上看到计数已经增加了。
这种单向数据流的好处是,数据的变化路径非常清晰。可以很容易地追踪数据是如何从用户交互产生动作,经过调度和存储更新,最后反映到视图上的。同时,由于数据的流动是单向的,避免了在复杂应用中可能出现的双向数据绑定导致的数据混乱问题。