【11】react 之 flux
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的更多相关文章
- 使用 React 和 Flux 创建一个记事本应用
React,来自 Facebook,是一个用来创建用户界面的非常优秀的类库.唯一的问题是 React 不会关注于你的应用如何处理数据.大多数人把 React 当做 MV* 中的 V.所以,Facebo ...
- 【转】浅谈React、Flux 与 Redux
本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成 ...
- react及flux架构范例Todomvc分析
react及flux架构范例Todomvc分析 通过分析flux-todomvc源码,学习如何通过react构建web程序,了解编写react应用程序的一般步骤,同时掌握Flux的单向数据流动架构思想 ...
- 理顺react,flux,redux这些概念的关系
作者:北溟小鱼hk链接:https://www.zhihu.com/question/47686258/answer/107209140来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- [React] 07 - Flux: uni-flow for react
相关资源 Ref: [Android Module] 03 - Software Design and Architecture Ref: Flux 架构入门教程 Ref: 详解React Flux架 ...
- 浅谈 React、Flux 与 Redux
React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化利用 props 形成单向的数据流根据 state 的变化来更新 view利用虚拟 DOM 来提升渲染性能 ...
- React: 研究Flux设计模式
一.简介 一般来说,State管理在React中是一种最常用的实现机制,使用这种state管理系统基本可以开发各种需求的应用程序.然而,随着应用程序规模的不断扩张,原有的这种State管理系统就会暴露 ...
- react 之 flux
[WangQi]---flux---[react] 一.什么是Flux Flux 是一种架构思想,专门解决软件的结构问题.它跟MVC 架构是同一类东西,但是更加简单和清晰. 二.flux的基本概念 ...
- 【react redux && flux】
redux: http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.html https://bai ...
随机推荐
- python 读取mat文件
import osimport scipy.io as sio import numpy as np #matlab文件名 matfn='/home/user/devkit/data/meta_det ...
- java: 非法字符: \65279
IDEA导入项目后,编译的时候出现Error:(1, 1) java: 非法字符: \65279: 修改:找到编译报错的文件,用Notepad++工具,以UTF-8无BOM格式编码保存,然后重新编译即 ...
- 1037: [ZJOI2008]生日聚会Party
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3121 Solved: 1858[Submit][Status][Discuss] Descript ...
- JDK和CGLIB动态代理原理区别
JDK和CGLIB动态代理原理区别 https://blog.csdn.net/yhl_jxy/article/details/80635012 2018年06月09日 18:34:17 阅读数:65 ...
- thinkphp3.2.3如何只改变地址url中的某一个分隔符,其它保持不变
今天教大家一个关于使用thinkphp3.2.3改变只改变地址url中的某一个分隔符的方法,首先大家来看看这个地址! 它的原始地址应该是/Home/Index/index/page/2.html,那我 ...
- 本地Navicat连接虚拟机MySQL
安装完MySQL后,使用mysql命令进去,然后执行以下命令 grant all privileges on hive_metadata.* to 'hive'@'%' identified by ' ...
- LCS及方案数(DP)
Description 对于一个序列
- Codeforces 678F Lena and Queries
题意: 你有一个点集,有三种操作: 往集合里插入一个点\((x, y)\) 从集合中删除第\(i\)次操作插入的点 对于给出的\(q\),询问点集中\(x \cdot q + y\)的最大值 分析: ...
- Python虚拟机类机制之instance对象(六)
instance对象中的__dict__ 在Python虚拟机类机制之从class对象到instance对象(五)这一章中最后的属性访问算法中,我们看到“a.__dict__”这样的形式. # 首先寻 ...
- 动态加载css,js
function dynamicLoadCss(url) { var head = document.getElementsByTagName('head')[0]; var link = docum ...