解释一下 Flux

2024-06-16 21:36
文章标签 flux 解释一下

本文主要是介绍解释一下 Flux,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Flux 是 Facebook 提出的应用架构模式,用于管理 React 应用中的数据流和状态。它强调单向数据流,以解决复杂应用中数据和视图不一致的问题。Flux 不是一个具体的库或框架,而是一种设计模式,围绕以下几个核心概念:

  1. Action(动作)

    • 动作是描述应用中发生事件的普通 JavaScript 对象。每个动作都有一个类型(type)属性,以及携带的数据(payload)。动作用于将数据从视图传递到存储。

    javascript复制代码const action = {type: 'ADD_TODO',payload: { text: 'Learn Flux' }
    };
  2. Dispatcher(调度器)

    • 调度器是一个中心集线器,用于将动作分发到存储。它注册所有存储,并将收到的每个动作传递给所有存储。调度器没有太多逻辑,只负责分发动作。

    javascript复制代码import { Dispatcher } from 'flux';
    ​
    const dispatcher = new Dispatcher();
    dispatcher.dispatch(action);
  3. Store(存储)

    • 存储是应用状态和逻辑的容器。每个存储管理一个特定领域的数据和逻辑。存储响应调度器分发的动作,更新状态,并通知视图发生了变化。存储不能直接修改,必须通过分发动作来更新。

    javascript复制代码import { EventEmitter } from 'events';
    ​
    class TodoStore extends EventEmitter {constructor() {super();this.todos = [];}
    ​handleActions(action) {switch (action.type) {case 'ADD_TODO':this.todos.push(action.payload);this.emit('change');break;// 处理其他动作}}
    ​getAll() {return this.todos;}
    }
    ​
    const todoStore = new TodoStore();
    dispatcher.register(todoStore.handleActions.bind(todoStore));
  4. View(视图)

    • 视图是展示数据的 React 组件。视图监听存储的变化,并根据存储的状态重新渲染自己。视图还可以分发动作来修改存储中的状态。

    javascript复制代码import React, { Component } from 'react';
    import todoStore from './TodoStore'; // 假设存储已导出
    import dispatcher from './dispatcher'; // 假设调度器已导出
    ​
    class TodoApp extends Component {constructor() {super();this.state = {todos: todoStore.getAll()};}
    ​componentDidMount() {todoStore.on('change', this.handleChange);}
    ​componentWillUnmount() {todoStore.removeListener('change', this.handleChange);}
    ​handleChange = () => {this.setState({todos: todoStore.getAll()});};
    ​handleAddTodo = () => {const action = {type: 'ADD_TODO',payload: { text: 'Learn Flux' }};dispatcher.dispatch(action);};
    ​render() {return (<div><button onClick={this.handleAddTodo}>Add Todo</button><ul>{this.state.todos.map((todo, index) => (<li key={index}>{todo.text}</li>))}</ul></div>);}
    }
    ​
    export default TodoApp;

单向数据流

Flux 是 Facebook 提出的应用架构模式,用于管理 React 应用中的数据流和状态。它强调单向数据流,以解决复杂应用中数据和视图不一致的问题。Flux 不是一个具体的库或框架,而是一种设计模式,围绕以下几个核心概念:

  1. Action(动作)

    • 动作是描述应用中发生事件的普通 JavaScript 对象。每个动作都有一个类型(type)属性,以及携带的数据(payload)。动作用于将数据从视图传递到存储。

    javascript复制代码const action = {type: 'ADD_TODO',payload: { text: 'Learn Flux' }
    };
  2. Dispatcher(调度器)

    • 调度器是一个中心集线器,用于将动作分发到存储。它注册所有存储,并将收到的每个动作传递给所有存储。调度器没有太多逻辑,只负责分发动作。

    javascript复制代码import { Dispatcher } from 'flux';
    ​
    const dispatcher = new Dispatcher();
    dispatcher.dispatch(action);
  3. Store(存储)

    • 存储是应用状态和逻辑的容器。每个存储管理一个特定领域的数据和逻辑。存储响应调度器分发的动作,更新状态,并通知视图发生了变化。存储不能直接修改,必须通过分发动作来更新。

    javascript复制代码import { EventEmitter } from 'events';
    ​
    class TodoStore extends EventEmitter {constructor() {super();this.todos = [];}
    ​handleActions(action) {switch (action.type) {case 'ADD_TODO':this.todos.push(action.payload);this.emit('change');break;// 处理其他动作}}
    ​getAll() {return this.todos;}
    }
    ​
    const todoStore = new TodoStore();
    dispatcher.register(todoStore.handleActions.bind(todoStore));
  4. View(视图)

    • 视图是展示数据的 React 组件。视图监听存储的变化,并根据存储的状态重新渲染自己。视图还可以分发动作来修改存储中的状态。

    javascript复制代码import React, { Component } from 'react';
    import todoStore from './TodoStore'; // 假设存储已导出
    import dispatcher from './dispatcher'; // 假设调度器已导出
    ​
    class TodoApp extends Component {constructor() {super();this.state = {todos: todoStore.getAll()};}
    ​componentDidMount() {todoStore.on('change', this.handleChange);}
    ​componentWillUnmount() {todoStore.removeListener('change', this.handleChange);}
    ​handleChange = () => {this.setState({todos: todoStore.getAll()});};
    ​handleAddTodo = () => {const action = {type: 'ADD_TODO',payload: { text: 'Learn Flux' }};dispatcher.dispatch(action);};
    ​render() {return (<div><button onClick={this.handleAddTodo}>Add Todo</button><ul>{this.state.todos.map((todo, index) => (<li key={index}>{todo.text}</li>))}</ul></div>);}
    }
    ​
    export default TodoApp;

Flux 架构的核心思想是单向数据流。数据流动的过程如下:

  1. 用户在视图中触发事件(例如点击按钮)。

  2. 视图分发一个动作到调度器。

  3. 调度器将动作分发到所有注册的存储。

  4. 存储根据动作更新状态,并通知视图发生了变化。

  5. 视图重新渲染以反映最新的状态。

这篇关于解释一下 Flux的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067615

相关文章

彻底征服 React.js + Flux + Redux【讲师辅导】-曾亮-专题视频课程

彻底征服 React.js + Flux + Redux【讲师辅导】—74574人已学习 课程介绍         【会员免费】链接 http://edu.csdn.net/lecturer/585 右侧办理会员卡。办会员卡可咨询 QQ 1405491181 。 会员可免费学习已发布的全部课程,和在会员有效期内讲师新发布的全部课程 ,承诺每个月至少增加价值500元+ 的新课程。 R

iOS Runloop面试题(利用 runloop 解释一下页面的渲染的过程?)

利用 runloop 解释一下页面的渲染的过程? 当我们调用 [UIView setNeedsDisplay] 时,这时会调用当前 View.layer 的 [view.layer setNeedsDisplay]方法。 这等于给当前的 layer 打上了一个脏标记,而此时并没有直接进行绘制工作。而是会到当前的 Runloop 即将休眠,也就是 beforeWaiting 时才会进行绘制工作。

iOS Runloop面试题(解释一下 手势识别 的过程?)

解释一下 手势识别 的过程? 当上面的 _UIApplicationHandleEventQueue()识别了一个手势时,其首先会调用 Cancel 将当前的 touchesBegin/Move/End 系列回调打断。随后系统将对应的 UIGestureRecognizer 标记为待处理。 苹果注册了一个 Observer 监测 BeforeWaiting (Loop即将进入休眠) 事件,这个

iOS Runloop面试题(解释一下 `事件响应` 的过程?)

解释一下 事件响应 的过程? 苹果注册了一个 Source1 (基于 mach port 的) 用来接收系统事件,其回调函数为 __IOHIDEventSystemClientQueueCallback()。 当一个硬件事件(触摸/锁屏/摇晃等)发生后,首先由 IOKit.framework 生成一个 IOHIDEvent 事件并由 SpringBoard 接收。这个过程的详细情况可以参考这里

iOS Runloop面试题(解释一下 NSTimer。)

解释一下 NSTimer。 NSTimer 其实就是 CFRunLoopTimerRef,他们之间是 toll-free bridged 的。一个 NSTimer 注册到 RunLoop后,RunLoop 会为其重复的时间点注册好事件。例如 10:00, 10:10, 10:20 这几个时间点。RunLoop 为了节省资源,并不会在非常准确的时间点回调这个Timer。Timer 有个属性叫做 T

2.3 解释一下python的 and-or 语法

So: python 的and-or语法 bool and a or b 就相当于bool? a: b 但是特殊情况是,若a为假,则不会相当于,而是返回b 解决办法:用 (bool and [a] or [b])[0]代替 当然,负责人的话,就将 (bool and [a] or [b])[0]封装成一个函数啦~ 一、http://www.kuqin.com/diveinto_pyt

docker镜像是什么意思,如何通俗点的解释一下

Docker镜像(Docker Image)可以通俗地理解为一个包含应用程序及其运行环境的“模版”或“快照”。这些镜像是应用程序在Docker容器中运行的基础。以下是一个更详细的解释: 通俗解释 软件快照:想象你有一个操作系统、几个软件和一些配置文件,这些都组合成了一个工作环境。Docker镜像就像是对这个工作环境的快照,保存了它的所有内容。 预装软件的计算机:想象你买了

解释一下I/O多路复用模型?

想象一下,你是一家小餐馆的老板,你的工作是接收顾客的订单,然后通知厨师开始准备。如果每次只能等一个顾客点完菜再接待下一个,那效率就太低了,顾客可能要等很久。 现在,有一种聪明的做法叫做“I/O多路复用”。你可以这样想: 你不再是一个个接待顾客,而是让所有顾客一起告诉你他们想要什么。你手里拿着一个神奇的本子(这就是多路复用器),能同时听到每个顾客的声音。你让大家都先别急,一个个地说出他们的点餐要

Java面试题:解释一下Java中的线程状态转换,包括新建、就绪、阻塞、运行和死亡状态

在Java中,线程在其生命周期中会经历不同的状态。了解这些状态及其转换对于编写高效且无死锁的多线程程序至关重要。以下是Java线程的五个主要状态及其转换: 新建(New): 线程对象创建后,线程处于新建状态。此时,线程还未启动。 就绪(Runnable): 当线程对象调用了start()方法后,线程进入就绪状态。在就绪状态下,线程等待JVM调度并获得CPU时间片以便开始执行。新建状态的线程不

Java面试题:解释一下Java中的synchronized关键字,它是如何保证线程安全的?

在Java中,synchronized关键字是一种同步锁机制,用于确保多个线程在访问共享资源时能够保持线程安全。线程安全是指在多线程环境下,当多个线程尝试同时访问共享资源时,任何时刻最多只有一个线程能够执行特定的代码段。 synchronized关键字可以用于以下几个方面: 方法同步: 当synchronized关键字用于方法声明时,整个方法体都是同步的。这意味着同一时间只能有一个线程执行该