【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 ...
随机推荐
- Bootstrap历练实例:响应式布局
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- js基础之语言部分必须要掌握的五大方阵
javascript基础部分可以从"数组, 函数, 作用域, 对象, 标准库"这5大方阵进行学习: (一).数组 数组的声明(2种):; a,自变量声明 var a = ['a', ...
- 已解决: mybatis报错 org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'xxx' in 'class java.lang.String'
最近在练习MyBatis时 进行姓名的模糊查询时候出现 org.apache.ibatis.exceptions.PersistenceException: ### Error querying da ...
- C++ ADL
即在一个名称作为调用运算符的左操作数时,并且这个名字是一个无限定名称时,在无限定查找到的名字集合中额外增加的一个规则使集合范围扩大(从而可以定位到其他一些限定名称),通常是用来保证定义在不同命名空间的 ...
- Vmware 不能上网
Vmware 安装 WIN7 不能上网,如何解决? 情况一: 虚拟机右下角出现红色叉号,检查物理的服务是否开启“VMware NAT Service” 1 .开启方法:WIN + R -> 输入 ...
- 【Java_Spring】java解析多层嵌套json字符串
java解析多层嵌套json字符串
- Linux下重要日志及查看方式
1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示: 图1 /var/log/boot. ...
- 使用IP访问本地网站缓慢解决方法
运行环境: win7 64位 apache2.4 php-5.6.37 最近由于业务需要,需要使用php5.6版本,所以配套升级了apache到2.4,但升级以后,发现用公司内网IP访问网站非常非常慢 ...
- 微信小程序 input组件type属性3个值的作用
input组件是小程序的内容输入框组件,通常是这样来使用的: <input type="text" placeholder="输入点内容吧" /> ...
- mysql-update时where条件无索引锁全表
1 5.3日数据处理需求 UPDATE md_meter set warranty_end_date = DATE_ADD(warranty_begin_date,INTERVAL 10 ...