Redux中的store、action和reducer

3 篇文章 0 订阅

目录

 

1.store

2.action

3.reducer

4.用通俗的例子解释它们之间的关系

4.1redux三剑客

4.2现实世界和物流中心的管道 connect(react组件和redux的对接)

4.3案例分析


1.store

store的结构图

store其实是一个虚拟概念,由dispatcher  reducer state构成。

  1. dispatcher是一个函数,用于广播action,将action传给所有的reducer。reducer处理它,然后对state进行更新。
  2. reducer是一个函数,用于通过action对state进行更新。
  3. state是一个对象,对数据进行储存。

创建一个store使用createStore(reducer, [initialState], enhancer)函数。

例如:const store = createStore(reducer);

store中常用的3个方法:

  1. getState()  用于获取state
  2. dispatch(action) 用于将action广播给reducer
  3. subscribe(callBack) 当state被更新时,那么调用callBack回调函数。

2.action

store.dispatch(action)

简单的说就是一种描述行为的数据结构。

举个例子

{ type: "add" , text : "update the state"};

这个就是一个action。类型是"add",行为说明:更新state。

3.reducer

reducer(state,action)

reducer是一个函数,用于通过action对state进行更新

看如下例子

  const initState = { count: 0 };
  const counter = (state = initState, action) => {
    switch (action.type) {
      case "add":
        return { count: state.count + 1 };
      case "sub":
        return { count: state.count - 1 };
      case "addAny":
        return { count: state.count + action.num };
      default:
        break;
    }
    return state;
  };

counter就是一个reducer,它有两个参数,第一个是state(有一个默认值),第二个是一个action。

reducer通过对action.type进行判断,来决定通过哪种方法更新state。

注意reducer必须返回一个新的state,修改原来的state没有用。

state + action = newState

 

4.用通俗的例子解释它们之间的关系

4.1redux三剑客

store ----->物流仓库中心

store,把它想象成一个物流仓库中心,数据(state)就是一个个包裹。

action ---->包裹的包装 store.dispatch(action)

为了便于对包裹的管理,需要给它们进行包装store.dispatch(action),比如打上标签action.type,标明这是联邦快递,还是申通快递,你是要寄快递还是退快递,要发到江浙沪,还是发到偏远地带…那对于一个新来的包裹,首先要做的第一步就是包装,这一步由action完成。

reducer---->根据包裹的标签做针对性的处理 reducer(state,action)

圆通的快递员处理圆通快递,申通的快递员处理申通的快递,这一步,由reducer完成,他根据action.type做针对性的处理。如果我想向物流仓库中心发一个快递,就通过store的dispatch方法,先给包裹包装,然后丢到物流中心由一个个快递员(reducer)进行处理。

4.2现实世界和物流中心的管道 connect(react组件和redux的对接)

connect(
	mapStateToProps,
	mapDispatchToProps,
)(App)

onnect:作为现实世界和物流中心的管道,他能实时得知任何一个包裹的物流进度,这个包裹是在揽件,还是停留在某个地方。这些信息connect通过一个函数mapStateToProps()作为参数,在这个函数中有一个state的参数,这个参数就存放着整个物流中心包裹实时物流情况,非常宝贵。那么就可以对这个信息做各种处理mapDispatchToProps,比如某人发了一个圆通快递,从上海发往北京,那mapStateToProps()就可以针对这个包裹的state进行实时更新,他的每一次更新,都可以通过单向数据流的方式传递给那个发快递的人(子组件)。

4.3案例分析

比如有这样一个需求,北京想要得知整个中国的天天快递物流情况,该怎么办?

很简单,通过redux进行统一管理:

整个中国每一个人发包裹都要通过唯一的物流中心store,这个物流中心暴露一个dispatch方法store.dispatch(action),用于发快递,比如你要寄天天快递去北京,你就要这样dispatch(tiantian({target:"beijing",msg:'神秘大礼包'})),将快递丢到物流中心,物流中心的天天快递员(reducer)便会对其进行处理。

那么作为掌握第一手宝贵信息的connect,会实时得知来了一个快递,mapStateToProps()通过对state进行分析发现。哎嘿,是天天快递,于是更新了天天快递的物流信息mapDispatchToProps,最后组件通过props的方式传递给北京,于是北京就能实时掌握全国的天天快递物流信息了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redux是一个用于JavaScript应用程序的可预测状态容器,它可以帮助我们更好地管理应用程序的状态。而ReducerRedux用于处理状态变化的函数,它接收先前的状态和一个动作对象作为参数,并返回新的状态。Reducer的设计灵感来自于JavaScript的Array.prototype.reduce()方法,因为它们都是将先前的值和当前的值组合成一个新值的过程。在ReduxReducer通常是纯函数,它们不会修改先前的状态,而是返回一个新的状态对象。 下面是一个简单的Redux应用程序,其包含一个Reducer: ```javascript // 定义初始状态 const initialState = { count: 0 }; // 定义Reducer function counterReducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } } // 创建Redux store const { createStore } = Redux; const store = createStore(counterReducer); // 订阅状态变化 store.subscribe(() => { console.log(store.getState()); }); // 分发动作 store.dispatch({ type: 'INCREMENT' }); // 输出:{ count: 1 } store.dispatch({ type: 'INCREMENT' }); // 输出:{ count: 2 } store.dispatch({ type: 'DECREMENT' }); // 输出:{ count: 1 } ``` 在上面的例子,我们定义了一个名为`counterReducer`的Reducer函数,它接收先前的状态和一个动作对象作为参数,并返回一个新的状态对象。我们还创建了一个Redux store,并将`counterReducer`作为参数传递给`createStore`函数。最后,我们分发了一些动作,并在控制台打印了状态变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值