store:

import {createStore,applyMiddleware, compose} from "redux";
import thunk from "redux-thunk";
import rootReducer from "./reducers/rootReducer"; const middlewares = [
applyMiddleware(thunk)
];
const store = initialState => createStore(rootReducer, initialState, compose(...middlewares)); export default store;

rootReducer:

import {combineReducers} from "redux";
import {reducer as toastr} from "react-redux-toastr"; const rootReducer = combineReducers({
toastr,
counterReducer
}); export default rootReducer;

counterReducer:

import * as types from "../actions/actionType";

const initialState = {
count: 0
}; const counterReducer = function (state = initialState, action) {
const count = state.product;
switch (action.type) {
case types.INCREMENT:
return {count: count + 1};
case types.DECREMENT:
return {count: count - 1};
default:
return state; } }; export default counterReducer;

actionType:

export const INCREMENT = 'INCREMENT';
export const DECREMENT = 'DECREMENT';

Counter:

import {connect} from "react-redux";
import * as types from "actions/actionType"; const mapStatetoProps = state =>{
return {
value: state.counterReducer.count
}
}
const mapDispatchToProps =dispatch => {
return {
onIncrement: ()=>dispatch({type: types.INCREMENT}),
onDecrement: ()=>dispatch({type: types.DECREMENT})
}
} class Counter extends React.Component {
render() {
const {count, onIncrement, onDecrement} = this.props;
return (
<div>
<span>{count}</span>
<button onClick={onIncrement}>+</button>
<button onClick={onDecrement}>-</button>
</div>
)
}
}
const CounterContainer = connect(
mapStateToProps,
mapDispatchToProps
)(Counter)
export default CounterContainer;

counterAction:

import * as types from "./actionType";
export function increment(count) {
return {
type: types.INCREMENT,
count
}
}
export function decrement(count) {
return {
type: types.DECREMENT,
count
}
}
onIncrement: ()=>dispatch({type: types.INCREMENT}) =》
onIncrement: (count)=>dispatch(actions.increment(count)),

use redux-actions:

import {createAction} from "redux-actions";
import * as types from "./actionType";
export const increment = createAction(types.INCREMENT);
export const decrement = createAction(types.DECREMENT);

Redux Thunk 中间 件 可以 让 action 创建 函数 先不 返回 action 对象, 而是 返回 一个 函数。 通过 这个 函数 延迟 dispatch 或者 只在 满足 指定 条件 的 情况下 dispatch。 这个 内部 函数 接受 store 的 两个 方法 dispatch 和 getState 作为 参数。

update action:

import {createAction} from "redux-actions";

import * as types from "../../constant/ActionType";

export  const increment = createAction(types.INCREMENT);
export const decrement = createAction(types.DECREMENT); export function incrementIfOdd() {
return (dispatch, getStore) => {
const count = getStore().CounterReducer.count;
if (count % 2 ==0) {
return
}
dispatch(increment())
}
}

update container :

import React from "react";
import {connect} from "react-redux";
import {Row, Col, Button} from "antd"; import * as actions from "../../reduxModel/actions/CounterAction";
import "./index.scss"; const mapStateToProps = state => {
return {value: state.CounterReducer.count}
};
const mapDispatchToProps = {
onIncrement: actions.increment,
onDecrement: actions.decrement,
onIncrementIfOdd: actions.incrementIfOdd
}; class Home extends React.Component{ render() {
const {value, onIncrement, onDecrement, onIncrementIfOdd} = this.props;
return (
<div className="app-home">
<div className="app-layout-container">
<Row type="flex" justify="center" className="app-layout-body">
<Col span={4}>
sidebar
</Col>
<Col span={20} className="page-panel">
welcome Home
<div className="form-btn-group">
<span>{value}</span>
<Button type="dashed" htmlType="button" onClick={onIncrement}>+</Button>
<Button type="dashed" htmlType="button" onClick={onDecrement}>-</Button>
<Button type="dashed" htmlType="button" onClick={onIncrementIfOdd}>add if odd</Button>
</div>
</Col>
</Row>
</div>
</div>
)
}
}
const HomeContainer = connect(
mapStateToProps,
mapDispatchToProps
)(Home); export default HomeContainer;

