解释一下 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. 视图重新渲染以反映最新的状态。

相关推荐

  1. 解释一下 Flux

    2024-06-16 21:44:02       33 阅读
  2. 如何使用Bison、Flex完成一个语法解析程序

    2024-06-16 21:44:02       66 阅读
  3. css之flex布局文本不换行不显示省略号的解决方法

    2024-06-16 21:44:02       45 阅读
  4. Reactor的Flux和mono

    2024-06-16 21:44:02       47 阅读
  5. 47.解释一下Spring AOP里面的几个名词

    2024-06-16 21:44:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 21:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 21:44:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 21:44:02       82 阅读
  4. Python语言-面向对象

    2024-06-16 21:44:02       91 阅读

热门阅读

  1. 从C语言到C++(五)

    2024-06-16 21:44:02       28 阅读
  2. Git与SSH

    2024-06-16 21:44:02       34 阅读
  3. Vue3 和 Vue2 对比分析及示例代码解析(初级)

    2024-06-16 21:44:02       31 阅读
  4. Web前端高级课程:深入探索与技能飞跃

    2024-06-16 21:44:02       27 阅读
  5. 常见的中间件都在解决什么问题?

    2024-06-16 21:44:02       30 阅读
  6. 大数据数仓30问

    2024-06-16 21:44:02       28 阅读
  7. rsync常用命令

    2024-06-16 21:44:02       26 阅读
  8. vue2 + echats macarons 选中样式的树状图

    2024-06-16 21:44:02       31 阅读