Redux学习Action Reducer store

#Redux

流程

action → dispatch →  store → reducer

Action:描述要做的事情

1.action是一个plain-object(平面对象)

  1.它的__proto__必须指向object.prototype


2.action中,必须有type属性,该属性用于描述操作类型,通常使用payload属性表示附加数据(没有强制要求)

const action = {
    type: actionType.INCREASE,
   payload:1
}

3.在大型项目中,由于操作类型特别多,为了避免硬编码,将type类型用常量表示。

export const INCREASE = "increase";
export const DECREASE = "decrease";

4.为了方便传递action,通常会使用action创建函数来创建actiion

  1.action创建函数应该为一个纯函数

    1.不能以任何形式改动参数

    2.不可以异步

    3.不可以对外部环境造成影响

 

import * as actionType from './action-type'
export function getIncreaseAction() {
    return {
        type: actionType.INCREASE
    }
}

export function getDecreaseAction() {
    return {
        type: actionType.DECREASE
    }
}

5.为了方便利用action创建函数来分发(触发)action,redux提供了一个函数

bindactionCreators()   ,该函数用于增强action创建函数的功能,不仅能创建action对象,并且还可以直接自动分发

import { createStore, bindActionCreators } from 'redux'
import * as actionType from '../action/action-type'
import * as numberActions from '../action/number-action'
/**
 * reducer本质上就是一个普通函数
 * @param state 之前仓库中的状态(数据)
 * @param action 描述要做什么对象
 */
function reducer(state, action) {
    if (action.type === actionType.INCREASE) {
        return state + 1
    }
    else if (action.type === actionType.DECREASE) {
        return state - 1
    }
    return state
}

//创建共享仓库
const store = createStore(reducer, 10);
//第一个参数,时action创建函数的合并对象,,第二个参数时仓库的dispatch函数
//得到一个新对象,新对象中的属性名与第一个参数的属性名完全一致。
const bindAction = bindActionCreators(numberActions, store.dispatch)

console.log(store.getState())
//获取到action并且直接分发,不用在调用dispatch
bindAction.getIncreaseAction();

// store.dispatch(action);

console.log(store.getState())

Reducer(改变数据的函数)

1.一个数据仓库,有且只有一个reducer,一个工程,通常只有一个数据仓库,因此一个系统,中有一个reducer,

2.为了方便管理,一般会创建一个单独的reducer放在单独的文件

3.reducer被调用的时机。

  1.被store.dispatch,分发了一个action,此时,会调用reducer

  2.创建store仓库的时候,也会调用一次reducer函数(为了初始化)

    1.可以利用这一点,用reducer初始化状态。

    2.将reducer的state设定的一个默认值

  3.通常使用switch来进行判断

4.**reducer必须是一个没有副作用的纯函数**

 1.为什么要使用纯函数?

  纯函数有利于测试和调试

  有利于还原数据

  有利于将来和react结合时优化

 2.具体要求

  1.不能以任何形式改动参数 因此若要状态发生改变,需要返回一个新状态

  2.不可以异步

  3.不可以对外部环境造成影响

5.由于在大中型项目中,操作比较复杂,数据解构也比较复杂,因此,需要对reducer进行细分

  1.redux提供了方法,可以帮助我们更加方便的合并reducer

  2.combineReducers:合并reducer,得到一个新的reducer,该新的reducer管理一个对象,

 

store:用于保存数据的

createStore方法创建的对象

该对象的成员:

dispatch:分发一个action

getState:得当仓库当前状态

replaceReducer:替换掉当前的reducer

subscribe:增加一个监听器,监听仓库状态改变,分发(dispatch)后执行,该函数会返回一个函数,用于取消监听

posted @ 2021-01-04 16:21  漫漫长路上的求知者  阅读(181)  评论(0编辑  收藏  举报