react-redux: counter的更多相关文章

  1. react+redux教程(六)redux服务端渲染流程

    今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...

  2. react+redux教程(四)undo、devtools、router

    上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...

  3. react+redux教程(一)connect、applyMiddleware、thunk、webpackHotMiddleware

    今天,我们通过解读官方示例代码(counter)的方式来学习react+redux. 例子 这个例子是官方的例子,计数器程序.前两个按钮是加减,第三个是如果当前数字是奇数则加一,第四个按钮是异步加一( ...

  4. React+Redux学习笔记:React+Redux简易开发步骤

    前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...

  5. react案例->新闻移动客户端--(react+redux+es6+webpack+es6的spa应用)

    今天分享一个react应用,应在第一篇作品中说要做一个react+redux+xxx的应用.已经做完一部分,拿出来分享.github地址为:点我就可以咯~ 这里实现了一个新闻移动站的spa.本来想写p ...

  6. React Redux 与胖虎

    这是一篇详尽的 React Redux 扫盲文. 对 React Redux 已经比较熟悉的同学可以直接看 <React Redux 与胖虎他妈>. 是什么 React Redux 是 R ...

  7. webpack+react+redux+es6开发模式

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  8. react+redux教程(五)异步、单一state树结构、componentWillReceiveProps

    今天,我们要讲解的是异步.单一state树结构.componentWillReceiveProps这三个知识点. 例子 这个例子是官方的例子,主要是从Reddit中请求新闻列表来显示,可以切换reac ...

  9. react+redux官方实例TODO从最简单的入门(6)-- 完结

    通过实现了增-->删-->改-->查,对react结合redux的机制差不多已经了解,那么把剩下的功能一起完成吧 全选 1.声明状态,这个是全选状态 2.action约定 3.red ...

  10. react+redux官方实例TODO从最简单的入门(1)-- 前言

    刚进公司的时候,一点react不会,有一个需求要改,重构页面!!!完全懵逼,一点不知道怎么办!然后就去官方文档,花了一周时间,就纯react实现了页面重构,总体来说,react还是比较简单的,由于当初 ...

随机推荐

  1. Springboot入门-配置异常页面

    springboot中,可以使用org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer类来统一的处理异 ...

  2. smtplib与email模块(实现邮件的发送)

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...

  3. Linux一键安装web环境全攻略(阿里云ECS服务器)

    摘自阿里云服务器官网,此处 一键安装包下载: 点此下载 安装须知 1.此安装包可在阿里云所有linux系统上部署安装,此安装包包含的软件及版本为: nginx:1.0.15.1.2.5.1.4.4 a ...

  4. s5_day2作业

    # 1:编写for循环,利用索引遍历出每一个字符 # msg = 'hello egon 666' # for i in range(len(msg)): # print(i,msg[i]) # 2: ...

  5. PAT 天梯赛 L1-002 【递归】

    题目链接 https://www.patest.cn/contests/gplt/L1-002 题意 给出一个数字 和一个字符 画出 可用数字下的最大沙漏,并且输出剩余没用掉的符号数 思路 可以先打一 ...

  6. application/x-www-form-urlencoded和multipart/form-data

     我们在提交表单的时候,form表单参数中会有一个enctype的参数. EncType表明提交数据的格式,用 Enctype 属性指定将数据发到服务器时浏览器使用的编码类型. enctype指定了H ...

  7. 20145217《网络对抗》 逆向及BOF进阶实践学习总结

    20145217<网络对抗> 逆向及BOF进阶实践学习总结 实践目的 1.注入shellcode 2.实现Return-to-libc攻击 知识点学习总结 Shellcode实际是一段代码 ...

  8. 配置OpenVpn使用证书和用户名密码双验证

    修改OpenVpn的主配置文件 添加一下内容: [root@check1 openvpn]# tail -3 server.conf auth-user-pass-verify /etc/openvp ...

  9. xcode9打包问题

    xcode9打包找不到icon http://blog.csdn.net/yohunl/article/details/78065656 换用xcode8打包 https://www.cnblogs. ...

  10. iOS动画进阶 - 手摸手教你写 Slack 的 Loading 动画

    如果移动端访问不佳,可以访问我的个人博客 前几天看了一篇关于动画的博客叫手摸手教你写 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我写这个动画 ...