要素:store、reducer、dispatch/subscribe

connect:将业务逻辑剥离到容器类,数据的双向绑定;

数据、操作、UI分离、命令封装

核心思想:对共享状态的维护;

核心代码:

store={createStore(reducer)

const reducer = (state = 'GO', action) => {

switch(action.type) {

case 'GO':

state = 'GO'

break;

}

this.props.store.subscribe(() => {

this.forceUpdate();

});

<button onClick={() => {this.props.store.dispatch(goAction)}}

与flux的比较:

将状态修改的功能进行了剥离;

'use strict';

import React from 'react';

import ReactDOM from 'react-dom';

import Redux, { createStore } from 'redux';

import { reducer } from './reducer';

import { App } from './app';

ReactDOM.render(<App store={createStore(reducer)}/>,

document.getElementById('root'))

'use strict';

import React, { Component } from 'react';

const stopColor = (store) => {

return store.getState() == 'STOP' ? 'red' : 'white';

}

const cautionColor = (store) => {

return store.getState() == 'CAUTION' ? 'yellow' : 'white';

}

const goColor = (store) => {

return store.getState() == 'GO' ? 'rgb(39,232,51)' : 'white';

}

export class Stoplight extends Component {

componentWillMount() {

this.props.store.subscribe(() => {

this.forceUpdate();

});

}

render() {

return(

<div style={{textAlign: 'center'}}>

<svg height='170'>

<circle cx='145' cy='60' r='15'

fill={stopColor(this.props.store)}

stroke='black'/>

<circle cx='145' cy='100' r='15'

fill={cautionColor(this.props.store)}

stroke='black'/>

<circle cx='145' cy='140' r='15'

fill={goColor(this.props.store)}

stroke='black'/>

</svg>

</div>

)

}

}

'use strict';

import React, { Component } from 'react';

import { goAction, cautionAction, stopAction } from './actions';

export class Buttons extends Component {

componentWillMount() {

this.props.store.subscribe(() => {

this.forceUpdate();

});

}

render() {

const state = this.props.store.getState();

return(

<div style={{textAlign: 'center'}}>

<button onClick={() => {this.props.store.dispatch(goAction)}}

disabled={state == 'GO' || state == 'CAUTION'}

style={{cursor: 'pointer'}}>

Go

</button>

<button onClick={() => {this.props.store.dispatch(cautionAction)}}

disabled={state == 'CAUTION' || state == 'STOP'}

style={{cursor: 'pointer'}}>

Caution

</button>

<button onClick={() => {this.props.store.dispatch(stopAction)}}

disabled={state == 'STOP' || state == 'GO'}

style={{cursor: 'pointer'}}>

Stop

</button>

</div>

)

}

}

redux沉思录的更多相关文章

  1. redux沉思录:基于flux、状态管理、函数式编程的前端状态管理框架

    基于flux和reduce的通信和状态管理机制; 和数据库管理系统一样,redux是一个状态管理系统(或机制). const store = createStore( reducer, compose ...

  2. 【C++沉思录】句柄2

    1.[C++沉思录]句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了.2.有没有更简单的办法呢? 句柄使用Po ...

  3. 【C++沉思录】句柄1

    1.在[C++沉思录]代理类中,使用了代理类,存在问题: a.代理复制,每次创建一个副本,这个开销有可能很大 b.有些对象不能轻易创建副本,比如文件2.怎么解决这个问题? 使用引用计数句柄,对动态资源 ...

  4. 生活沉思录 via 哲理小故事(四)

    1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...

  5. 生活沉思录 via 哲理小故事

    本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...

  6. 生活沉思录 via 哲理小故事(一)

    1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛,但却是失明的. 原来,托蒂刚出生时,这只眼睛轻度感染,曾用绷带缠了两个星期.这对常人来说几乎没有人任何 ...

  7. Atitit。 沉思录 与it软件开发管理中的总结 读后感

    Atitit. 沉思录 与it软件开发管理中的总结 读后感 1. <沉思录>,古罗马唯一一位哲学家皇帝马可·奥勒留所著 2 2. 沉思录与it软件开发管理中的总结 2 2.1. 要有自己的 ...

  8. react hooks沉思录

    将UI组件抽象为状态处理机.分为普通状态和副作用状态. 一.综述 useState:处理函数只改变引用的状态本身:副作用状态:会对引用状态以外的状态和变量进行修改:useReducer:用解藕化的机制 ...

  9. applyMiddleware 沉思录

    let newStore = applyMiddleware(mid1, mid2, mid3, ...)(createStore)(reducer, null); 给({ getState, dis ...

随机推荐

  1. jquery.i18n.properties前端国际化方案

    如果新项目要做系统国际化, 时下热门的任何一种技术选型都有成熟的方案,比如: vue + vue-i18n angular + angular-translate react + react-intl ...

  2. Sitecore客户体验成熟度模型之旅

    “成熟”这个词带来了很多想法:你在青年时不愿意找到工作?你四岁的孩子偶尔发脾气?可能还有你的公司能否在数字化时代提供个性化的客户体验? 你如何定义CX成熟度?如果您的CX战略仍处于开发阶段,您需要达到 ...

  3. Nginx Tutorial #1: Basic Concepts(转)

    add by zhj: 文章写的很好,适合初学者 原文:https://www.netguru.com/codestories/nginx-tutorial-basics-concepts Intro ...

  4. Python如何进行有背景图片的界面跳转

    一.问题在进行tkinter点击按钮弹出新的界面的时候遇到了下面的问题:[_tkinter.TclError: image "pyimage2" doesn't exist] 原因 ...

  5. Java学习:static 关键字概述

    static 关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己.而是属于类的,所以凡是本类的对象,都共享同一份. 如果没有static关键字,那么必须首先创建对象,然后通过对象才 ...

  6. ping程序和tracert(traceroute)背后的故事--ICMP协议

    为路由器生,为交换机死,为了Ping通奋斗一辈子-----tracert.cn 上面是一个网络工程师的个人定位,很有意思,哈哈!那么我们来看看ping和tracert都是什么吧 PING (Packe ...

  7. Linux学习笔记之秋水BBR一键部署

    0x00 本脚本适用环境 系统支持:CentOS 6+,Debian 7+,Ubuntu 12+内存要求:≥128M 阅读文章时请除手动删出干扰字符“1”.(Shadowsocks) 0x01 关于本 ...

  8. Java链表操作代码

    /** * */ package com.cherish.SwordRefersToOffer; /** * @author acer * */ public class test_22链表中倒数第k ...

  9. Matlab解释器模式

    解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式.其模式结构如下图.本文使 ...

  10. python的new与init

    基于文章:Why is init() always called after new()? 特别说明: 这篇文章的灵感来源于stackoverflow的一个提问,准确说,我只是做了些知识梳理的工作,对 ...