React-Flux 介绍及实例演示

一、Flux架构

二、例子

1.TodoApp.react.js

 1 /**
 2  * Copyright (c) 2014-2015, Facebook, Inc.
 3  * All rights reserved.
 4  *
 5  * This source code is licensed under the BSD-style license found in the
 6  * LICENSE file in the root directory of this source tree. An additional grant
 7  * of patent rights can be found in the PATENTS file in the same directory.
 8  */
 9
10 /**
11  * This component operates as a "Controller-View".  It listens for changes in
12  * the TodoStore and passes the new data to its children.
13  */
14
15 var Footer = require(‘./Footer.react‘);
16 var Header = require(‘./Header.react‘);
17 var MainSection = require(‘./MainSection.react‘);
18 var React = require(‘react‘);
19 var TodoStore = require(‘../stores/TodoStore‘);
20
21 /**
22  * Retrieve the current TODO data from the TodoStore
23  */
24 function getTodoState() {
25   return {
26     allTodos: TodoStore.getAll(),
27     areAllComplete: TodoStore.areAllComplete()
28   };
29 }
30
31 var TodoApp = React.createClass({
32
33   getInitialState: function() {
34     return getTodoState();
35   },
36
37   componentDidMount: function() {
38     TodoStore.addChangeListener(this._onChange);
39   },
40
41   componentWillUnmount: function() {
42     TodoStore.removeChangeListener(this._onChange);
43   },
44
45   /**
46    * @return {object}
47    */
48   render: function() {
49     return (
50       <div>
51         <Header />
52         <MainSection
53           allTodos={this.state.allTodos}
54           areAllComplete={this.state.areAllComplete}
55         />
56         <Footer allTodos={this.state.allTodos} />
57       </div>
58     );
59   },
60
61   /**
62    * Event handler for ‘change‘ events coming from the TodoStore
63    */
64   _onChange: function() {
65     this.setState(getTodoState());
66   }
67
68 });
69
70 module.exports = TodoApp;

2.TodoActions.js

 1 /*
 2  * Copyright (c) 2014-2015, Facebook, Inc.
 3  * All rights reserved.
 4  *
 5  * This source code is licensed under the BSD-style license found in the
 6  * LICENSE file in the root directory of this source tree. An additional grant
 7  * of patent rights can be found in the PATENTS file in the same directory.
 8  *
 9  * TodoActions
10  */
11
12 var AppDispatcher = require(‘../dispatcher/AppDispatcher‘);
13 var TodoConstants = require(‘../constants/TodoConstants‘);
14
15 var TodoActions = {
16
17   /**
18    * @param  {string} text
19    */
20   create: function(text) {
21     AppDispatcher.dispatch({
22       actionType: TodoConstants.TODO_CREATE,
23       text: text
24     });
25   },
26
27   /**
28    * @param  {string} id The ID of the ToDo item
29    * @param  {string} text
30    */
31   updateText: function(id, text) {
32     AppDispatcher.dispatch({
33       actionType: TodoConstants.TODO_UPDATE_TEXT,
34       id: id,
35       text: text
36     });
37   },
38
39   /**
40    * Toggle whether a single ToDo is complete
41    * @param  {object} todo
42    */
43   toggleComplete: function(todo) {
44     var id = todo.id;
45     var actionType = todo.complete ?
46         TodoConstants.TODO_UNDO_COMPLETE :
47         TodoConstants.TODO_COMPLETE;
48
49     AppDispatcher.dispatch({
50       actionType: actionType,
51       id: id
52     });
53   },
54
55   /**
56    * Mark all ToDos as complete
57    */
58   toggleCompleteAll: function() {
59     AppDispatcher.dispatch({
60       actionType: TodoConstants.TODO_TOGGLE_COMPLETE_ALL
61     });
62   },
63
64   /**
65    * @param  {string} id
66    */
67   destroy: function(id) {
68     AppDispatcher.dispatch({
69       actionType: TodoConstants.TODO_DESTROY,
70       id: id
71     });
72   },
73
74   /**
75    * Delete all the completed ToDos
76    */
77   destroyCompleted: function() {
78     AppDispatcher.dispatch({
79       actionType: TodoConstants.TODO_DESTROY_COMPLETED
80     });
81   }
82
83 };
84
85 module.exports = TodoActions;

