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. axios常见传参方式

    1:get请求 一般发送请求是这么写 axios.get('/user?id=12345&name=user') .then(function (res) { console.log(res) ...

  2. indexOf和contains查找的字符串是空字符,返回值是什么呢?

    一直以为indexOf方法查找的字符串如果不匹配返回值就是-1.今天发现空字符返回值是0.看源码原来如此,阴沟里翻船啊!

  3. Java 替换word文档文字,指定位置插入图片

    先说下 需要的依赖包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ex ...

  4. 【Python学习之九】asyncio—异步IO

    asyncio 这是python3.4引入的标准库,直接内置对异步IO的支持.asyncio的编程模型就是一个消息循环.从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程 ...

  5. Yii2.X 如何避开pathinfo不能处理中文名开头的bug

    /** * @return string original file base name */ public function getBaseName() { // https://github.co ...

  6. Matlab数据转化至python端,并写入数据库

    因工作原因,一些获取的行业数据以已知的结构体存储在.mat文件中, 现需要将其存储在数据库中并且能够灵活调用至python dataframe里进行操作 原数据的一个例子如下 目标如上: 然后是转化代 ...

  7. unix gcc编译过程

    gcc编译过程 现代编译器常见的编译过程: 源文件-->预处理-->编译/优化-->汇编-->链接-->可执行文件 对于gcc而言: 第一步 预处理       命令: ...

  8. DAG上的动态规划——嵌套矩阵问题

    问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d,或者b<c,a<d(相当于把矩形X旋 ...

  9. 遗传算法 | C++版GA_TSP

    嗯哼,时隔半年,再次有时间整理关于组合优化问题——旅行商问题(Traveling Salesman Problem, TSP),这次采用的是经典遗传算法(Genetic Algorithm, GA)进 ...

  10. 按时按登录IP记录Linux所有用户操作日志的方法(附脚本)

    PS:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...