React学习26(react-redux优化 工作使用)

news2024/9/28 11:22:35

项目结构

 优化说明

1)容器组件和UI组件混合成一个文件

2)无需自己给容器传递store,在index.js入口文件给包裹一个Provider

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

3)使用了react-redux后也不用自己在index.js入口文件检测redux中状态的改变了,容器组件可以

自动完成

4).mapDispatchToProps也可以简单写成一个对象

5)一个组件要和redux打交道需要经过那几步?

        A、定义好一个UI组件,不暴露

        B、引入connect生成一个容器组件,并暴露,写法如下:

connect( state => ({key:value}) // 映射状态

{key:xxxxxAction} // 映射操作状态的方法

)(UI组件)

        C、在UI组件中可以通过this.props.xxxx读取和操作状态

代码展示

index.js

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App.jsx'
import store from './redux/store'//为provider服务
import {Provider} from 'react-redux'

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

// 检测redeux中状态的改变,若redux的状态发生了改变,那么重新渲染App组件
//使用react-redux创建容器组件后,react-redux可以自己实现检测state中状态的改变,所以可以删除
//以下代码
// store.subscribe(() => {
//   ReactDOM.render(<App/>,document.getElementById('root'))
// })

App.jsx

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

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

 container-count-index.jsx

//引入CountUI组件
// import CountUI from '../../compoents/Count'

import React, { Component } from 'react'

//引入connect用于连接UI组件和redux
import {connect} from 'react-redux'
//引入action
import {
  createIncrementAction,
  createDecrementAction,
  createIncrementAsyncAction
} from '../../redux/count_action'

//定义UI组件
class Count extends Component {
  state = {carName:'奔驰c63'}//  把状态交给reducer之后组件也可以有自己独用的状态


