一、下载

  要想使用redux,首先要下载它

  npm install --save redux

二、核心API

  1.createStore()

    作用:创建包含指定reducer的store对象

    编码:import {createStore} from 'redux'

       import counter from './reducers/counter'

       const store = createStore(counter)

  2.store对象

    作用:

      redux库最核心的管理对象

    它内部维护着:

      state

      reducer

    核心方法:

      getState()

      dispatch(action)

      subscribe(listener)

    编码:

      store.getState()

      store.dispatch({type:'INCREMENT',number})

      store.subscribe(render)

三、redux的三个核心概念

  1.action

    标识要执行行为的对象

    包含两个属性:

      type:标识属性,值为字符串,唯一,必要属性

      xxx:数据属性,值类型任意,可选属性

    例子:

      const action = {

        type:'INCREMENT',

        data:2

     }

    Action Creator(创建Action的工厂函数)

      const increment = (number) => ({type:'INCREMENT',number})

  2.reducer

    根据老的state和action,产生新的state的纯函数

    样例:

      export default function counter(state = 0, action){

        switch(action.type){

          case 'INCREMENT':

            return state + action.data

          case 'DECREMENT':

            return state - action.data

          default:

            return state

        }

      }

    注意:

      返回一个新的状态

      不要修改原来的状态

  3.store

    将state、action与reducer联系在一起发的对象

    如何得到这个对象?

      import {createStore} from 'redux'

      import reducer from './reducers'

      const store = createStore(reducer)

    此对象的功能?

      getState():得到state

      dispatch(action):分发action,出发reducer调用,产生新的state

      subscribe(listener):注册监听,当产生了新的state时,自动调用

四、代码:

项目结构:

  

  

import React from 'react';
import ReactDOM from 'react-dom';
import {createStore} from 'redux';

import App from './components/app';
import {counter} from './redux/reducers';

//生成store对象
const store = createStore(counter);//内部会第一次调用reduer函数得到初始state
console.log(store, store.getState());

function render() {
    ReactDOM.render(<App store={store}/>, document.getElementById('root'));
}

//初始化渲染
render()

//订阅监听(store中的状态变化了,就会自动调用重绘)
store.subscribe(render)

index.js

import React, {Component} from 'react'
import {INCREMENT, DECREMENT} from '../redux/action-types'

export default class App extends Component {

    increment = () => {
        //1.得到选择的增加数量
        const number = this.select.value * 1
        //2.调用store的方法更新状态
        this.props.store.dispatch({type: INCREMENT, data: number})

    };

    decrement = () => {
        //1.得到选择的增加数量
        const number = this.select.value * 1
        //2.调用store的方法更新状态
        this.props.store.dispatch({type: DECREMENT, data: number})
    };

    incrementIfOdd = () => {
        //1.得到选择的增加数量
        const number = this.select.value * 1
        //2.得到原本的count状态
        const count = this.props.store.getState()
        //3.判断,满足条件再更新状态
        if (count % 2 === 1) {
            //调用store方法更新状态
            this.props.store.dispatch({type: INCREMENT, data: number})

        }
    }

    incrementAsync = () => {
        //1.得到选择的增加数量
        const number = this.select.value * 1
        //启动延时定时器
        setTimeout(() => {
            this.props.store.dispatch({type: INCREMENT, data: number})
        }, 1000)
    };

    render() {
        const count = this.props.store.getState()
        // debugger
        return (
            <div>
                <p>click {count} times</p>
                <div>
                    <select ref={select => this.select = select}>
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                    </select>&nbsp;
                    <button onClick={this.increment}>+</button>
                    &nbsp;
                    <button onClick={this.decrement}>-</button>
                    &nbsp;
                    <button onClick={this.incrementIfOdd}>increment odd</button>
                    &nbsp;
                    <button onClick={this.incrementAsync}>increment async</button>
                    &nbsp;
                </div>
            </div>
        )
    }
}

app.jsx

/*
* 包含所有action type的常量字符串
* */

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

action-tupes.js

/*
* 包含n个reducer函数的模块
* */
export function counter(state = 0, action) {

    console.log('counter()', state, action)

    switch (action.type) {
        case 'INCREMENT':
            return state + action.data
        case 'DECREMENT':
            return state - action.data
        default:
            return state
    }

}

reducers.jsx

  

    

      

39_redux_counter应用_redux版本的更多相关文章

  1. 45_redux_comment应用_redux版本_异步功能

    /* * 包含所有action的type名称常量 * */ //添加评论 export const ADD_COMMENT = 'add_comment'; //删除评论 export const D ...

  2. 44_redux_comment应用_redux版本_同步功能

    项目结构: components里面的东西没变,将app.jsx移动至containers中 /* * 包含所有action的type名称常量 * */ //添加评论 export const ADD ...

  3. 42_redux_counter应用_redux异步版本

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

  4. 40_redux_counter应用_redux完善版本

    项目结构: 代码: import React from 'react'; import ReactDOM from 'react-dom'; import store from './redux/st ...

  5. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  6. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  7. 理解Maven中的SNAPSHOT版本和正式版本

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  8. MIP 官方发布 v1稳定版本

    近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...

  9. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

随机推荐

  1. crontab(暂存待完善)

    crontab  -e 编辑 ,(使用默认编辑器) -l  列出 第1列分钟1-59 第2列小时1-23(0表示子夜) 第3列日1-31 第4列月1-12 第5列星期0-6(0表示星期天) 第6列要运 ...

  2. vue添加class类名

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  3. from组件

    目录 一.生成页面可用的 HTML标签 二.对用户提交的数据进行校验 三. form 综合示例: 四. modelform(自动根据字段生成表单) 五.modelformset 一.生成页面可用的 H ...

  4. Java高级特性 第15节 解析XML文档(3) - JDOM和DOM4J技术

    一.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. Jdom由6个包构成: Element类表示XML文档的元素 org.jdom: 解析xml ...

  5. 未处理AccessViolationException 异常

     在进行arcgis的GP操作时,当操作栅格图像的拼接时,报错: AccessViolationException: 尝试读取或写入受保护的内存 原以为可以通过try catch屏蔽掉错误,不至于程序 ...

  6. Excel--截取所需内容

    如上图,需截取*号后的数字,那么公式怎么写: 1.使用Find和Mid函数: FIND:获取指定字符所在字串的位置: MID:截取字串中的子串. 写法: 2.也可以使用Replace函数代替mid函数 ...

  7. ros的一些设置

    端口映射规则,dst-address填写你的公网地址,乱写也可以,到后面会通过定时脚本自动更新 /ip firewall nat add action=dst-nat chain=dstnat com ...

  8. Apache Atlas元数据管理从入门到实战(1)

    一.前言   元数据管理是数据治理非常重要的一个方向,元数据的一致性,可追溯性,是实现数据治理非常重要的一个环节.传统数据情况下,有过多种相对成熟的元数据管理工具,而大数据时代,基于hadoop,最为 ...

  9. json,pickle,shelve模块,xml处理模块

    常用模块学习—序列化模块详解 什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化? 你打游戏过程 ...

  10. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...