3.AppDispatcher.js

 1 /*
 2  * Copyright (c) 2014-2015, Facebook, Inc.
 3  * All rights reserved.
 4  *
 5  * This source code is licensed under the BSD-style license found in the
 6  * LICENSE file in the root directory of this source tree. An additional grant
 7  * of patent rights can be found in the PATENTS file in the same directory.
 8  *
 9  * AppDispatcher
10  *
11  * A singleton that operates as the central hub for application updates.
12  */
13
14 var Dispatcher = require(‘flux‘).Dispatcher;
15
16 module.exports = new Dispatcher();

4.TodoStore.js

  1 /*
  2  * Copyright (c) 2014, Facebook, Inc.
  3  * All rights reserved.
  4  *
  5  * This source code is licensed under the BSD-style license found in the
  6  * LICENSE file in the root directory of this source tree. An additional grant
  7  * of patent rights can be found in the PATENTS file in the same directory.
  8  *
  9  * TodoStore
 10  */
 11
 12 var AppDispatcher = require(‘../dispatcher/AppDispatcher‘);
 13 var EventEmitter = require(‘events‘).EventEmitter;
 14 var TodoConstants = require(‘../constants/TodoConstants‘);
 15 var assign = require(‘object-assign‘);
 16
 17 var CHANGE_EVENT = ‘change‘;
 18
 19 var _todos = {};
 20
 21 /**
 22  * Create a TODO item.
 23  * @param  {string} text The content of the TODO
 24  */
 25 function create(text) {
 26   // Hand waving here -- not showing how this interacts with XHR or persistent
 27   // server-side storage.
 28   // Using the current timestamp + random number in place of a real id.
 29   var id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
 30   _todos[id] = {
 31     id: id,
 32     complete: false,
 33     text: text
 34   };
 35 }
 36
 37 /**
 38  * Update a TODO item.
 39  * @param  {string} id
 40  * @param {object} updates An object literal containing only the data to be
 41  *     updated.
 42  */
 43 function update(id, updates) {
 44   _todos[id] = assign({}, _todos[id], updates);
 45 }
 46
 47 /**
 48  * Update all of the TODO items with the same object.
 49  * @param  {object} updates An object literal containing only the data to be
 50  *     updated.
 51  */
 52 function updateAll(updates) {
 53   for (var id in _todos) {
 54     update(id, updates);
 55   }
 56 }
 57
 58 /**
 59  * Delete a TODO item.
 60  * @param  {string} id
 61  */
 62 function destroy(id) {
 63   delete _todos[id];
 64 }
 65
 66 /**
 67  * Delete all the completed TODO items.
 68  */
 69 function destroyCompleted() {
 70   for (var id in _todos) {
 71     if (_todos[id].complete) {
 72       destroy(id);
 73     }
 74   }
 75 }
 76
 77 var TodoStore = assign({}, EventEmitter.prototype, {
 78
 79   /**
 80    * Tests whether all the remaining TODO items are marked as completed.
 81    * @return {boolean}
 82    */
 83   areAllComplete: function() {
 84     for (var id in _todos) {
 85       if (!_todos[id].complete) {
 86         return false;
 87       }
 88     }
 89     return true;
 90   },
 91
 92   /**
 93    * Get the entire collection of TODOs.
 94    * @return {object}
 95    */
 96   getAll: function() {
 97     return _todos;
 98   },
 99
100   emitChange: function() {
101     this.emit(CHANGE_EVENT);
102   },
103
104   /**
105    * @param {function} callback
106    */
107   addChangeListener: function(callback) {
108     this.on(CHANGE_EVENT, callback);
109   },
110
111   /**
112    * @param {function} callback
113    */
114   removeChangeListener: function(callback) {
115     this.removeListener(CHANGE_EVENT, callback);
116   }
117 });
118
119 // Register callback to handle all updates
120 AppDispatcher.register(function(action) {
121   var text;
122
123   switch(action.actionType) {
124     case TodoConstants.TODO_CREATE:
125       text = action.text.trim();
126       if (text !== ‘‘) {
127         create(text);
128         TodoStore.emitChange();
129       }
130       break;
131
132     case TodoConstants.TODO_TOGGLE_COMPLETE_ALL:
133       if (TodoStore.areAllComplete()) {
134         updateAll({complete: false});
135       } else {
136         updateAll({complete: true});
137       }
138       TodoStore.emitChange();
139       break;
140
141     case TodoConstants.TODO_UNDO_COMPLETE:
142       update(action.id, {complete: false});
143       TodoStore.emitChange();
144       break;
145
146     case TodoConstants.TODO_COMPLETE:
147       update(action.id, {complete: true});
148       TodoStore.emitChange();
149       break;
150
151     case TodoConstants.TODO_UPDATE_TEXT:
152       text = action.text.trim();
153       if (text !== ‘‘) {
154         update(action.id, {text: text});
155         TodoStore.emitChange();
156       }
157       break;
158
159     case TodoConstants.TODO_DESTROY:
160       destroy(action.id);
161       TodoStore.emitChange();
162       break;
163
164     case TodoConstants.TODO_DESTROY_COMPLETED:
165       destroyCompleted();
166       TodoStore.emitChange();
167       break;
168
169     default:
170       // no op
171   }
172 });
173
174 module.exports = TodoStore;
时间: 2024-10-20 00:27:56

