【React】Redux基本使用

什么情况使用 Redux ?

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

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

某个组件的状态需要共享时
一个组件需要改变其他组件的状态时
一个组件需要改变全局的状态时
下面这张图,将纯 React 和 采用 Redux 的区别体现了出来
在这里插入图片描述

Redux 三个核心概念

store

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

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

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

import {
    createStore,
    applyMiddleware
} from 'redux'

并引入为组件服务的 reducer,这里我们叫count组件,所以叫count_reducer

 import countReducer from './count_reducer'

最后调用 createStore 方法来暴露 store

export default createStore(countReducer)
内置方法

在 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'))
})

action

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

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

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

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

我们调用它时,会返回一个 action 对象

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
    }
}

更改数据,返回新的状态

Redux 的工作流程

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

Redux 三大原则

理解好 Redux 有助于我们更好的理解接下来的 React -Redux

第一个原则

单向数据流:整个 Redux 中,数据流向是单向的

UI 组件 —> action —> store —> reducer —> store

第二个原则

state 只读:在 Redux 中不能通过直接改变 state ,来控制状态的改变,如果想要改变 state ,则需要触发一次 action。通过 action 执行 reducer

第三个原则

纯函数执行:每一个reducer 都是一个纯函数,不会有任何副作用,返回是一个新的 state,state 改变会触发 store 中的 subscribe

节选自 React-Redux 基本使用.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/144117.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试:PO模式设计框架详解

引言 你是否曾经因为每次更新功能都要重新写一堆自动化测试代码而感到疲惫不堪&#xff1f; 或者因为页面元素的频繁变动而不得不持续地修复测试脚本&#xff1f; 如果你也有这些苦恼&#xff0c;那么PO模式设计框架可能是解决之道。它可以让你以更简单、更高效的方式编写自…

SM5203 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器

SM5203 1.2A/18V 锂电池线性充电芯片 简介&#xff1a; SM5203 是一款完整的采用恒定电流/恒定电压的单节锂电池线性充电器&#xff0c;并带有锂电池正负极反接保护功能&#xff0c;可以保护芯片和用户安全。由于采用了内部 PMOSFET 架构&#xff0c;加上防倒充电路&#xff…

前端开发人员应该知道的低代码系统知识和开源低代码开发平台

前端开发有多重要 前端一般指前端开发&#xff0c;主要是通过各种前端技术及工具进行产品界面开发&#xff0c;制定标准化代码&#xff0c;另外还要在页面增加交互的动态功能&#xff0c;通过技术改善用户体验&#xff0c;使得Web界面可以更友好的与用户互动。 前端开发是创建…

劲松HPV防治诊疗中心谭巍主任建议:这样锻炼可促使hpv转阴

锻炼可以帮助我们提升身体素质&#xff0c;也有利于身体健康&#xff0c;然而锻炼对于促进HPV转阴也有一定帮助&#xff0c;但并不是唯一的有效方法&#xff0c;即便如此锻炼仍然在hpv转阴方面发挥着一定作用。以下是一些建议&#xff0c;希望可以帮助你通过锻炼来促进HPV转阴&…

【python】Django——templates模板、静态文件、django模板语法、请求和响应

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 templates模板按app顺序寻找模板全局模板 静态文件jqueryBootstrap dja…

C语言--数组的长度计算【详细解释】

一.数组的长度计算公式 我们都知道字符串有特定的函数strlen,而数组没有&#xff0c;&#xff08;虽然字符串也是一种特殊的数组&#xff09; 但是&#xff0c;类似于这样的数组&#xff1a; int arr[]{12,89,1,5,31,78,45,12,12,0,45,142,21,12}&#xff1b; 我们很难一眼…

浏览器存储(localStorage和sessionStorage)

我们知道 js 写的效果&#xff0c;每次刷新都是从新执行&#xff0c;是不存在记录操作的&#xff0c;主要是大部分的效果不需要这样的处理 (一个 tab 切换&#xff0c;焦点图肯定不需要记住运行到哪里&#xff0c;刷新从新开始就好了)&#xff01; 在 html5 之前&#xff0c;前…

DDR SDRAM 学习笔记

一、基本知识 1.SDRAM SDRAM : 即同步动态随机存储器&#xff08;Synchronous Dynamic Random Access Memory&#xff09;, 同步是指其时钟频率与对应控制器&#xff08;CPU/FPGA&#xff09;的系统时钟频率相同&#xff0c;并且内部命令 的发送与数据传输都是以该时钟为基准…

