Flux 是 Facebook 使用的一套前端应用的架构模式。React 标榜自己是 MVC 里面 V 的部分,那么 Flux 就相当于添加 M 和 C 的部分。

1.1.  Flux介绍

Flux并不是一项新的技术,而是一种架构模式,一个Flux应用由四个部分:

View: 视图层(组件)

Action(动作):视图层发出的消息(比如mouseClick)

{
type:’save’,
payload:’明天不能休息,自己在家把react弄一弄’
}

Dispatcher(派发器):用来接收Actions、执行回调函数

if(action.type==’save’){

//执行保存代码。。。。。

store.add(xxxx);

store.emit(‘change’);

}

Store(数据层):用来存放应用的状态(数据),一旦发生变动,就提醒Views要更新页面

Flux 的最大特点:以单向数据流方式支持MVC,Flux执行流程:

1、一个Action由系统或View 层通过用户交互触发;

2、Dispatcher 会分发触发的 Action 给所有注册的 Store 的回调函数;

3、Store 回调函数根据接收的 Action 更新自身数据之后会触发一个 change 事件通知 View 数据更改了;

4、View 会监听这个 change 事件,拿到对应的新数据并调用 setState 更新组件 UI;

Action -> Dispatcher -> Store -> View

View->Action -> Dispatcher -> Store -> View

1.2.  Flux安装

npm i flux -save

1.3.  Flux View

Flux中的View其实就是React中的组件,与我们以前编写的组件没有任何区别。

index.js 入门文件

import React from 'react';
import ReactDOM from 'react-dom';
import TodoApp from './flux/TodoApp'; ReactDOM.render(
<TodoApp />,
document.getElementById('app')
);

TodoApp 主应用组件

import React from 'react';
import TextInput from './TextInput';
import TodoList from './TodoList';
class TodoApp extends React.Component{
constructor(){
super();
this.state = {
datas : [12,123,123]
};
}
render(){
return (
<div>
<TextInput />
<TodoList datas={this.state.datas} />
</div>
);
} }
export default TodoApp;

  

TextInput.js 备忘录输入框组件

import React from 'react';
// 备忘录,用户输入内容,按下回车键保存数据
class TextInput extends React.Component{
constructor(){
super();
this.state ={value:""};
}
//键盘按下回车键
_onKeyDown(event){
//判断是否是回车键
if(event.keyCode == 13){
//保存到本地 //清空输入框
this.setState({
value:""
});
}
} _onChange(event){
this.setState({
value:event.target.value
});
}
render(){
return (
<div>
<input type="text" name="username" onChange={this._onChange.bind(this)} onKeyDown={this._onKeyDown.bind(this)} value={this.state.value}/>
</div>
);
}
}
export default TextInput;

TodoList.js 备忘录列表

import React from 'react';
class TodoList extends React.Component{
constructor(){
super();
}
render(){
var datas = this.props.datas;
var lis = datas.map(function(data,index){
return <li key={index}>{data}</li>;
});
return (
<ul>
{lis}
</ul>
);
}
} export default TodoList;

1.4.  Flux Dispatcher

一个应用只需要一个 dispatcher 作为分发中心,管理所有数据流向,分发action给 Store,没有太多其他的逻辑(一些 action creator 方法也可以放到这里)。Facebook官方的 Dispatcher 实现输出一个类,你要写一个AppDispatcher.js,生成 Dispatcher 实例。

//AppDispatcher.js
//Dispatcher分发器,管理所有数据流向,分发动作给 Store。
var Dispatcher = require('flux').Dispatcher;
export default new Dispatcher();

1.5.  Flux Action

Action:应用中的一个动作,比如“添加”,“删除”...

首先要创建动作,通过定义一些 action creator(动作创建者)方法来创建,这些方法用来暴露给外部调用,通过 dispatch 分发对应的动作,所以 action creator 也称作 dispatcher helper methods 辅助 dipatcher 分发.

TodoActions.js

import React from 'react';
import AppDispatcher from './AppDispatcherAppDispatcher'; var TodoActions = {
todoAddItem:function(text){ //创建action动作,然后通过AppDispatcher分发到store进行数据处理
AppDispatcher.dispatch({
actionType : 'todo_addItem',
text : text
}); },
destroy:function(){
AppDispatcher.dispatch({
actionType : 'todo_removItem'
}); }
};
export default TodoActions;

有了action creator(动作创造者)我们就可以View中触发这些动作。

TextInput.js

 _onKeyDown(event){
//判断是否是回车键
if(event.keyCode == 13){
//保存到本地(调用action)
TodoAction.todoAddItem(this.state.value);
//清空输入框
this.setState({
value:""
});
}
}

1.6.  Flux Store

Flux四个部分,已经完成了三个,但是现在还没有地方处理我们的数据。

View:视图,数据交互(输入、输出),触发动作。

Dispatcher:分发器,把动作发送给响应的Store处理。

Action:动作,描述动作的类型和动作的数据。

Store:管理整个应用的状态数据(对数据进行实际操作)。

