一个redux使用案例模板

news2024/9/22 4:02:11

目录

redux

纯函数和高阶函数:

 redux 开发工具使用

react-redux


redux

1. 结构:

 count--index.jsx

import React, { Component } from 'react'
import store from '../../redux/store'
import { acDecrement,acIncrement,acAsyncIncrement } from '../../redux/count_action'

export default class Count extends Component {

  state = {count:0}
  // store 里面的数据法神变化,更新页面
  componentDidMount(){
    store.subscribe(()=>{
      this.setState({})
    })
  }
  increment = ()=>{
    let value = this.selectRef.value
    store.dispatch(acIncrement(value*1))
  }
  decrement = ()=>{
    let value = this.selectRef.value
    store.dispatch(acDecrement(value*1))
  }
  handleOdd = ()=>{
    let value = this.selectRef.value
    if(store.getState() % 2 !== 0) store.dispatch(acIncrement(value*1))

  }
  handleAsync = ()=>{
    let value = this.selectRef.value
    // let count = this.state.count
    // setTimeout(()=>{
    //   store.dispatch(acIncrement(value*1))
    // },500)

    store.dispatch(acAsyncIncrement(value*1,500))
  }


  render() {
    // console.log(this)
    return (
      <div>
        <h1>当前求和{store.getState()}</h1>
        <select ref={c =>this.selectRef = c}>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
        </select>

        <button onClick={this.increment}>+</button>
        <button onClick={this.decrement}>-</button>
        <button onClick={this.handleOdd}>奇数+</button>
        <button onClick={this.handleAsync}>异步+</button>
      </div>
    )
  }
}

redux--store.js

import {legacy_createStore as createStore,applyMiddleware} from 'redux'
// 创建store需要引入为redux服务的reducer
import reducer from './count_reducer'

// 引入 异步action 需要的中间件 thunk ,通过applyMiddleware使用此中间件
import thunk from 'redux-thunk'


//暴露store
export default createStore(reducer,applyMiddleware(thunk))

redux--reducer.js

// 就是一个函数
// 接收两个参数: preState 和 action

let initCount = 5
export default function countReducer(preState=initCount,action) {
  // console.log(preState,'preState')
  let {data,type} = action
  switch(type) {
    case 'increment': return preState+data
    case 'decrement': return preState-data
    default: return preState
  }
}

redux--action.js

// 就是个函数
// 同步action 返回对象,异步action 返回对象

// 异步action 需要中间件 redux-thunk

export const acIncrement = data=>({type:'increment',data})
export const acDecrement = data=>({type:'decrement',data})
export const acAsyncIncrement = (data,time)=>{
  return (dispatch)=>{
    setTimeout(()=>{
      dispatch(acIncrement(data))
    },time)
  }
}

纯函数和高阶函数:

 redux 开发工具使用

在谷歌中导入文件夹(需要下载)

react-redux

 1. 结构:

containers--count.jsx

import React, { Component } from 'react'
import { connect } from "react-redux";
import {acDecrement,acAsyncIncrement,acIncrement} from '../../redux/count_action'

class CountUI extends Component {

  state = {count:0}
  // store 里面的数据法神变化,更新页面
  // componentDidMount(){
  //   store.subscribe(()=>{
  //     this.setState({})
  //   })
  // }
  increment = ()=>{
    let value = this.selectRef.value
    this.props.PropIncrement(value*1)
  }
  decrement = ()=>{
    let value = this.selectRef.value
    this.props.PropDecrement(value*1)
  }
  handleOdd = ()=>{
    let value = this.selectRef.value
    if(this.props.count % 2 !==0) {
      this.props.PropIncrement(value*1)
    }

  }
  handleAsync = ()=>{
    let value = this.selectRef.value
    this.props.PropAsyncIncrement(value*1,500)
  }


  render() {
    // console.log(this)
    return (
      <div>
        <h1>当前求和{this.props.count}</h1>
        <select ref={c =>this.selectRef = c}>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
        </select>

        <button onClick={this.increment}>+</button>
        <button onClick={this.decrement}>-</button>
        <button onClick={this.handleOdd}>奇数+</button>
        <button onClick={this.handleAsync}>异步+</button>
      </div>
    )
  }
}

export default connect(
  (state)=>({
    count:state.reducerCount
  }),
  // api 优化
  {
    PropIncrement:acIncrement,
    PropDecrement:acDecrement,
    PropAsyncIncrement: acAsyncIncrement,
  }

  /* (dispatch)=>({
    PropIncrement: (data) => dispatch(acIncrement(data)),
    PropDecrement: (data) => dispatch(acDecrement(data)),
    PropAsyncIncrement: (data,time) => dispatch(acAsyncIncrement(data,time)),
  }) */
)(CountUI)

 ------person.jsx

import React, { Component } from 'react'
// import store from '../../redux/store'


// 使用 store 里面的共享数据
import { connect } from 'react-redux'