gin索引 btree索引 gist索引比较

创建例子数据 postgres# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; SELECT 5000000postgres# vacuum ANALYZE t_hash; VACUUMpostgres# \timing Timing is on. postgres# select * from t_hash limit 10;id | …

八个开源免费单点登录(SSO)系统

使用SSO服务可以提高多系统使用的用户体验和安全性&#xff0c;用户不必记忆多个密码、不必多次登录浪费时间。下面推荐一些市场上最好的开源SSO系统&#xff0c;可作为商业SSO替代。 单点登录&#xff08;SSO&#xff09;是一个登录服务层&#xff0c;通过一次登录访问多个应…

做外贸一个小失误可能会带来大的损失

在外贸里&#xff0c;虽然很多事情都是不可控的&#xff0c;但是我们还是需要做好自己该做的事情&#xff0c;将危险和不可控降低到最低的程度。那如何能够降低到最低呢&#xff1f; 比如在做合同&#xff0c;发票或者单据的时候&#xff0c;我们可能会喜欢依照公司固定的模板…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

【iOS】将网络请求封装在一个单例类Manager中(AFNetworking、JSONModel)

项目开发中会请求大量不同的API&#xff0c;若将网络请求三板斧直接写在Controller中会代码十分冗杂&#xff0c;干脆直接将AFNetWorking和JSONModel封装到一个全局的Manager单例类中&#xff0c;在Manager类中进行网络请求和数据解析 导入AFNetworking和JSONModel 参考【iOS…

linux查看端口占用情况

lsof命令 lsof(list open files)命令可以列出当前系统中打开的所有文件&#xff0c;包括网络端口。可以使用lsof命令查看某个端口被哪个进程占用。 具体的命令为&#xff1a;sudo lsof -i :端口号&#xff0c;其中端口号为需要查询的端口号。 netstat命令 使用netstat命令&a…

很全的家政小程序功能开发攻略;

随着互联网的发展&#xff0c;家政行业也逐步走向数字化。为了满足用户的需求&#xff0c;家政APP的开发成为了热门趋势。那么&#xff0c;如何定制开发一款家政APP呢&#xff1f;下面将为大家详细介绍。 1. 明确需求&#xff1a;首先需要明确家政APP的功能&#xff0c;包括预约…

SAP 事件:SET PF-STATUS 和AT LINE-SELECTION共用

Write List中&#xff0c;如果同时使用了SET PF-STATUS 和 AT LINE-SELECTION,会发现双击的时候不好用了&#xff01; 怎么办&#xff1f;其实&#xff0c;只要设置F2功能键”PICK”就OK了。 2007年12月11日修改&#xff1a; 如图&#xff1a; 例: REPORT z_barry_test_pic…

中海达为第七届全国水文勘测技能大赛保驾护航

11月6日至11日&#xff0c;第十届全国水利行业职业技能竞赛暨第七届全国水文勘测技能大赛在广东韶关成功举办。作为本次大赛相关设备技术保障团队&#xff0c;中海达积极提供全方位的技术支持和保障服务&#xff0c;助力大赛顺利进行。 ▲开幕式现场 全国水文勘测技能大赛自199…

【入门Flink】- 11Flink实现动态TopN

基本处理函数&#xff08;ProcessFunction&#xff09; stream.process(new MyProcessFunction())方法需要传入一个 ProcessFunction 作为参数&#xff0c;ProcessFunction 不是接口 &#xff0c; 而是一个抽象类 &#xff0c;继承了AbstractRichFunction&#xff0c;所有的处…

墓园殡仪馆服务预约小程序的作用

生老病死是人之常情&#xff0c;也是每个人需要面对的&#xff0c;墓园作为生活服务行业里特殊的细分类别&#xff0c;往往不被人提起&#xff0c;但又有很高的需求度&#xff0c;几乎可以说每天都有大小生意&#xff0c;比如殡葬用品、祭扫预约、位置服务等。 对墓园管理公司而…

新能源充电桩物联网应用之工业4G路由器

新能源充电桩是智慧城市建设中不可缺少且可持续发展的重要设施&#xff0c;而工业4G路由器物联网应用为其提供了更加高效、智能、实时的管理方式。充电桩通过工业4G路由器可以与充电运营商的管理中心建立稳定的连接&#xff0c;实现双向数据传输&#xff0c;为用户提供优质的充…