React-Flux 介绍及实例演示的相关文章

css清除浮动代码实例演示

css清除浮动代码实例演示:在页面中如果采用了浮动,那么清除浮动则是必须要进行的操作,否则可能引起一些意想不到的后果.本章节不会对浮动或者清除浮动的原理做介绍,只是分享一下清除浮动的几段代码,因为有些朋友可能需要的就是一个代码实例,关于浮动或者清除清除浮动的相关内容可以参阅相关阅读.一.使用overflow清除浮动: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <met

[Python]网络爬虫(四):Opener与Handler的介绍和实例应用(转)

在开始后面的内容之前,先来解释一下urllib2中的两个个方法:info and geturl urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl() 1.geturl(): 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向.获取的URL或许跟请求URL不同. 以人人中的一个超级链接为例, 我们建一个urllib2_test10.py来比较一下原始URL和重定向的链接: [p

SSO之CAS单点登录实例演示

一.概述 此文的目的就是为了帮助初步接触SSO和CAS 的人员提供一个入门指南,一步一步演示如何实现基于CAS的单点登录. CAS的官网:http://www.jasig.org/cas 二.演示环境 本文演示过程在同一个机器上的(也可以在三台实体机器或者三个的虚拟机上),环境如下: windows7 64位,主机名称:michael-pc JDK 1.6.0_18 Tomcat 6.0.29 CAS-server-3.4.11.CAS-client-3.2.1 根据演示需求, 用修改hosts

实例演示如何使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程

实例演示如何使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义-请假申请流程 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 参考文章: RDIFramework.NET - 基于.NET的快速信息化系统开发框架 - 系列目录 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程

审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1

下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进行结合案例. 现在我只有这样一个表如下:(下面介绍单表,多表原理是一样的) 1.审核流结合代码生成器快速实现 1.用代码生成器生成单据(选择启用审核流) 之后点击“生成“并把对应代码拷贝到相应的位置,执行脚本把菜单预制进去,详见“06.SNF.CodeGenerator代码生成器使用说明.docx”

实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web

实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台 RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件WinFor

实例演示ThreadLocal和Synchronized针对多线程处理

概述 在java2后,提供了threadlocal.这样一个新的工具类在处理多线程时提供了另外一种与之前不同的解决方案,而且对于开发者来说更加的简洁.它为每个访问这个变量的线程提供一个线程副本,并将这个副本存入到map中.这样就相当于每个线程都拥有自己独立的变量,在多线程并发操作时就不会造成操作数据的不一致.而在单例模式中,使用到的synchronized.它的机制是控制变量只有单线程进行访问,这样对于变量每次只有一个线程来操作句柄就不会操作数据的不一致. ThreadLocal类 Thread

oracle事务处理及实例演示jdbc操作批量删除

事务 作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条sql语句来构成.当然还有针对非数据库操作的,如在计算机中设置的还原点即是一个很好的应用. 对于事务的基本性质在另一篇中有所叙述:SQL 事务及实例演示 oracle和sql server在事务上区别 sql server中的事务一般分为隐式事务.显式事务.自动提交事务. 自动事务:对于sql server来说,当客户端提交一条sql语句时,这时候sql server都会自动启动一个事务:对于这样的事务,在执行完sql语句后会自动提交

Android开发之IPC进程间通信-AIDL介绍及实例解析

一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期