class PersonUI extends Component {
  render() {
    return (
      // <div>PPindex{store.getState().reducerCount}</div>
      <div>PPindex{this.props.reducerCount}</div>
    )
  }
}

// 自动检测store 里面的数据发生变化,然后自动更新页面
export default connect(
  (state)=>({
    reducerCount: state.reducerCount
  }),
  {}
)(PersonUI)

 redux---reducer.js和action.js  (不变)

// 就是一个函数
// 接收两个参数: preState 和 action

let initCount = 5
export default function countReducer(preState=initCount,action) {
  // console.log(preState,'preState')
  let {data,type} = action
  switch(type) {
    case 'increment': return preState+data
    case 'decrement': return preState-data
    default: return preState
  }
}



//action
// 就是个函数
// 同步action 返回对象,异步action 返回对象

// 异步action 需要中间件 redux-thunk

export const acIncrement = data=>({type:'increment',data})
export const acDecrement = data=>({type:'decrement',data})
export const acAsyncIncrement = (data,time)=>{
  return (dispatch)=>{
    setTimeout(()=>{
      dispatch(acIncrement(data))
    },time)
  }
}

------store.js

import {legacy_createStore as createStore,applyMiddleware, combineReducers} from 'redux'
// 创建store需要引入为redux服务的reducer
import reducerCount from './count_reducer'

// 引入 异步action 需要的中间件 thunk ,通过applyMiddleware使用此中间件
import thunk from 'redux-thunk'

//合并reudcer 需要 combineReducers
//汇总最好直接写在 reducer 文件夹里面的index.js中
const allReducer = combineReducers({
  reducerCount: reducerCount,
})
//暴露store
export default createStore(allReducer,applyMiddleware(thunk))

App.jsx

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


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

index.js

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

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

// 用react-redux 不用再手动检测
// store.subscribe(()=>{
//   ReactDOM.render(<App/>,document.getElementById('root')) 
// })

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

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

相关文章

不会向上管理的人,做不好项目经理和PMO【附具体行动清单】

在职场中&#xff0c;向上管理基本是最重要的一件事儿&#xff0c;升职涨薪奖金都离不开向上管理&#xff01;当你的向上管理做得好&#xff0c;机会都会迎面扑来。 你是不是也遇到过被领导批评时&#xff0c;感到非常委屈或愤怒&#xff0c;情绪经常被领导左右&#xff0c;那…

Three.js一学就会系列:02 画线

系列文章目录 Three.js一学就会系列&#xff1a;01 第一个3D网站 文章目录系列文章目录[Three.js一学就会系列&#xff1a;01 第一个3D网站](https://blog.csdn.net/u012551928/article/details/128205373)前言一、省略部分二、使用方法创建一个场景创建一个透视摄像机将渲染器…

详解CSS层叠上下文(解析z-index不生效的原因)

为什么会有层叠上下文 在CSS2.1规范中&#xff0c;每个盒模型的位置是三维的&#xff0c;分别是平面画布上的X轴&#xff0c;Y轴以及表示层叠的Z轴。一般情况下&#xff0c;元素在页面上沿X轴Y轴平铺&#xff0c;我们察觉不到它们在Z轴上的层叠关系。而一旦元素发生堆叠&#x…

查询网站的谷歌PR权重复杂吗?查询谷歌PR权重最简单的方法

查询网站的谷歌PR权重复杂吗&#xff1f;用对方法一点也不复杂哦! 查询谷歌PR权重最简单的方法——用网站批量查询工具。 网站批量查询工具根据网站的域名可以查询到网站的权重值、网站信息、域名信息、域名备案情况、域名是否安全&#xff0c;来作为网站数据分析的参考。 具体…

C语言基础7:结构体类型、声明、成员类型、定义、初始化、成员访问、传参

文章目录C语言基础7&#xff1a;结构体类型、声明、成员类型、定义、初始化、成员访问、传参1. 结构体类型的声明1.1 结构体的基础知识1.2 结构体的声明1.3 结构体成员的类型1.4 结构体变量的定义和初始化2. 结构体成员访问4. 结构体传参C语言基础7&#xff1a;结构体类型、声明…

SAP S4HANA MM模块后台配置详解

目录 1. 常规设置 1.1 定义国家 1.2.计量单位配置 1.3.货币设置 1.4.维护日历 1.4.1 概念及功能说明 1.4.2 业务示例 1.4.3 配置步骤 2. 企业结构 2.1 定义和分配公司 2.2 设定评估级别、定义/分配工厂 2.2.1. 概念及功能说明 2.2.1. 业务示例 2.2.2. 配置步…

java 八股文

java 八股文 java篇 java 面向对象有哪些特征 封装 多态和继承 arrayList 和 LinkedList 的区别 数据结构不同&#xff0c;一个是数组一个是链表 arrayList 适合 随机访问 读多&#xff0c;插入和删除少 LinkedList 适合插入 和删除 多&#xff0c;按次序遍历的情况 再…