mport {EventEmitter} from 'events';
//由于 Store 需要在变动后向 View 发送"change"事件,因此它必须实现事件接口。
//Object.assign 对象拷贝。 多个源对象(第二参数开始对象)的拷贝给目标对象(第一个参数对象)
var TodoStore = Object.assign({},EventEmitter.prototype,{
items: [],
getData: function() {
return this.items;
},
addItem: function (text) {
this.items.push(text);
},
emitChange: function () {
this.emit('change');
},
addChangeListener: function(callback) {
this.on('change', callback);
},
removeChangeListener: function(callback) {
this.removeListener('change', callback);
}
}); export default TodoStore;
//ListStore.items用来保存条目,ListStore.getAll()用来读取所有条目,ListStore.emitChange()用来发出一个"change"事件。

最后一步:注册到 dispatcher,通过动作类型过滤处理当前 Store 关联的动作

import AppDispatcher from './AppDispatcher';
//最后一步:注册到 dispatcher,通过动作类型过滤处理当前 Store 关联的动作
AppDispatcher.register(function(action){
switch(action.actionType){
case 'todo_addItem':
TodoStore.addItem(action.text);//调用Store方法进行数据操作
TodoStore.emitChange();//触发修改事件,通知view更新状态
break;
}
});

1.7.  Flux完结

import React from 'react';
import TextInput from './TextInput';
import TodoList from './TodoList';
import TodoStore from './TodoStore'
class TodoApp extends React.Component{
constructor(){
super();
this.state = {
datas : TodoStore.getData()
};
}
_onChange(){
his.setState({datas : TodoStore.getData()});
}
componentDidMount(){
TodoStore.addChangeListener(this._onChange.bind(this));
}
componentWillUnmount(){
TodoStore.removeChangeListener(this._onChange.bind(this));
}
render(){
return (
<div>
                  <TextInput />
                     <TodoList datas={this.state.datas} />
                 </div> ); } } export default TodoApp;

  

【11】react 之 flux的更多相关文章

  1. 使用 React 和 Flux 创建一个记事本应用

    React,来自 Facebook,是一个用来创建用户界面的非常优秀的类库.唯一的问题是 React 不会关注于你的应用如何处理数据.大多数人把 React 当做 MV* 中的 V.所以,Facebo ...

  2. 【转】浅谈React、Flux 与 Redux

    本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成 ...

  3. react及flux架构范例Todomvc分析

    react及flux架构范例Todomvc分析 通过分析flux-todomvc源码,学习如何通过react构建web程序,了解编写react应用程序的一般步骤,同时掌握Flux的单向数据流动架构思想 ...

  4. 理顺react,flux,redux这些概念的关系

    作者:北溟小鱼hk链接:https://www.zhihu.com/question/47686258/answer/107209140来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  5. [React] 07 - Flux: uni-flow for react

    相关资源 Ref: [Android Module] 03 - Software Design and Architecture Ref: Flux 架构入门教程 Ref: 详解React Flux架 ...

  6. 浅谈 React、Flux 与 Redux

    React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化利用 props 形成单向的数据流根据 state 的变化来更新 view利用虚拟 DOM 来提升渲染性能 ...

  7. React: 研究Flux设计模式

    一.简介 一般来说,State管理在React中是一种最常用的实现机制,使用这种state管理系统基本可以开发各种需求的应用程序.然而,随着应用程序规模的不断扩张,原有的这种State管理系统就会暴露 ...

  8. react 之 flux

    [WangQi]---flux---[react]   一.什么是Flux Flux 是一种架构思想,专门解决软件的结构问题.它跟MVC 架构是同一类东西,但是更加简单和清晰. 二.flux的基本概念 ...

  9. 【react redux && flux】

    redux: http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.html https://bai ...

随机推荐

  1. GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发

    在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问. 可以 ...

  2. 3_HA介绍和安装部署

    一.hadoop 2.x产生背景 1.hadoop 1.x中hdfs和mr在高可用和扩展性等方面存在问题.2.hdfs存在的问题:NN单点故障,难以应用于在线场景:NN压力过大,内存受限,影响系统扩展 ...

  3. 自动化运维工具——ansible剧本playbook(三)

    一.Playbook--Ansible剧本 playbook是由一个或多个 "play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的ta ...

  4. PHP 对象基础知识

    最近开始重新学习对象知识,其实也算是初步深入学习对象和设计模式,希望自己会坚持下去,保持更新 初识PHP对象 还记得,刚开始学习 PHP 的时候,学到到方法和对象时有一个很大的疑问,对象与方法相比较那 ...

  5. Centos7多内核情况下修改默认启动内核方法

    1.1  进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ...

  6. javascript sprintf方法

    转载自: http://demon.tw/programming/javascript-sprintf.html function str_repeat(i, m) { for (var o = [] ...

  7. yii2 RUL的生成

    通常情况下,会使用 yii\helpers\Url 使用Url类来生成想要的URL地址(链接) Url提供的方法大都是静态方法,不需要对类进行实例化 1.1 最常用的 Url::to() 1.2. b ...

  8. mysql-copy to tmp table

    今天数据后台数据反映有些迟缓后查看链接 processlist 发下好多 锁 和磁盘写入,   参考文章 : http://bbs.chinaunix.net/forum.php?mod=viewth ...

  9. CSU 1326: The contest(分组背包)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意: n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时做 ...

  10. 免费生成https证书以及配置

    http升级到https需要在nginx的配置中加入证书信息,查询资料后确定生成证书两种方案   第一种:自签名证书,然后开启 CloudFlare 的 CDN 服务   //确定是否安装openss ...