React学习7 redux

news2024/12/23 3:37:58

 

 redux的三个核心概念

1. action

  1. 动作的对象
  2. 包含2个属性
    1. type:标识属性, 值为字符串, 唯一, 必要属性
    2. data:数据属性, 值类型任意, 可选属性
  3. 例子:{ type: 'ADD_STUDENT',data:{name: 'tom',age:18} }

2. reducer

  1. 用于初始化状态、加工状态。
  2. 加工时,根据旧的stateaction 产生新的state纯函数

3. store

  1. stateactionreducer联系在一起的对象
  2. 如何得到此对象?
            1. import {createStore} from 'redux'
            2. import reducer from './reducers'
            3. const store = createStore(reducer)
  3. 此对象的功能?
            1. getState(): 得到state
            2. dispatch(action): 分发action, 触发reducer调用, 产生新的state
            3. subscribe(listener): 注册监听, 当产生了新的state时, 自动调用

 

/**入口传递store对象**/
class App extends Component {
    render() {
        return (
            <div>
                <Count store={store}/>
            </div>
        );
    }
}


/**connect容器连接UI组件与store,向UI组件传递state和dispatch**/

import CountUI from '../../components/Count'
import { connect } from 'react-redux'
import {createIncrementAction, createDecrementAction, createIncrementAsyncAction} from "../../components/redux/count_action";

function mapStateToProps(state) {
    return {count: state}
}

function matchDispatchToProps(dispatch) {
    return {
        increment:(number)=>{
        dispatch(createIncrementAction(number))
        },
        decrement:(number)=>{
            dispatch(createDecrementAction(number))
        },
        incrementAsync:(number, time)=>{
            dispatch(createIncrementAsyncAction(number, time))
        }
    }
}
export default connect(mapStateToProps, matchDispatchToProps)(CountUI)



/**UI组件中通过props进行调用**/
increment = ()=>{
    const {value} = this.selectNumber
    // console.log(this.props.jia)
    this.props.increment(value*1)
}



/**创建store**/

import { legacy_createStore as createStore , applyMiddleware} from 'redux'
import countReducer from './count_reducer'
import thunk from 'redux-thunk'

export default createStore(countReducer, applyMiddleware(thunk))



/**为store服务的reducer**/
import {DECREMENT, INCREMENT} from "./constant";

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

 

Provider给每一个redux容器组件提供store,不用挨个去传递store

      <Provider store={store} >
        <Router />
      </Provider>

常规写法:

//创建action
import {ADD_PERSON} from "./constant";



export const createAddPersonAction = (personObj) => {
    return {
        type: ADD_PERSON,
        data: personObj
    }
}


//创建reducer
import {ADD_PERSON} from "./constant";


const initState = [{id:'001', name:'tom', age:18}]
export default function personReducer(preState=initState, action) {
    const {type, data} = action
    switch (type) {
        case ADD_PERSON:
            return [data, ...preState]
        default:
            return preState
    }
}


//store中绑定汇总后的reducer
import { legacy_createStore as createStore , applyMiddleware, combineReducers} from 'redux'
import countReducer from './count_reducer'
import thunk from 'redux-thunk'//支持异步action
import personReducer from "./person_reducer";


const allReducer = combineReducers({
    count:countReducer,
    person:personReducer
})

export default createStore(allReducer, applyMiddleware(thunk))



使用redux devtools插件:

import { legacy_createStore as createStore , applyMiddleware, combineReducers} from 'redux'
import countReducer from './count_reducer'
import thunk from 'redux-thunk'//支持异步action
import personReducer from "./person_reducer";
import {composeWithDevTools} from 'redux-devtools-extension'

const allReducer = combineReducers({
    count:countReducer,
    person:personReducer
})

export default createStore(allReducer, composeWithDevTools(applyMiddleware(thunk)))

项目本地打包运行:

npm run build

npm install serve -g

serve build

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

健身器材开发方案,带有12位ADC检测、LED屏显的语音IC-N9300

身体锻炼过程中所使用到的所有物品&#xff0c;健身器材类体育用品则主要涉及健身领域&#xff0c;包括室外健身器材和室内健身器材。 每天清晨或傍晚跑跑步&#xff0c;不仅能提高身体素质同时能得到很好的瘦身效果。然而大部分人觉得慢跑等运动过于无聊没有给予运动者本身进行…

【Redis编译安装】---redis-4.0.8

【Redis编译安装】---redis-4.0.8 &#x1f53b; 一、Redis 编译安装1.1 ⛳ 上传解压1.2 ⛳ 升级gcc环境1.3 ⛳ 编译安装1.3.1 &#x1f341;cd 到redis解压目录1.3.2 &#x1f341;编译1.3.3 &#x1f341; make test1.3.4 &#x1f341; 安装tcl-8.51.3.5 &#x1f341; 安装…

shell 第十一章

1.写一个库函数&#xff0c;用定时任务调用这个库函数&#xff0c;每月1号执行 1.sh: 1.1.sh: 2.以免交互的方式实现 ssh 远程登录&#xff0c;密码错误也直接退出&#xff0c;不用人干预 3.以免交互的方式&#xff0c;实现磁盘分区、格式化、挂载

Keysight 34970A数据采集记录仪产品介绍

Keysight 34970A数据采集记录仪 Keysight 34970A数据采集记录仪开关单元由一个 3 插槽主机和一个内置的 6 1/2 位数字万用表组成。每个通道可以单独配置&#xff0c;以测量 11 种不同功能之一&#xff0c;这样既不会增加成本&#xff0c;也不必使用复杂的信号调理附件。您可用…

【干货】PCB材料选择与性能比较

