2019独角兽企业重金招聘Python工程师标准>>>

此书讲得蛮详细,

从Flux一步一步过渡到Redux。

写过的代码舍不得扔,

立此存照吧。

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';import ControlPanel from './views/ControlPanel';
import registerServiceWorker from './registerServiceWorker';ReactDOM.render(<ControlPanel />, document.getElementById('root'));
registerServiceWorker();

AppDispatcher.js

import {Dispatcher} from 'flux';export default new Dispatcher();

ActionTypes.js

export const INCREMENT = 'increment';
export const DECREMENT = 'decrement';

Actions.js

import * as ActionTypes from './ActionTypes';
import AppDispatcher from './AppDispatcher';export const increment = (counterCaption) => {AppDispatcher.dispatch({type: ActionTypes.INCREMENT,counterCaption: counterCaption});
};export const decrement = (counterCaption) => {AppDispatcher.dispatch({type: ActionTypes.DECREMENT,counterCaption: counterCaption});
};

CounterStore.js

import AppDispatcher from '../AppDispatcher';
import * as ActionTypes from '../ActionTypes';
import {EventEmitter} from 'events';const CHANGE_EVENT = 'changed';const counterValues = {'First': 0,'Second': 10,'Third': 30
};const CounterStore = Object.assign({}, EventEmitter.prototype, {getCounterValues: function() {return counterValues;},emitChange: function() {this.emit(CHANGE_EVENT);},addChangeListener:function(callback) {this.on(CHANGE_EVENT, callback);},removeChangeListener: function(callback) {this.removeListener(CHANGE_EVENT, callback);}
});CounterStore.dispatchToken = AppDispatcher.register((action)=> {if (action.type === ActionTypes.INCREMENT) {counterValues[action.counterCaption]++;CounterStore.emitChange();} else if (action.type === ActionTypes.DECREMENT) {counterValues[action.counterCaption]--;CounterStore.emitChange();}
});export default CounterStore;

SummaryStore.js

import AppDispatcher from '../AppDispatcher';
import * as ActionTypes from '../ActionTypes';
import CounterStore from './CounterStore';
import {EventEmitter} from 'events';const CHANGE_EVENT = 'changed';function computerSummary(counterValues) {let summary = 0;for (const key in counterValues) {if (counterValues.hasOwnProperty(key)) {summary += counterValues[key];}}return summary;
}const SummaryStore = Object.assign({}, EventEmitter.prototype, {getSummary: function() {return computerSummary(CounterStore.getCounterValues());},emitChange: function() {this.emit(CHANGE_EVENT);},addChangeListener: function(callback) {this.on(CHANGE_EVENT, callback);},removeChangeListener: function(callback) {this.removeListener(CHANGE_EVENT, callback);}
});SummaryStore.dispatchToken = AppDispatcher.register((action) => {if ((action.type === ActionTypes.INCREMENT) ||(action.type === ActionTypes.DECREMENT)) {AppDispatcher.waitFor([CounterStore.dispatchToken]);SummaryStore.emitChange();}
});export default SummaryStore;

CounterPanel.js

import React, { Component } from 'react';
import Counter from './Counter';
import Summary from './Summary';const style = {margin: '20px'
};class ControlPanel extends Component {render() {return (<div style={style}><Counter caption="First" /><Counter caption="Second" /><Counter caption="Third"  /><hr /><Summary /></div>);}
}export default ControlPanel;

Counter.js

import React, { Component } from 'react';
import PropTypes from 'prop-types';import * as Actions from '../Actions.js';
import CounterStore from '../stores/CounterStore.js';const buttonStyle = {margin: '10px'
};const propTypes  = {caption: PropTypes.string.isRequired
};class Counter extends Component {constructor(props) {super(props);this.onClickIncrementButton = this.onClickIncrementButton.bind(this);this.onClickDecrementButton = this.onClickDecrementButton.bind(this);this.onChange = this.onChange.bind(this);this.state = {count: CounterStore.getCounterValues()[props.caption]}}shouldComponentUpdate(nextProps, nextState) {return (nextProps.caption !== this.props.caption) ||(nextState !== this.state.count);}componentDidMount() {CounterStore.addChangeListener(this.onChange);}componentWillUnmout() {CounterStore.removeChangeListener(this.onChange);}onChange() {const newCount = CounterStore.getCounterValues()[this.props.caption];this.setState({count: newCount});}onClickIncrementButton() {Actions.increment(this.props.caption);}onClickDecrementButton() {Actions.decrement(this.props.caption);}render() {const {caption} = this.props;return (<div><button style={buttonStyle} onClick={this.onClickIncrementButton}>+</button><button style={buttonStyle} onClick={this.onClickDecrementButton}>-</button><span> { caption }  count: {this.state.count}</span></div>);}
}Counter.defaultProps = {initValue: 0,onUpdate: f => f
};
Counter.propTypes = propTypesexport default Counter;

Summary.js

