redux工作原理工作流程以及代码详解(React中的应用)

React中Redux工作原理工作流程以及代码详解

redux是什么?
简单说来就2点
1、redux是一个专门用于做状态管理的JS库,并非react插件库,但基本和react配合开发使用
2.其作用:集中式管理react应用中多个组件共享的状态,及负责管理状态
什么情况下需要使用redux?
1、某个组件的状态,需要让其他组件随时拿到共享
2、一个组件需要改变另一个组件的状态(或是通信)
简单画下redux原理图:
在这里插入图片描述下面以一个求和的小demo对redux进行代码演示:实现加、减、奇数加、异步加
代码详解:
1、安装redux:

yarn add redux

1、新建action.js自行命名即可:该文件专门为Count组件生成action对象

//该文件专门为Count组件生成action对象
import{INCREMENT,DECREMENT} from './constant'
//加法
export function createIncrementAction(data){
    return {type:INCREMENT,data:data}
}
//简约写法:
// export const createIncrementAction = data =>({type:'increment',data:data})
//减法
export function createDecrementAction(data){
    return {type:DECREMENT,data:data}
}

2、**(核心)**新建store.js自行命名即可:该文件专门用于暴露一个store对象,整个应用只有一个store对象

// 该文件专门用于暴露一个store对象,整个应用只有一个store对象

//引入createStore,专门用于创建redux中最为核心的store对象
// import {createStore} from 'redux'
//createStore已经启用改用:
import {legacy_createStore as createStore} from 'redux'

//引入为Count组件服务的reducer
import countReducer from './count_reducer'

//store暴露出去
export default createStore(countReducer)

3、新建reducer.js自行命名即可:该文件用于创建一个为Count求和组件服务的reducer、reducer本质就是一个函数

// 1.该文件用于创建一个为Count组件服务的reducer、reducer本质就是一个函数
//2.reducer函数会接收到两个参数,分别为:之前的状态(preState),动作对象(action)
import{INCREMENT,DECREMENT} from './constant'
export default function countReducer(preState, action) {
    console.log(preState)
    //初始化判断
    if(preState===undefined) preState = 0
    //从action对象中获取type和date
    const { type, data } = action
    //根据type决定如何加工数据
    switch (type) {
        case INCREMENT:
            return preState + data//加
        case DECREMENT:
            return preState - data//减
        default:
            return preState
    }
}

4、(可以不用)新建constant.js自行命名即可:该文件是用于定义action对象中type类型的常量值(规范开发,建议也对redux相关常量进行集中管理)

//该文件是用于定义action对象中type类型的常量值
//目的为了便于同时管理action的动作对象,可以不用
export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'

5、Count求和组件代码:

import React, { Component } from 'react'
//引入store,用于获取redux中保存的状态
import store from '../../redux/store'
//引入actionCreator,专用于创建action对象
import {createDecrementAction,createIncrementAction} from '../../redux/count_action'

export default class Count extends Component {
    state = { myState: '自身独有的state' }

    componentDidMount() {
        //监测redux中状态的变化,只要变化,就调用render()
        store.subscribe(() => {
            //此处作用是为了更新render,即执行setState就会触发render
            this.setState({})
        })
    }
    //加法
    increment = () => {
        const { value } = this.selectNumber
        //自己创建的action
        // store.dispatch({ type: 'increment', data: value * 1 })
        //通过actionCreator创建的action
        store.dispatch(createIncrementAction(value*1))
    }
    //减法
    decrement = () => {
        const { value } = this.selectNumber
        store.dispatch(createDecrementAction(value*1))
    }
    //奇数再加
    incrementIfOdd = () => {
        const { value } = this.selectNumber
        const count = store.getState()
        if (count % 2 !== 0) {
            store.dispatch(createDecrementAction(value*1))
        }
    }
    //异步加
    incrementAsyc = () => {
        const { value } = this.selectNumber
        setTimeout(()=>{
            store.dispatch(createDecrementAction(value*1))
        },500)
    }
    render() {
        return (
            <div>
                <h1>当前求和为:{store.getState()}</h1>
                <select ref={c => this.selectNumber = c}>
                    <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}>当前求和为奇数再加</button>&nbsp;
                <button onClick={this.incrementAsyc}>异步加</button>&nbsp;
            </div>
        )
    }
}

6、App.jsx代码:

import React, { Component } from 'react'
import Count from './components/Count'

export default class App extends Component {
  render() {
    return (
      <div>
        <Count/>
      </div>
    )
  }
}

说明:
1、store.js:
(1)引入redux中的legacy_createStore(备注:createStore已废弃),创建一个store
(2)legacy_createStore调用时要传入一个为其服务的reducer
(3)暴露store对象
2、reducer.js:
(1)该文件用于创建一个为Count组件服务的reducer、reducer本质就是一个函数,接收preState,action、返回加工后的状态
(2)reducer有2个作用:初始化函数、加工状态
(3)reducer被第一次调用时,是store触发的,
传递的preState是undefined,
传递的action是类似如下格式数据:
{type: “@@redux/INITr.y.u.u.5.o”}
3、action.js:该文件专门为所服务的组件生成action对象
4、constant.js:统一管理action中相关的常量,同时也避免写错常量字段
5、备注:可在index.js入口文件中监测store中状态的改变,一旦发生改变重新渲染
代码如下:
原来:

ReactDOM.render(
    <App/>,
    document.getElementById('root')
)

新增监测后:记得引入store

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

补充:
redux只负责管理状态,至于状态的改变驱动着页面的展示,需要我们自己实现

搞定、兄弟萌赶快试试叭!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redux是一个用于管理应用程序状态的JavaScript库。它遵循一种称为"单一状态树"的设计模式,其应用程序的整个状态被存储在一个单一的JavaScript对象Redux工作流程可以概括为以下几个步骤: 1. 创建store:使用Redux创建一个store来存储应用程序的状态。store是一个JavaScript对象,它包含了应用程序的整个状态树。 2. 定义reducer:reducer是一个纯函数,用于根据先前的状态和一个action来计算新的状态。它接收两个参数:先前的状态和一个action,并返回一个新的状态。reducer负责更新store的状态。 3. 分发action:通过调用store的dispatch方法来分发一个action。action是一个描述发生了什么的普通JavaScript对象,它必须包含一个type属性指示要执行的操作。 4. reducer处理action:当action被分发后,reducer会根据action的type属性来决定如何处理该action。reducer会基于先前的状态和action来计算新的状态,并返回给store。 5. 更新store:reducer返回的新状态将被存储在store,替换先前的状态。 6. 更新UI:一旦store的状态发生变化,React组件将重新渲染以反映最新的状态。组件可以使用store的状态来更新其自身。 总结起来,Redux工作流程可以概括为:创建store -> 定义reducer -> 分发action -> reducer处理action -> 更新store -> 更新UI。通过这种方式,Redux提供了一种可预测性和可控性的状态管理方案,使得应用程序的状态管理更加清晰和易于维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值