一文搞懂redux在react中的初步用法


Posted in Javascript onJune 09, 2021

Redux是一个数据状态管理插件,当使用React或是vue开发组件化的SPA程序时,组件之间共享信息是一个非常大的问题。例如,用户登陆之后客户端会存储用户信息(ID,头像等),而系统的很多组件都会用到这些信息,当使用这些信息的时候,每次都重新获取一遍,这样会非常的麻烦,因此每个系统都需要一个管理多组件使用的公共信息的功能,这就是redux的作用。

如果你是从来没有接触过redux的开发者,希望您能够有耐心的看一看,我也是看好很多博客慢慢自己总结的!!!!比大佬们一个一个分布找要强一点。

import React, { Component, Fragment } from 'react';

//Class引入
import { connect } from 'react-redux';

//Hook引入
import { useSelector, useDispatch } from 'react-redux'

import { add, clear } from '../../redux/actions/count';


//hook 展示组件
const CountItem = (props) => {
    // 解构出来
    const {
        count,
        flag,
        add,
        clear
    } = props
    return (
        <>
            <h2>当前求和为:{count}</h2>
            <h3>当前Flag:{flag ? 'true' : 'false'}</h3>
            <button onClick={add}>点击+1</button>
            <button onClick={clear}>清零</button>
        </>
    )
}

//hook 容器组件
const Count = () => {
    const count = useSelector(state => state.sum)
    const flag = useSelector(state => state.flag)
    const dispatch = useDispatch()

    const countAdd = () => {
        console.log(add.type)
        dispatch(add(1))
    }

    const clearNum = () => {
        dispatch(clear())
    }

    return <CountItem count={count} flag={flag} add={countAdd} clear={clearNum}  />
}

export default Count



// class 展示组件
// class Count extends Component {
//     add = () => {
//         // 通知redux
//         this.props.add(1);
//     };
//     clear = () => {
//         this.props.clear();
//     };
//     render() {
//         return (
//             <Fragment>
//                 <h2>当前求和为:{this.props.count}</h2>
//                 <h3>当前Flag:{this.props.flag ? 'true' : 'false'}</h3>
//                 <button onClick={this.add}>点击+1</button>
//                 <button onClick={this.clear}>清零</button>
//             </Fragment>
//         );
//     }
// }

// class 容器组件
// export default connect(
//     // 1.状态
//     state => ({ count: state.sum, flag: state.flagState }),
//     // 2.方法
//     { add, clear }
// )(Count);

基本的使用差不多就是这个样子,我们在hook上面用到的关键方法就是useSelector来使用redux的state、用dispatch来调用reduce;在class组件中用connect进行state和方法(reduce)的关联。

这里面难点就在于reduce和state

这里的reduce是什么

上面的代码里面我们用到了add和clear这两个方法,我们新建一个js文件来实现这两个方法。

// 为Count组件创建action对象
// 引入常量
import { ADD, CLEAR } from '../constant';

// 创建加一action对象的函数
export const add = data => ({
    type: ADD,
    data,
});

// 创建清零action对象的函数
export const clear = data => ({
    type: CLEAR,
    data,
});

上面有常量----这是为了方便actionType的统一管理,创建对应的action对象有助于代码模块化。
贴上,自己建一个constant.js放进去

export const ADD = 'add';
export const CLEAR = 'clear';

到这里我们的action对象定义的差不多了,我们要进行reducer的管理了。也就是dispatch分发上面的action对象来实现state的更新

在reducer文件夹里面我们定义一个count.js

// 为Count组件创建一个reducer
// reducer接收两个参数:之前状态的preState,动作对象action

import { ADD, CLEAR } from '../constant.js';

// 设定初始状态
const initState = 0;

export default function addReducer(preState = initState, action) {
    // 从action中获取type和data
    const { type, data } = action;
    // 根据type决定如何加工数据
    switch (type) {
        case ADD:
            return preState + data;
        case CLEAR:
            return 0;
        // 初始化动作
        default:
            return preState;
    }
}

上面的方法要通过dispatch来进行type的分发调用(强调加一)

到这里使用就完成了 接下来看配置redux到react项目中

这里就不要倒叙了,因为这里倒叙不合理。
这里关键的几个配置
store.js的配置和全局的store的使用

先看全局使用store
在你的根路由下面用Provider包裹App。

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx';
import store from './redux/store';
import { Provider } from 'react-redux';

ReactDOM.render(
    // Provider包裹App,目的:让App所有的后代容器组件都能接收到store
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
);

这里面有个redux/store.js 看代码

// 整个文档只有一个store对象,createStore接收两个参数,第一个是state树,第二个是要处理的action
//applyMiddleware 汇总所有的中间件变成一个数组依次执行,异步处理
import { createStore, applyMiddleware } from 'redux';
//中间件
import thunk from 'redux-thunk';
//汇总所有的reducer
import allReducers from './reducers/index';
//这里是goole的调试调试工具,具体使用:百度
import { composeWithDevTools } from 'redux-devtools-extension';

// 暴露store
export default createStore(allReducers, composeWithDevTools(applyMiddleware(thunk)));

到这里这篇文章就要结束了,里面的一些执行流程和原理我还不是理解,接下来仍要多多巩固,多多学习。

以上就是一文解决redux在react中的初步使用的详细内容,更多关于redux在react中使用的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
ExtJs中gridpanel分组后组名排序实例代码
Dec 02 Javascript
了不起的node.js读书笔记之node.js中的特性
Dec 22 Javascript
跟我学习javascript的隐式强制转换
Nov 16 Javascript
JSON遍历方式实例总结
Dec 07 Javascript
纯js和css完成贪吃蛇小游戏demo
Sep 01 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 Javascript
w3c编程挑战_初级脚本算法实战篇
Jun 23 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
Jul 20 Javascript
在vue中读取本地Json文件的方法
Sep 06 Javascript
vue打包之后生成一个配置文件修改接口的方法
Dec 09 Javascript
深入详解JS函数的柯里化
Jun 09 #Javascript
javascript canvas实现雨滴效果
用JS实现飞机大战小游戏
Jun 09 #Javascript
原生JS实现飞机大战小游戏
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 #Vue.js
JavaScript如何优化逻辑判断代码详解
Jun 08 #Javascript
浅谈react useEffect闭包的坑
You might like
转换中文日期的PHP程序
2006/10/09 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
django的登录注册系统的示例代码
2018/05/14 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
UNIX文件系统分类
2014/11/11 面试题
护理个人求职信范文
2014/01/08 职场文书
企业文化理念标语
2014/06/10 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
党员证明信
2015/06/19 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang