react中dispatch_React详解react之redux

86c860d932757614c8474ed9d0ba2278.gif

2c369d2071c00d814bb703392d866e20.png

本文作者:开课吧木木
图文编辑:开三金

React的最后一篇基础课出来啦,前三节三金帮大家放到了专辑里,大家喜欢的可以去看哟。

4250013ea8dc40cb8328ac96333ea1fc.png

Redux的核心概念

Redux 是一个独立的 JavaScript 状态管理库。曾经有人说过这样一句话。

"如果你不知道是否需要 Redux,那就是不需要它。"

Redux 的创造者 Dan Abramov 又补充了一句。

"只有遇到 React 实在解决不了的问题,你才需要 Redux 。"

首先,我们要理解 Redux 几个核心概念与它们之间的关系:

○store

○state

○action

○reducer

StoreStore就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个Store。

Redux提供createStore这个函数,用来生成Store:

3c93c6dd3f0f3526448f8d6c71a778e5.png

上面代码中,createStore函数接受另一个函数作为参数,返回新生成的 Store 对象。

stateStore对象包含所有数据。如果想得到某个时点的数据,就要对Store生成快照。

这种时点的数据集合,就叫做State。

当前时刻的State,可以通过store.getState()拿到:

28e99e9e2e6d830d95451011041a74f8.png d038eb3138de007d438523afe78ca9f8.png

通过纯函数修改state

Redux 规定, 一个 State 对应一个 View。只要 State 相同,View 就相同。你知道 State,就知道 View 是什么样,反之亦然。

state是只读的。

这里需要注意的是,为了保证数据状态的可维护和测试,不推荐直接修改state中的原数据。

什么是纯函数?

1、相同的输入永远返回相同的输出

2、不修改函数的输入值

3、不依赖外部环境状态

4、无任何副作用

使用纯函数的好处?

1、便于测试

2、有利重构

ActionState 的变化,会导致 View 的变化。但是,用户接触不到 State,只能接触到 View。

所以,State 的变化必须是 View 导致的。Action 就是 View 发出的通知,表示 State 应该要发生变化了。

Action 是一个对象。其中的type属性是必须的,表示 Action 的名称。

其他属性可以自由设置:

f84b466836fa3134379f7a288a3d77ee.png 289119e8460979c1fe472a8a2d221da4.png

生成和使用Action

Action CreatorView 要发送多少种消息,就会有多少种 Action。

如果都手写,会很麻烦。

可以定义一个函数来生成 Action,这个函数就叫 Action Creator。

42ee61775a8399e1f098917b5abd9876.png

store.dispatch()store.dispatch()是 View 发出 Action 的唯一方法。

d3d22d790a23932bd761a11855ed8908.png

结合 Action Creator,这段代码可以改写如下。

store.dispatch(addTodo('LearnRedux'));

ReducerStore 收到 Action 以后,必须给出一个新的 State,这样 View 才会发生变化。

这种 State 的计算过程就叫做 Reducer。

Reducer 是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 State:

c41efdd823988bba346aa57e14e855fc.png

整个应用的初始状态,可以作为 State 的默认值。

下面是一个实际的例子:

8a0803548baac749798484d4cfa3d7cc.png

store.subscribe()Store 允许使用store.su-bscribe方法设置监听函数。

一旦 State 发生变化,就自动执行这个函数。

9094a2eada42c36ea9de5abe30a0b5d0.png

显然,只要把 View 的更新函数(对于 React 项目,就是组件的render方法或setState方法)放入listen,就会实现 View 的自动渲染。

store.subscribe方法返回一个函数,调用这个函数就可以解除监听:

3bf4c8d51d22abf51cd86f36e3da956f.png 432dc8df86297f96d093cdb8767a3bb7.png

Reducer 的拆分

Reducer 函数负责生成 State。

由于整个应用只有一个 State 对象,包含所有数据,对于大型应用来说。

这个 State 必然十分庞大,导致 Reducer 函数也十分庞大。

请看下面的例子:

1b43cf68d9f39851e453b9453e2116ca.png

上面代码中,三种 Action 分别改变 State 的三个属性:

ADD_CHAT:chatLog属性

CHANGE_STATUS:statusMessage属性

CHANGE_USERNAME:userName属性这三个属性之间没有联系。

这提示我们可以把 Reducer 函数拆分。

不同的函数负责处理不同属性,最终把它们合并成一个大的 Reducer 即可。

0d7c3de7bd61d22302c0fa34897f68f2.png

Redux 提供了一个combineReducers方法,用于 Reducer 的拆分。

你只要定义各个子 Reducer 函数,然后用这个方法,将它们合成一个大的 Reducer:

d3d22d790a23932bd761a11855ed8908.png

这种写法有一个前提,就是 State 的属性名必须与子 Reducer 同名。

如果不同名,就要采用下面的写法:

6fb1b06b663ed47a4dfc73e8554fa2ba.png

下面是combineReducer的简单实现。

97f087ffecf69d892b0e7cdcee14ee34.png

你可以把所有子 Reducer 放在一个文件里面,然后统一引入:

0d7c3de7bd61d22302c0fa34897f68f2.png

工作流程

首先,用户发出 Action。

    store.dispatch(action);

然后,Store 自动调用 Reducer,并且传入两个参数:

当前 State 和收到的 Action。 

Reducer 会返回新的 State 。

6fb1b06b663ed47a4dfc73e8554fa2ba.png

State 一旦有变化,Store 就会调用监听函数。

a4825cbb7e6775660a3b656fdfe320cb.png

listener可以通过store.getState()得到当前状态。

如果使用的是 React,这时可以触发重新渲染 View。

Provider 组件:

想在 React 中使用 Redux ,还需要通过 react-redux 提供的 Provider 容器组件把 store 注入到应用中

08f46866217010da4850d5a0d07da4ab.png

connect 方法:

有了 connect 方法,我们不需要通过 props 一层层的进行传递, 类似路由中的 withRouter 

我们只需要在用到 store 的组件中,通过 react-redux 提供的 connect 方法。

把 store 注入到组件的 props 中就可以使用了

7d61fc6aabcf74a464ad96b2081bc274.png

注入 state 到 props

79f0b8a86ea304a4ad16c164bf21856d.png

connect 方法的第一个参数是一个函数

该函数的第一个参数就是 store 中的 state : store.getState()

该函数的返回值将被解构赋值给 props : this.props.items

redux-chunk

这是一个把同步 dispatch 变成异步 dispatch 的中间件。

安装:

cb96e5f062237c96bb58760a6f53615c.png

到这里,关于React的基础篇就全部更新完啦~
接下来我们会制作一系列关于【图形选择】的干货文章,非常适合需要夯实前端基础的同学!
对于前端基础较高的同学,我们也会为大家分享优质、深入的前端领域干货

还有非常实用的小道具推荐,还有每周五必更的【三金叨叨叨】

更多好文都在【开课吧前端团队】

再次感谢各位小伙伴的支持~

2c369d2071c00d814bb703392d866e20.png

0eeb18b92f65dd5a6526b348b081bfea.png b8850b44cdfa0e013f0e8a25e19c87ed.png e8d83f5451c1e280127d343385616e46.png 917f987277016ba3f55bbdf6f706f76e.png

你“在看”我吗?

9eaad806e44aaca12e52414e309bb567.png
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值