一文搞懂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 相关文章推荐
Extjs407 getValue()和getRawValue()区别介绍
May 21 Javascript
div失去焦点事件实现思路
Apr 22 Javascript
用循环或if语句从json中取数据示例
Aug 18 Javascript
js实现飞入星星特效代码
Oct 17 Javascript
用js读、写、删除Cookie代码续篇
Dec 03 Javascript
阻止表单提交按钮多次提交的完美解决方法
May 16 Javascript
使用angular帮你实现拖拽的示例
Jul 05 Javascript
layui table设置前台过滤转义等方法
Aug 17 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
Sep 20 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
Oct 23 Javascript
原生JS实现多条件筛选
Aug 19 Javascript
利用JavaScript模拟京东按键输入功能
Dec 01 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
PHP4之COOKIE支持详解
2006/10/09 PHP
php 分页类 扩展代码
2009/06/11 PHP
mysql下创建字段并设置主键的php代码
2010/05/16 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
客户端静态页面玩分页
2006/06/26 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
Python变量赋值的秘密分享
2018/04/03 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Python中Unittest框架的具体使用
2019/08/27 Python
python实例化对象的具体方法
2020/06/17 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
简历里的自我评价范文
2014/02/24 职场文书
大学生毕业求职信
2014/06/12 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
2019军训心得体会
2019/06/27 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python