import React, {Component} from 'react';
import SummaryStore from '../stores/SummaryStore';class Summary extends Component {constructor(props) {super(props);this.onUpdate = this.onUpdate.bind(this);this.state = {sum: SummaryStore.getSummary()}}componentDidMount() {SummaryStore.addChangeListener(this.onUpdate);}componentWillUnmount() {SummaryStore.removeChangeListener(this.onUpdate);}onUpdate() {this.setState({sum: SummaryStore.getSummary()})}render() {return (<div>Total Count: {this.state.sum}</div>);}
}export default Summary;
阅读原文

http://click.aliyun.com/m/36077/

转载于:https://my.oschina.net/u/3637633/blog/1584525

实操《深入浅出React和Redux》第二期—Flux相关推荐

  1. [react] 《深入浅出React和Redux》 读书笔记

    随书代码 1 React 新的前端思维方式 npm i create-react-app -g create-react-app first_react_app npm start//执行eject则 ...

  2. 实操《深入浅出React和Redux》第四期--react-redux

    入到第四期, 代码大大简化, 但如果没有前面的演化过程, 一定让人蒙圈~~ 三个主要文件: index.js import React from 'react'; import ReactDOM fr ...

  3. 实操《深入浅出React和Redux》第一期

    上次的书看得差不多了,但实践越来越麻烦. 于是重新开一本书,这次,人家用了create-react-app. 实践方面就容易开展啦.:) 主要文件内容也少多啦. index.js import Rea ...

  4. 20211127 1+X 中级实操考试样题(第二套)

    步骤 1:项目准备 省略...... 步骤 2:完成实体类 Student //已经提供Student类的属性,补充完成该类的有参(五个参数)及无参构造方法 public Student() {}pu ...

  5. AI实战营第二期——课程目录

    AI实战营第二期 第一节 AI实战营第二期 第一节<姿态估计与MMPose> 课程链接:https://www.bilibili.com/video/BV1kk4y1L7Xb/ 课程说明: ...

  6. 【实训】第二期实训结课项目——外卖小程序

    大二暑假的第二期实训,当时主要学的是小程序和maven,我在项目中担任组长,负责数据库的设计.后端代码的编写.ppt编写和最后的答辩. 课程结束后只给了四天的时间进行开发,大部分人都是第一次接触微信小 ...

  7. OpenMMLab-AI实战营第二期——4-1.目标检测与MMDetection

    文章目录 1. 目标检测的基本范式 1.0-1 目标检测简介 1.0-2 基本概念 1.1 滑窗 1.1.1 滑窗基本思想 1.1.2 滑窗效率问题改进 1.1.3 感受野计算 1.2-1 使用卷积实 ...

  8. OpenMMLab AI实战营第二期|人体关键点检测与MMPose学习笔记

    OpenMMLab AI实战营第二期|人体关键点检测与MMPose学习笔记 文章目录 OpenMMLab AI实战营第二期|人体关键点检测与MMPose学习笔记 一.前言 1.1 人体姿态概述 1.2 ...

  9. 独孤思维:闷声发财,实操第二天出单,项目越做越香

    01 工资 如果你已经在工作,有一份稳定的收入,你身边肯定有这样的人: 比你职位低的,往往脑力付出更少一些,体力付出更多一些:比你职位高的人,往往是脑力付出更多一些,体力付出更少一些. 往往体力付出更 ...

最新文章

  1. action和servlet的关系
  2. linux 网络7层模型,Linux网络编程——OSI七层模型、TCP/IP模型
  3. 观察性研究的网络Meta分析
  4. OpenCASCADE:Android交叉编译 OCCT库
  5. wxWidgets:wxMiniFrame类用法
  6. python逻辑运算(not、and、or)总结_python逻辑判断 () not and or
  7. 在python中用import或者from_[转]python基础之---import与from...import....
  8. python打乱list_超实用!每 30 秒学会一个 Python 小技巧,GitHub 标星 5300!
  9. python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...
  10. javascript window.navigator
  11. 判断字符串只能有且只有一处连续数字不同
  12. 如何在移动网页上“禁用”缩放?
  13. layui列表筛选列_layui框架的table字段筛选功能介绍
  14. 转 iOS socket
  15. 员工请假审批系统 php,php073企业考勤请假系统
  16. 装完nvme固态经常蓝屏_NVMe固态硬盘安装Win7蓝屏0x0000007B快速解决方法
  17. 动画3D变形:平移、旋转、缩放
  18. 如何将图片转成png格式?图片的格式怎么转换
  19. 软件工程经济学期末复习第二章
  20. OpenCV(三)彩色图灰度化、通道分离、单通道反差处理(灰度图)、多通道反差处理(彩色图)

热门文章

  1. Winform中设置ZedGraph鼠标滚轮缩放的灵敏度以及设置滚轮缩放的方式(鼠标焦点为中心还是图形中心点)
  2. Linux-通过XShell使用sz命令提示找不到
  3. 【TensorFlow】笔记3:MNIST数字识别问题
  4. React.js 开发常见问题
  5. 2、ShardingSphere 之 Sharding-JDBC实现水平分表
  6. 活动 | 玩转“视”界杯 —— 2018 上半年广告数据分析及短视频分享
  7. 数据驱动才是零售企业转型的核心!
  8. 神策与CDA,一次不平凡的约会
  9. 进大厂必须掌握的50个微服务面试问题!
  10. 人生第一次删好友,删的就是你!连路飞都怒了!