11_redux

Redux

​ 在这之前我们对于状态的管理,都是通过 state 来实现的,比如,我们在给兄弟组件传递数据时,需要先将数据传递给父组件,再由父组件转发 给它的子组件。这个过程十分的复杂,后来我们又学习了消息的发布订阅,我们通过 pubsub 库,实现了消息的转发,直接将数据发布,由兄弟组件订阅,实现了兄弟组件间的数据传递。但是,随着我们的需求不断地提升,我们需要进行更加复杂的数据传递,更多层次的数据交换。因此我们为何不可以将所有的数据交给一个中转站,这个中转站独立于所有的组件之外,由这个中转站来进行数据的分发,这样不管哪个组件需要数据,我们都可以很轻易的给他派发。

而有这么一个库就可以帮助我们来实现,那就是 Redux ,它可以帮助我们实现集中式状态管理

什么情况使用 Redux ?

首先,我们先明晰 Redux 的作用 ,实现集中式状态管理

Redux 适用于多交互、多数据源的场景。简单理解就是复杂

从组件角度去考虑的话,当我们有以下的应用场景时,我们可以尝试采用 Redux 来实现

  1. 某个组件的状态需要共享时
  2. 一个组件需要改变其他组件的状态时
  3. 一个组件需要改变全局的状态时

除此之外,还有很多情况都需要使用 Redux 来实现

Redux 的工作流程

首先组件会在 Redux 中派发一个 action 方法,通过调用 store.dispatch 方法,将 action 对象派发给 store ,当 store 接收到 action 对象时,会将先前的 state 与传来的 action 一同发送给 reducer ,reducer 在接收到数据后,进行数据的更改,返回一个新的状态给 store ,最后由 store 更改 state

Redux 三个核心概念

store

store 是 Redux 的核心,可以理解为是 Redux 的数据中台,我们可以将任何我们想要存放的数据放在 store 中,在我们需要使用这些数据时,我们可以从中取出相应的数据。因此我们需要先创建一个 store ,在 Redux 中可以使用 createStore API 来创建一个 store

在生产中,我们需要在 src 目录下的 redux 文件夹中新增一个 store.js 文件,在这个文件中,创建一个 store 对象,并暴露它

因此我们需要从 redux 中暴露两个方法

import {
    createStore,
    applyMiddleware
} from 'redux'
//createStore专门用于创建redux中最为核心的store对象

并引入为 count 组件服务的 reducer

import countReducer from './count_reducer'

最后调用 createStore 方法来暴露 store

export default createStore(countReducer, applyMiddleware(thunk))

最精简的store.js

import { createStore } from 'redux'
import countReducer from './count_reducer'
export default createStore(countReducer)

store 对象下有一些常用的内置方法

需要在需要使用redux的文件内引入store

import store from '../../redux/store'

获取当前时刻的 store ,我们可以采用 getStore 方法

const state = store.getState();

在前面我们的流程图中,我们需要通过 store 中的 dispatch 方法来派生一个 action 对象给 store

store.dispatch('action对象')

最后还有一个 subscribe 方法,这个方法可以帮助我们订阅 store 的改变,只要 store 发生改变,这个方法的回调就会执行

为了监听数据的更新,我们可以将 subscribe 方法绑定在组件挂载完毕生命周期函数上,但是这样,当我们的组件数量很多时,会比较的麻烦,因此我们可以直接将 subscribe 函数用来监听整个 App组件的变化

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

1).引入redux中的createStore函数,创建一个store

2).createstore调用时要传入一个为其服务的reducer

3).记得暴露store对象

reducer

在 Reducer 中,我们需要指定状态的操作类型,要做怎样的数据更新,因此这个类型是必要的。

reducer 会根据 action 的指示,对 state 进行对应的操作,然后返回操作后的 state

如下,我们对接收的 action 中传来的 type 进行判断

export default function countReducer(preState = initState, action) {
    const {
        type,
        data
    } = action;
    switch (type) {
        case INCREMENT:
            return preState + data
        case DECREMENT:
            return preState - data
        default:
            return preState
    }
}

更改数据,返回新的状态

1).reducer的本质是一个函数。按收: preState,action,返回加工后的状态

2 ).reducer有两个作用:初始化状态,加工状态

3 ).reducer被第一次调用时,是store自动触发的,传递的preState是undefined I

redux只负责管理状态,至于状态的改变驱动着页面的展示,要靠我们自己写。

action

actionstore 中唯一的数据来源,一般来说,我们会通过调用 store.dispatch 将 action 传到 store

我们需要传递的 action 是一个对象,它必须要有一个 type

例如,这里我们暴露了一个用于返回一个 action 对象的方法

export const createIncrementAction = data => ({
    type: INCREMENT,
    data
})

创建 constant 文件

在我们正常的编码中,有可能会出现拼写错误的情况,但是我们会发现,拼写错误了不一定会报错,因此就会比较难搞。

我们可以在 redux 目录下,创建一个 constant 文件,这个文件用于定义我们代码中常用的一些变量,例如

export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'

将这两个单词写在 constant 文件中,并对外暴露,当我们需要使用时,我们可以引入这个文件,并直接使用它的名称即可

直接使用 INCREMENT 即可

import { INCREMENT } from './constant'

export const createIncrementAction = data => ({
    type: INCREMENT,
    data
})

异步action

我们可以先尝试将它封装到 action 对象中调用

//异步action,就是指action的值为函数
export const createIncrementAsyncAction = (data,time) =>{
    return ()=>{
        setTimeout(()=>{
            store.dispatch(createIncrementAction(data))
        },time)
    }
}

但是如果仅仅这样,很显然是会报错的,它默认需要接收一个对象

如果我们需要实现传入函数,那我们就需要告诉:你只需要默默的帮我执行以下这个函数就好!

这时我们就需要引入中间件,在原生的 redux 中暴露出 applyMiddleware 中间件执行函数,并引入 redux-thunk 中间件(需要手动下载)

import thunk from 'redux-thunk'

创建的store

import {
    createStore,
    applyMiddleware
} from 'redux'
export default createStore(countReducer, applyMiddleware(thunk))

下载)

import thunk from 'redux-thunk'

创建的store

import {
    createStore,
    applyMiddleware
} from 'redux'
export default createStore(countReducer, applyMiddleware(thunk))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傅里叶级数ff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值