  increment = () => {
    const {value} = this.selectNum
    this.props.jia(value*1)

  }
  decrement = () => {
    const {value} = this.selectNum
    this.props.jian(value*1)
  }
  incrementOdd = () => {
    const {value} = this.selectNum
    if(this.props.count % 2 !== 0) {
      this.props.jia(value*1)
    }
  }
  incrementWait = () => {
    const {value} = this.selectNum
    this.props.jiaAsync(value*1,400)
  }
  render() {
    console.log('UI组件接收到的props是:',this.props);
    return (
      <div>
        <h1>当前求和为:{this.props.count}</h1>
        <select ref={c => {this.selectNum = 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.incrementOdd}>当前求和为奇数再加</button>&nbsp;
        <button onClick= {this.incrementWait}>等一等再加</button>
      </div>
    )
  }
}

//使用connect()()创建并暴露一个Count容器组件
export default connect(
  state => ( {count:state}), 
  //mapDispatchToProps的一般写法
  // dispatch => ({
  //   jia:number => dispatch(createIncrementAction(number)),
  //   jian:number => dispatch(createDecrementAction(number)),
  //   jiaAsync:(number,time) =>dispatch(createIncrementAsyncAction(number,time)) 
  // })

   //mapDispatchToProps的简写,dispatch由react-redux来完成,程序员工作中用这种方法
   {
    jia:createIncrementAction,
    jian:createDecrementAction,
    jiaAsync:createIncrementAsyncAction
   }
  )(Count)

redux-store.js

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

//引入createStore,专门用于创建redux中最为核心的store对象
import {createStore, applyMiddleware} from 'redux'

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

//引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'

export default createStore(countReducer, applyMiddleware(thunk))

redux-count_reducer.js

/*
  1.该文件用于创建一个为count组件服务的reducer,reducer的本质就是一个函数
  2.reducer函数会接到两个参数,分别是之前的state(状态)和action(动作对象)
*/
import { INCREMENT, DECREMENT } from "./constant";

const initState = 0
export default function countReducer(preState=initState, action) {
  // console.log(preState, action);
  //从action对象中获取type, data
  const {type, data} = action
  //根据type类型决定如何加工
  switch (type) {
    case INCREMENT:// 如果是加
     return preState + data
    case DECREMENT:// 如果是减
      return preState - data
    default:
      return preState
  }
}

redux-count_actions.js

/*
  该文件专门为count组件生成action对象
*/
import { INCREMENT, DECREMENT } from "./constant"
//完整写法
// function createIncrementAction(data) {
//   return {type:'increment', data }
// }
//简写形式
export const createIncrementAction = data =>( {type:INCREMENT, data })

//完整写法
// function createDecrementAction(data) {
//   return {type:'decrement', data}
// }
export const createDecrementAction = data =>( {type: DECREMENT, data })

//异步action,就是值action的返回值是函数,异步action一般都会调用同步action
//异步action不是必须要用的
export const createIncrementAsyncAction = (data, time) =>{
  return (dispatch) => {
    setTimeout(() => {
      dispatch(createIncrementAction(data))
    },time)
  }
}

redux-constant.js

/*
  该文件是用于定义action对象中的type类型的常量值
  目的只有一个:防止程序员在编码的同时单次写错
*/

export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'

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

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

相关文章

Python入门教程:基本运算符

1.运算符 计算机可以进行的运算有很多种&#xff0c;可不只加减乘除这么简单&#xff0c;运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算&#xff0c;今天我们暂只学习算数运算、比较运算、逻辑运算、赋值运算、成员运算 2.算数运算 …

数据聚合、数据同步

文章目录数据聚合Bucket聚合语法聚合结果排序限定聚合范围Metric聚合语法RestAPI实现聚合数据同步发送MQ消息接收MQ消息数据聚合 Bucket聚合语法 GET /hotel/_search {"size": 0, // 设置size为0&#xff0c;结果中 不包含文档&#xff0c;只包含聚合结果~"…

Spark-内核(集群管理器、通讯架构、任务调度机制、Shuffle、内存管理)

文章目录Spark内核Spark部署模式的集群管理器YARN模式运行机制Standalone模式运行机制Spark通讯架构通信架构概述通讯架构解析Spark任务调度机制任务调度概述Stage级调度Spark Task级调度调度策略本地化调度失败重试与黑名单机制Spark Shuffle解析ShuffleMapStage与ResultStage…

SpringCloud微服务之Zuul网关

SpringCloud微服务之Zuul网关 家庭生活中经常有这样的感悟&#xff0c;家中的财政大权在老婆手里&#xff0c;想要花个小钱买个冰棍&#xff0c;得跟老婆请示&#xff0c;想要出个远门看看北京猿人&#xff0c;得跟老婆请示&#xff0c;想不要脸面去个夜店看看别的妞好在哪里&…

代码随想录第九天

专题&#xff1a;字符串 题目&#xff1a;字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。 比如&#xff0c;输入字符串"abcdefg"和数字2&#xff0c;该函数将返回左旋转两位得到的结果"cdefgab&…

ADI Blackfin DSP处理器-BF533的开发详解56:CVBS输入-DSP和ADV7180的MDMA用法(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 CVBS IN视频输出 代码实现功能 电视视频是奇场合偶场交替传输的&#xff0c;所以通过 CVBSIN 模块采集到的图像如上实验所看到的&#xff0c;是…

CentOS 7.6 安装与配置 MySql 5.7.40

1 通过wget下载MySql的rpm # wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm2 检查是否存在MySql的repo # cd /etc/yum.repos.d/ # ls CentOS-Base.repo CentOS-Epel.repo可以看到没有MySql的repo 3 安装MySql的repo&#xff0c;并查看是否安…

React 生命周期

React 生命周期 这篇文章&#xff0c;我们来聊一聊在React中的生命周期。首先我们明确一点&#xff0c;在React中&#xff0c;函数式组件是没有生命周期的。谈到生命周期&#xff0c;都是关于类组件的&#xff01; 生命周期官方网址 React.Component – React (docschina.or…

macOS Monterey 12.6.2 (21G320) Boot ISO 原版可引导镜像

macOS Monterey 12.6&#xff0c;皆为安全更新&#xff0c;不再赘述。 macOS Monterey 12.6&#xff0c;发布于 2022 年 9 月 12 日&#xff08;北京时间今日凌晨&#xff09;&#xff0c;本次为安全更新。 今日&#xff08;2022-07-21&#xff09;凌晨&#xff0c;Apple 终于…

CentOS 8:SSH远程登录

SSH远程登录 SSH远程登录&#xff0c;也是 C / S 模式 服务端&#xff1a;sshd &#xff0c;默认是启动的 systemctl status sshd systemctl start sshd SecureCRT 是打开了一个远程终端 注意&#xff1a;在终端环境里&#xff0c;不可以启动GUI程序 例如&#xff0c;在 …

【单片机】DS1302时钟/蜂鸣器

目录 一、DS1302时钟 1、DS1302时钟的介绍 2、DS1302时钟寄存器 3、DS1302时序图 4、BCD码 5、写一个时钟 6、写一个可调时钟 二、蜂鸣器 1、蜂鸣器的介绍​编辑 2、三极管放大驱动蜂鸣器 2.1NPN三极管工作原理&#xff08;基极电流和发射电流均流向集电区&#xff…

Python图像识别实战(二):实现批量图像读取和像素转换(附源码和实现效果)

前面我介绍了可视化的一些方法以及机器学习在预测方面的应用&#xff0c;分为分类问题&#xff08;预测值是离散型&#xff09;和回归问题&#xff08;预测值是连续型&#xff09;&#xff08;具体见之前的文章&#xff09;。 从本期开始&#xff0c;我将做一个关于图像识别的…

Dubbo 3 Dubbo 快速入门 3.2 Dubbo 快速入门 3.2.3 服务消费者

Dubbo 【黑马程序员Dubbo快速入门&#xff0c;Java分布式框架dubbo教程】 3 Dubbo 快速入门 文章目录Dubbo3 Dubbo 快速入门3.2 Dubbo 快速入门3.2.3 服务消费者3.2 Dubbo 快速入门 3.2.3 服务消费者 OK&#xff0c;之前我们 已经完成了 服务提供 者的改造 现在来改造 服务…

智能电网中采用博弈论的方法(Python代码实现)

目录 1 概述 2 系统模型 2.1 单价模型 2.2 效用模型和 能源消费者&#xff08;EC&#xff09; 的目标 2.3 成本模型和 中央电站&#xff08;CPS&#xff09; 的目标 2.4 优化问题 3 优化的能源管理模型 4 模型的特性 4.1 均衡的存在 4.2 决策过程 5 算法 6 数值的…

vector详解(不定长数组)

目录 什么是vector vector的介绍 模板的声明方式 vector的基本操作 push_back insert erase 遍历vector 小明爱数列-练习题 思路 什么是vector vector的介绍 和我一样,我猜你们看到题目时心里都会产生一个疑问"什么是vector?(大佬除外)".vector其实是…

一起Talk Android吧(第四百四十四回:UI控件之DatePicker)

文章目录概念介绍使用方法内容总结各位看官们大家好&#xff0c;上一回中咱们说的例子是"UI控件之NumberPicker",这一回中说的例子是"UI控件之DatePicker"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; 概念介绍 看官…

CSS实现文字扫光特效

上大学的玩 ae 的时候&#xff0c;就曾遇到过这个特效。偶然在百度看到了类似特效&#xff0c;没想到竟然能用 css 实现&#xff0c;所以就研究了一下&#xff0c;文字扫光效果如下&#xff1a; 实现思路&#xff1a; 光效移动效果&#xff0c;可以通过 background-image 设置…

RCNN网络源码解读(Ⅲ) --- finetune训练过程

目录 0.回顾 1.finetune二分类代码解释&#xff08;finetune.py&#xff09; 1.1 load_data&#xff08;定义获取数据的方法&#xff09; 1.2 CustomFineTuneDataset类 1.3 custom_batch_sampler类&#xff08; custom_batch_sampler.py&#xff09; 1.4 训练train_mod…

JVM.......未完待续

一、了解 JVM JVM ( Java Virtual Machine )&#xff0c;又称之为 Java虚拟机。JVM 的运行与操作系统无关&#xff0c;能够实现跨平台&#xff0c;只要是安装了JVM的机器&#xff0c;都能运行Java程序&#xff0c;Java语言最重要的特点 "跨平台运行"&#xff0c;也…

关于应用形态数轴方法的一点展望

“既然目前物理化学关于物质世界的最高理论成果&#xff0c;即所谓由量子力学和统计力学组成的第一原理&#xff0c;只能求算物质无生命的性质&#xff0c;而药物设计关心的却是有生命的性质.那么是否第一原理对药物设计就无所作为呢&#xff1f;不是的.也就是说&#xff0c;尽…