React Flux 思想

文章目录

  • 一、什么是flux
  • 二、flux的组成
  • 三、flux的运作流程
  • 四、flux的缺点

一、什么是flux

flux 是 react 中的类似于 vuex 的公共状态管理方案,利用数据的单向流动的形式对公共状态进行管理。

二、flux的组成

Flux是由3个部分组成:Dispatcher,Store和View。

1、View: 视图层,负责显示用户界面

2、Action(动作):视图层发出的指令,驱动Dispatcher 的javaScript对象

3、Dispatcher(派发器):用来接收Actions、执行回调函数,要求 Store 进行相应的更新。

4、Store(数据层):存储数据和处理数据相关的逻辑,一旦发生变动,就提醒Views更新页面

三、flux的运作流程

  1. 用户与 View 层交互,触发 Action
  2. Action 使用 dispatcher.dispatch 将Action自己的状态发送给dispatcher
  3. dispatcher 通过register注册事件,再通过Action传入的类型来触发对应的 Store 回调进行更新
  4. Store 里进行相应的数据更新,并触发 View 层事件使试图也同步更新
  5. View层 收到信号进行更新

请添加图片描述

用代码的形式详细展开:

1. 用户与 View 层交互,触发 Action

组件中:

<button onClick = {this.handler.bind(this)}>更新数据</button>

2. Action 使用 dispatcher.dispatch 将Action自己的状态发送给dispatcher

实际上Action是一个对象,用来描述 一个行为,里面包含了相关的信息.Action对象包含2个部分:

  • type (类型) 一般是字符串常量,用来标记这个动作
  • payload (载荷) 一般是动作的数据

组件中:

// 步骤1 事件的回调函数
handler(){// action是一个描述,定义一个独特的常量,用来描述你的数据更改的方式。let action = {type:"NUM_ADD"};dispatcher.dispatch(action)
}

3. dispatcher 通过 dispatcher.register 注册事件,再通过Action传入的类型来触发对应的 Store 回调进行更新

dispatcher 文件中:

import {Dispatcher} from 'flux'
import store from './index'
const dispatcher = new Dispatcher();
// register方法注册事件,通过action传入的类型来触发对应的 Store 回调进行更新
dispatcher.register((action)=>{switch(action.type){case "NUM_ADD": /* 调用相应的store里定义好的方法 */store.handleAdd();break;case "Num_REDUCE":store.handleReduce()break;}
})
export default dispatcher;

Dispatcher是Flux中的黑心概念,它是一个调度中心,管理着所有的数据流,所有的事件通过它来分发。Dispatcher处理Action(动作)的分发,维护Store之间的依赖关系。负责处理View和Store之间建立Action的传递。

4. Store 里进行相应的数据更新,并触发 View 层事件使试图也同步更新

事件订阅对象的封装:Observer事件机制封装

Store在Flux中的特性是:管理所有的应用数据,只对外暴露getter方法。用于获取Store的数据.而没有暴露setter方法,说明不能通过Store修改数据,如果要修改,必须通过Action动作去触发Dispatcher实现。

只要Store发生变更,它就会使用emit()方法通知View更新并展示新的状态数据。

store文件中:

import observer from '../observer'
let store = Object.assign(observer,{state:{n:10},getState(){return this.state;},// store 中的action对应的处理方法,更新store的数据,并触发更新视图的方法handleAdd(){this.state.n ++;this.$emit("update")},
})export default store;

**Store包含应用状态和逻辑,**不同的Store管理不同的应用状态。Store负责保存数据和定义修改数据的逻辑。同时调用Dispatcher的register()方法。将自己设为监听器,每当发起一个动作(Action),去触发Dispatcher,Store的监听器就会被调用用于执行是否更新数据的操作。若更新,那么View中的状态也会获取最新状态并更新。

5. View层 收到信号进行更新

在 constructor 里用 $on 做事件订阅,并定义一个做状态更新的方法作为回调:

组件中:

// ...
// 在这里进行事件订阅,以让视图得到更新
constructor(){super();this.state = store.getState();store.$on("update",this.handleUpdate.bind(this))
}
// ...
// 事件订阅的回调,更新视图方法
handleUpdate(){this.setState(store.getState());
}

至此,在第4步中触发的方法在此执行,数据就得到了更新。一个完整的flux体系更新数据的流程就完成了。

四、flux的缺点

  1. 频繁的引入 store
  2. UI组件和容器组件的拆分过于复杂
  3. 无法对多个store进行管理
  4. 每个需更新视图的组件都需要进行更新函数的绑定
  5. … …


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部