数据结构实验-折半插入排序-双向冒泡排序

目录 分析&#xff1a; 折半插入排序 双向冒泡排序 折半插入排序 思想&#xff1a; 代码 运行结果 双向冒泡排序 代码 运行结果 分析&#xff1a; 折半插入排序 折半插入排序&#xff0c;折半插入排序是在直接插入的改进&#xff0c;通过折半查找得到插入位置&#xf…

java自定义类加载器来加载本地class文件,用demo来解析类加载的双亲委派机制、沙箱机制、打破双亲委派机制

1、首先将class文件放入指定本地目录下 2、编写自定义类加载器demo代码来加载class文件 /*** author WuSong* version 1.0* date 2022/12/7 12:07* description*/ public class MyClassLoaderTest {/*** 1&#xff1a;继承ClassLoader类* 2&#xff1a;重写findClass方法*/sta…

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一小程序源码

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一系统 系统特点: 目前已接入的 CPS 渠道: 充值:话费充值、电费充值、影视会员充值、会员卡券充值 本地团购:联联周边游 电商平台:京东、拼多多、唯品会、淘宝、抖音美团:外卖、闪购、酒店、到店、优选饿了么:外卖、商超 出行服务:…

高压放大器在压电驱动器的机翼除冰方法研究中的应用

实验名称&#xff1a;高压放大器基于压电驱动器的机翼除冰方法研究 研究方向&#xff1a;压电效应、多普勒激光测振 实验原理&#xff1a;多普勒激光测振仪是基于多普勒激光测振原理工作的&#xff0c;当四边固支的矩形板通过驱动器激振起来时&#xff0c;通过激光扫描铝板上的…

知识图谱-KGE-语义匹配-双线性模型(打分函数用到了双线性函数)-2012:LFM(Latent Factor Model)

【paper】 A latent factor model for highly multi-relational data 【简介】 这篇文章是法国的研究团队发表在 NIPS 2012 上的文章&#xff0c;还挂了 Antoine Bordes 的名字。文章提出了 LFM&#xff08;Latent Factor Model&#xff09;&#xff0c;主要贡献有两点&#x…

机床测头应用一:仿形加工功能,降低废品率

机床测头是一种可安装在大多数数控机床上&#xff0c;并在加工循环中自动对工件的尺寸及位置进行测量的装置&#xff0c;使用合适的测量程序&#xff0c;还可以根据测量结果实现自动刀路补偿&#xff0c;可以保证“第一件和第一百件尺寸一致”&#xff0c;是批量生产中不可缺少…

PLC程序实例三:ModBusRTU客户端编程实例与测试方法

一、需求描述 1、设备作为ModBusRTU服务端时&#xff0c;需要给出对应的测试方法&#xff0c;即 PLC 作为主站&#xff0c;设备作为从站使用&#xff08;本文编写的是PLC主站程序&#xff09; 2、业务与上一篇文章ModBusTCP网络触发业务逻辑一致&#xff0c;描述如下&#xf…

SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery

1. Nacos简介 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您…

Git实战 | 让工作更高效,搞定Git的分支管理

上一篇讲到Git的分支管理实操&#xff0c;在线合并和本地合并都进行了实操。毕竟&#xff1a;光说不练是假把式。而只练不整理&#xff0c;只能是傻把式了。分支管理到底如何进行管理呢&#xff1f; 先以GitLab上的一张经典的图打头&#xff0c;作为一个总体概览&#xff0c;也…

汇编语言程序设计期末复习

汇编期末复习 第一章 汇编语言基础知识 机器指令&#xff1a;cpu能直接识别并遵照执行的指令&#xff0c;用二进制编码表示&#xff0c;由操作码&#xff0c;操作数组成&#xff0c;编码只含二进制0或1 机器语言&#xff1a;用二进制编码组成的机器指令的集合和一组使用机器…

java swing(GUI) MySQL实现的视频播放器系统源码+运行教程

今天给大家演示一下由Java swing实现的一款简单的多媒体播放器&#xff0c;项目源码我会放在我的网站上&#xff0c;并配有视频配置教程&#xff0c;保证运行起来的。这个小播放器实现了视频、音频文件的播放、暂停、快进、快退、停止、全屏等功能&#xff0c;还有历史记录功能…

Nacos学习

Nacos NacosNacosNacos 简介核心特性&#xff1a;Nacos 启动启动运行(windows)standalone&#xff08;单节点&#xff09;cluster模式Nacos Server 的配置数据是存在哪里呢&#xff1f;测试demo项目结构统一配置中心命名空间、分组、文件新建bootstrap.properties文件依赖contr…

字符串相似及匹配 Jaro-Winkler

前言 String str1 "明天吃红烧肉"; String str2 "明天中午吃红烧肉"; String str3 "明天吃红烧肉&#xff1f;"; String str4 "吃红烧肉";用普通的相等判断&#xff0c;只能得到是或否&#xff0c;但如果你在实际的业务需求中&am…