项目结构:

代码:

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3.  
  4. import store from './redux/store'
  5. import App from './components/app';
  6.  
  7. function render() {
  8. ReactDOM.render(<App store={store}/>, document.getElementById('root'));
  9. }
  10.  
  11. //初始化渲染
  12. render()
  13.  
  14. //订阅监听(store中的状态变化了,就会自动调用重绘)
  15. store.subscribe(render)

index.js

  1. import React, {Component} from 'react'
  2.  
  3. import * as actions from '../redux/actions'
  4.  
  5. export default class App extends Component {
  6.  
  7. increment = () => {
  8. //1.得到选择的增加数量
  9. const number = this.select.value * 1
  10. //2.调用store的方法更新状态
  11. this.props.store.dispatch(actions.increment(number))
  12.  
  13. };
  14.  
  15. decrement = () => {
  16. //1.得到选择的增加数量
  17. const number = this.select.value * 1
  18. //2.调用store的方法更新状态
  19. this.props.store.dispatch(actions.decrement(number))
  20. };
  21.  
  22. incrementIfOdd = () => {
  23. //1.得到选择的增加数量
  24. const number = this.select.value * 1
  25. //2.得到原本的count状态
  26. const count = this.props.store.getState()
  27. //3.判断,满足条件再更新状态
  28. if (count % 2 === 1) {
  29. //调用store方法更新状态
  30. this.props.store.dispatch(actions.increment(number))
  31.  
  32. }
  33. }
  34.  
  35. incrementAsync = () => {
  36. //1.得到选择的增加数量
  37. const number = this.select.value * 1
  38. //启动延时定时器
  39. setTimeout(() => {
  40. this.props.store.dispatch(actions.decrement(number))
  41. }, 1000)
  42. };
  43.  
  44. render() {
  45. const count = this.props.store.getState()
  46. // debugger
  47. return (
  48. <div>
  49. <p>click {count} times</p>
  50. <div>
  51. <select ref={select => this.select = select}>
  52. <option value="1">1</option>
  53. <option value="2">2</option>
  54. <option value="3">3</option>
  55. </select>&nbsp;
  56. <button onClick={this.increment}>+</button>
  57. &nbsp;
  58. <button onClick={this.decrement}>-</button>
  59. &nbsp;
  60. <button onClick={this.incrementIfOdd}>increment odd</button>
  61. &nbsp;
  62. <button onClick={this.incrementAsync}>increment async</button>
  63. &nbsp;
  64. </div>
  65. </div>
  66. )
  67. }
  68. }

app.jsx

  1. import {createStore} from 'redux';
  2. import {counter} from './reducers';
  3.  
  4. //生成store对象
  5. const store = createStore(counter);//内部会第一次调用reduer函数得到初始state
  6. console.log(store, store.getState());
  7.  
  8. export default store

store.js

  1. import {INCREMENT, DECREMENT} from '../redux/action-types';
  2. /*
  3. * 包含所有action creator
  4. * */
  5.  
  6. //增加
  7. export const increment = (number) => ({
  8. type: INCREMENT, data: number
  9. })
  10. //减少
  11. export const decrement = (number) => ({
  12. type: DECREMENT, data: number
  13. })

actions.js

40_redux_counter应用_redux完善版本的更多相关文章

  1. 给WPF示例图形加上方便查看大小的格子之完善版本

    原文:给WPF示例图形加上方便查看大小的格子之完善版本 去年10月份, 我曾写过一篇"给WPF示例图形加上方便查看大小的格子"的BLOG(http://blog.csdn.net/ ...

  2. iOS----友盟分享完善版本

    分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...

  3. 一个自己实现的Vector 完善版本

    一个自己实现的Vector(只能处理基本类型数据) 转载自: https://www.ev0l.art/index.php/archives/22/ string 类型不行 bool char* in ...

  4. 42_redux_counter应用_redux异步版本

    前言: redux默认不支持异步编程,需要下载redux插件(异步中间件) 如何下载: npm install --save redux-thunk 项目结构: 代码: import React, { ...

  5. c coroutine

    今天看了下云风c coroutine  代码 博客,发现 coroutine 实现原理其实还比较简单,就用户态栈切换,只需要几十行汇编,特别轻量级. 具体实现 1. 创建一个coroutine: 也就 ...

  6. Python数据库迁移脚本(终极版)

    上次的那几个脚本这次全部整合到了一起,而且后面发现了一个可以使用的ODBC包,于是这次采用的方式就很简单了,直接通过ODBC将InterBase数据库中的数据全部取出来之后通过Python的sqlal ...

  7. 不一样的角度 解读微信小程序

    不一样的角度 解读微信小程序 七月在夏天· 2 天前 前段时间看完了雨果奖中短篇获奖小说<北京折叠>.很有意思的是,张小龙最近也要把应用折叠到微信里,这些应用被他称为:小程序. 含着金钥匙 ...

  8. 【java 上传+下载】

    一.先说说上传 第一步:pom.xml文件 加上 上传文件依赖架包 <dependency> <groupId>commons-fileupload</groupId&g ...

  9. 文件上传和下载(可批量上传)——Spring(二)

    针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...

随机推荐

  1. win10 uwp 读取resw资源文件

    ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMa ...

  2. AllocateHWnd SetTimer API

    unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  3. vue项目做seo优化(prerender-spa-plugin vue-meta-info)

    今天公司考虑seo设计方案,服务端渲染(ssr)和 预渲染的方式,不过只是打算对几个简单的页面seo,所以选择了使用预渲染的方式,以下是实现过程中遇到的问题,供大家查看,有不对的地方请指正: 使用pr ...

  4. Linux shell 重定向学习笔记

    在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读 ...

  5. ECMA6 New Features

    花了一些时间把ECMA6的新特性进行了回顾,给自己建立了思维索引,大部分内容借鉴了阮一峰大神的博客. refers: http://es6.ruanyifeng.com/#docs/arraybuff ...

  6. Notepad2用法说明

    Notepad2用法说明:1.替换系统记事本.bat和恢复系统记事本.bat可以替换.回复系统记事本.2.查看→默认字体,编程可用Consolas,字号四号.3.查看→自定义方案,Identifier ...

  7. rediscluster安装

    Redis 3.2.1集群搭建   一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2) ...

  8. phpstorm 如何设置识别vue文件

    非常简单,步骤如下: 第一步: 设置->plugins->browser repositories 搜索vue.js,然后安装一下vue.js插件,重启ide. 第二步: Editor - ...

  9. javascript多语言设定方式

    1.控件文字语言设定 1.1 设定两个结构变量,定义好每一个控件需要用到的值,称它字典对象 var languagecn = { 1089: "夹柄不到位", 1090: &quo ...

  10. Python 网站后台扫描脚本

    Python  网站后台扫描脚本 #!/usr/bin/python #coding=utf-8 import sys import urllib import time url = "ht ...