PCB板被广泛应用于电子行业&#xff0c;作为电子设备的重要组成部分之一&#xff0c;负责连接各种电子元件。PCB板的性能直接影响着电子设备的质量和稳定性。而PCB板的材料选择则是影响PCB板性能的关键因素之一。本文将对常见PCB材料进行比较分析&#xff0c;以便于选择适合的材…

直线模组的应用案例

直线模组最早是在德国开发使用的&#xff0c;因其具有单体运动速度快、重复定位精度高、本体质量轻、占设备空间小、寿命长等特点&#xff0c;被广泛应用在各种各样的机械设备中&#xff0c;尤其是自动化领域&#xff0c;基本上都能看到直线模组的身影&#xff0c;那么&#xf…

Target DVS EDI项目开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

小程序项目结构与组件基础

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 小程序 也可获取。 文章目录 项目结构了解项目的基本组成结构小程序页面的组成部分json配置文件的作用全局配置文件app.jsonproject.config.jso…

数据仓库基础知识

数据仓库 企业信息应用现状企业对应用集成的需求1. 什么是BI1.1 BI的定义1.2 BI要做的事情1.3 BI的智能1.4 BI应用架构1.5 BI系统架构1.6 BI应用带来的关键效益 2. 什么是数据仓库2.1 数据仓库的概念2.2 数据仓库的特性 3. 数据仓库设计中的几个重要概念3.1 ETL3.2 数据集市&am…

vue2vue3 el-table实现整行拖拽排序功能(使用sortablejs插件)

1、此功能已集成到[TTable组件中]—Vue2TTable组件 、Vue3TTable组件 2、最终效果 3、安装sortablejs npm install sortablejs --save4、Vue2实现方式 <template><el-tableref"el-table":data"tableData":class"{cursor:isCopy,row_sort:…

探究JavaScript:Array方法、原型链继承和JSON

目录 Array对象 构造函数 静态方法 Array.isArray() 实例方法 valueOf&#xff08;&#xff09; toString&#xff08;&#xff09; 对象的继承 构造函数的缺点 prototype属性作用 原型链 读取对象的某个属性的过程&#xff1a; constructor属性 instanceof运算符…

Linux防火墙学习笔记5

iptables规则匹配及动作&#xff1a; 规则&#xff1a;根据规定的匹配条件来尝试匹配每个流经此处的数据包&#xff0c;匹配成功&#xff0c;则由规则指定的处理动作进行处理。规则是由匹配条件和动作组成的。 iptables的规则匹配条件分类&#xff1a; 基本匹配条件&#xff…

STM32 EC200N-CN MQTT链接服务器开发实录

开发环境 硬件&#xff1a;STM32F091CBT6 、EC200N-CN模块板 、USB-TTL串口助手 软件&#xff1a;VS CODE 、 STM32CUBEMX、IAR 8.32 1.硬件设计 连接好EC200N-CN模块和单片机主板。 EC200N-CN模块设计时注意供电和IO电平转换。 EC200N-CN是低功耗的&#xff0c;其主串口…

宝藏达人 | 10年运营支招,一文看懂运营全套技能!

本期介绍的ProcessOn宝藏达人是爱吃小麦馒头&#xff0c;他在互联网领域担任运营官十年以上&#xff0c;有着丰富的业务实操经验和运营方法论。职场风雨历练中他接触过一些“会省钱”的老板&#xff0c;发现有的企业对运营这一职业并未足够重视&#xff0c;随便调个HR做运营经理…

linux中系统性能监测命令sar,查看cpu、内存、磁盘、网络等使用情况

显示系统CPU利用率的统计信息&#xff1a; sar -u 1 5 -u: 这是sar命令的选项之一&#xff0c;表示要显示CPU利用率相关的统计数据。1: 这是指定采样间隔的参数&#xff0c;表示每秒采样一次数据。5: 这是指定采样次数的参数&#xff0c;表示总共采样5次数据。 %user&#xf…

18.5:给定一个栈,请逆序这个栈,不能申请额外的数据结构,只能使用递归函数

给定一个栈&#xff0c;请逆序这个栈&#xff0c;不能申请额外的数据结构&#xff0c;只能使用递归函数 package algorithmbasic.class18;import java.util.Stack;//给定一个栈&#xff0c;请逆序这个栈&#xff0c;不能申请额外的数据结构&#xff0c;只能使用递归函数 publi…

网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求。 以前的时候&#xff0c;所有企业是以产品为核心的&#xff0c;管你有啥漏洞&#xff0c;管你用户信息泄露不泄露&#xff0c;我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法…

gaussdb的日期函数加减操作

日期加一天&#xff0c;四种写法&#xff0c;减一天换成减法- SELECT now() integer 1 SELECT date 2023-06-08 integer 1 SELECT timestamp 2023-06-08 integer 1 select 2023-06-08 ::date interval 1 day 日期加减一周&#xff0c; select 2023-06-08 ::date …

influxDB 1.8 笔记(更新中)

1、InfluxDB基本数据结构 数据结构含义database数据库measurement数据库中的表retention policy保存策略&#xff1a;让InfluxDB能够知道可以丢弃哪些数据&#xff0c;设置数据自动清除时间&#xff0c;从而更高效的处理数据points表里面的一行数据 points的数据结构 数据结…

Android实例——2048游戏

2048游戏 项目简介ConfigConstantsGameActivityGameItemGameViewMainActivityScreenUtils布局activity_game.xmlactivity_main.xml 项目简介 选择难度&#xff0c;生成随机数字&#xff0c;通关上下左右滑动&#xff0c;合并相同的数字&#xff0c;直到达到目标数字即可通关游…