React(六) —— redux

news2024/9/25 11:11:06

🧁个人主页:个人主页

✌支持我 :点赞👍收藏🌼关注🧡

文章目录

  • ⛳Redux
    • 🍆redux定义
    • 💐redux使用原则
    • 🍰redux使用场景
    • 🧊redux工作流程
    • 🥫redux基本
      • 创建store
      • 定义改变数据的actions,并在renducer函数中对对应的action作出不同的操作
      • 离开或到达Detail页面,触发相应的actions
      • 订阅store,更新状态到页面上
    • 🍸补充(actioncreator)
    • 🍫redux核心
      • reducer合并
      • redux中间件
      • redux-thunk
      • redux-promise

⛳Redux

redux最主要是用作应用状态的管理。简言之,Redux用一个单独的常量状态树(state对象)保存这一整个应用的状态,这个对象不能直接被改变。当一些数据变化了,一个新的对象就会被创建(使用actions和reducers)这样就可以进行数据追踪。

🍆redux定义

Redux 是一个使用叫做“action”的事件来管理和更新应用状态的模式和工具库。它以集中式Store(centralized store)的方式对整个应用中使用的状态进行集中管理,其规则确保状态只能以可预测的方式更新。

💐redux使用原则

🔎🔎🔎

  1. state以单一对象存储在store对象中
  2. state只读(每次都返回一个新的对象)
  3. 使用纯函数reducer执行state更新

在这里插入图片描述

🍰redux使用场景

🏸🏸🏸

  1. 同一个state需要在多个Component中共享
  2. 需要操作一些全局性的常驻Component,如Tooltips等
  3. 太多props需要在组件树中传递,其中大部分只是为了传给子组件
  4. 业务太复杂导致Component文件太大,可以考虑将业务逻辑拆出来放到Reducer中

🧊redux工作流程

📢📢📢

  1. 组件通过dispatch方法触发Action(type+payload载荷)
  2. Store接收Action并将Action分发给Reducer
  3. Reducer根据Action类型对状态进行更改并将更改后的状态返回给Store
  4. 组件订阅了Store中的状态,Store中的状态更新会同步到组件

🥫redux基本

创建store

redux文件夹下的store.js

//1.引入redux,
//2.createStore(reducer)
import {createStore} from 'redux'
const reducer = (preState,action)=>{
    return prevState
}
const store = createStore(reducer);
export default store

定义改变数据的actions,并在renducer函数中对对应的action作出不同的操作

//store.js 第二个参数为操作的actions
const reducer = (prevState={
    show:true,
    //...初始状态值
},action)=>{
    console.log(action);
    let newStare = {...prevState}
    switch(action.type){
        case 'hide-tabbar':
            newStare.show = false
            console.log(newStare.show);
            return newStare.show
        case 'show-tabbar':
            newStare.show = true
            console.log(newStare.show);
            return newStare.show
        default:
            return prevState
    }
}

离开或到达Detail页面,触发相应的actions

//Detail.js
import {show,hide} from '../../redux/actionCreator/TabbarActionCreator'

useEffect(()=>{
      //store.dispatch 通知
      store.dispatch(hide())
      return()=>{
        // console.log('destroy');
        store.dispatch(show())
      }
 },[])
.............................................
//actionCreator文件夹下TabbarActionCreator.js
function hide(){
    return {
            type:'hide-tabbar'
    }
}
function show(){
    return {
            type:'show-tabbar',//必须有type值
        	//payload:'需要传的值'
    }
}
export {show,hide}

订阅store,更新状态到页面上

//App.js中
state = {
    isShow:store.getState()
  }
  //store.subcribe 订阅
  componentDidMount(){
    store.subscribe(()=>{
      console.log('app中订阅',store.getState());
      this.setState({
        isShow:store.getState().show
      })

    })
  }
  //store.subcreibe 订阅
  render() {
    return (
      <div>
        <MRouter>
           {this.state.isShow && <Tabbar></Tabbar>}
        </MRouter>
      </div>
    )
}

获得store中的状态,根据状态的不同来控制Tabbar的显示或隐藏

🍸补充(actioncreator)

action creator是一个函数,用于生成一个action对象,他接受一个或多个参数(任何类型的数据),但是必须在action对象中有一个type属性:描述操作的类型。action creator函数返回一个对象,该对象是一个action,这个action对象包含了描述操作的数据

function addTodo(text){
	return{
		type:'add_todo'
	}
}
..............................
store.dispatch(addTodo())

上述:addTodo是一个action creator函数,它接受一个text参数并返回一个包含type和text属性的action对象。在Redux中,我们可以使用dispatch函数将这个action对象发送到store中,以便更新store状态。

🍫redux核心

  • getState:获取状态

    store.getState()
    
  • subscribe:订阅状态

    store.subscribe(()=>{})
    
  • dispatch:触发Action

    store.dispatch({type:'description...'})
    

reducer合并

🚀如果不同的action所处理的属性之间没有联系,我们可以把Reducer函数拆分。不同的函数负责处理不同属性,最终把他们合并成一个大的Reducer,并且抛出在store内的文件中引入。

redux文件夹下CityReducer.js

创建多个reducer,分别管理不同的数据

const CityReducer = (prevState={
    cityName:'北京'
},action)=>{
    let newStare = {...prevState}
    switch(action.type){
        case 'change-city':
            newStare.cityName = action.payload
            return newStare
        default:
            return prevState
    }
}
export default CityReducer

store.js

使用combinReducers方法合并多个Reducer。combinReducers方法可以吧多个reducer合并成一个reducer,以便在创建store实例时使用

import {combineReducers, createStore} from 'redux'
import CityReducer from './reducers/CityReducer';
import TabbarReducer from './reducers/TabbarReducer';
const reducer = combineReducers({
    CityReducer,
    TabbarReducer
})
const store = createStore(reducer);
export default store

redux中间件

在redux里,action仅仅是携带了数据的普通js对象,action creator返回的值是这个action类型的对象,然后通过store.dispatch()进行分发。同步的情况下一切都很完美,但是reducer无法处理异步的情况。

那么我们就需要action和reducer中间架起一座桥梁来处理异步。这就是middleware

redux-thunk

作用

🚒让我们的action创建函数不仅仅返回一个action对象,也可以返回一个函数,这个函数会接受dispatch和getState两个参数,我们可以在函数内部进行 异步操作 ,然后再通过dispatch发出一个新的action对象,来更新应用的状态

安装redux-thunk

npm i --save react-thunk

引入

import {applyMiddleware, combineReducers, createStore} from 'redux'
import reactThunk from 'redux-thunk'
const reducer = combineReducers({
    .....
})
const store = createStore(reducer,applyMiddleware(reactThunk));
export default store

使用方法

import getCinemsListAction from '../redux/actionCreator/getCinemsListAction'
store.dispatch(getCinemsListAction())
...............................
import axios from "axios"
function getCinemasListAction(){
   return(dispatch)=>{
    axios({
     ........
    }).then(res=>{
        console.log(res.data.data.cinemas);
        dispatch({
              type:'change-list',
              payload:res.data.data.cinemas
        })
    })
   
   }
}
export default getCinemasListAction

注意:

当我们使用react-thunk中间件时,他会判断action是否为函数,如果是函数就执行这个函数,并在函数内部发出一个新的action对象,若不是则按照正常进行

取消订阅

 //订阅
    var unsubcribe=store.subscribe(()=>{
    })
    return ()=>{
      //取消订阅
      unsubcribe()
    }
  },[])

redux-promise

安装redux-promise

npm i redux-promise

引入

import {applyMiddleware, combineReducers, createStore} from 'redux'
import reactThunk from 'redux-thunk'
import reactPromise from 'redux-promise'
const reducer = combineReducers({
    ....
})
const store = createStore(reducer,applyMiddleware(reactThunk,reactPromise));
export default store

使用方法

import getCinemsListAction from '../redux/actionCreator/getCinemsListAction'
store.dispatch(getCinemsListAction())
...............................
import axios from "axios"
async function getCinemasListAction(){
   var list = await axios({
        ......
    }).then(res=>{
       return{
        type:'change-list',
        payload://res.data.data.cinemas
       }
    })
    return list
 }
export default getCinemasListAction

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

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

相关文章

14.创建组件

组件可以理解为页面的拼图块&#xff0c;一个完整的页面是由若干个组件拼成的 在vue中规定&#xff0c;组件的后缀名为vue&#xff0c;每一个vue文件中应该包含三个大标签 template 组件的模板结构&#xff0c;可以理解为htmlscript 组件的JS&#xff0c;控制组件要执行什么动…

区域检验管理系统(云LIS)源码

1、区域检验管理系统&#xff08;云LIS&#xff09;概述 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0c;通过对质量控制的管理&am…

Java每日一练(20230418)

目录 1. N皇后 II &#x1f31f;&#x1f31f;&#x1f31f; 2. 字符串相乘 &#x1f31f;&#x1f31f; 3. 买卖股票的最佳时机 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一…

“Natural Earth II“ === “Natural Earth II“是false?你知道空 格的四种写法吗?

前言 有一回对我说道&#xff0c;“你学过前端么&#xff1f;”我略略点一点头。他说&#xff0c;“学过前端&#xff1f;……我便考你一考。html 里面的空格&#xff0c;怎样 coding 的&#xff1f;”我想&#xff0c;讨饭一样的人&#xff0c;也配考我么&#xff1f;便回过脸…

计算机网络 - 网络中的基本概念

前言 本篇介绍网络的一些基本概念&#xff0c;认识IP地址&#xff0c;端口号&#xff0c;协议&#xff1b;了解常用的网络协议模型&#xff0c;知道数据如何封装与分用的&#xff1b;为以后学习计算机网络其它知识做铺垫&#xff0c;如有错误&#xff0c;请在评论区指正&#…

Java数据结构 二叉树基本知识 二叉树遍历

二叉树很简单的&#xff0c;试试呗~ 文章目录 Java数据结构 & 二叉树基本知识 & 二叉树遍历1. 树的基本定义2. 树的基本概念2.1 例子2.2 树的代码表示&#xff1a; 3. 二叉树3.1 特殊节点3.2 特殊的二叉树3.3 二叉树的性质3.3.1 证明第三点3.3.2 证明第四点 4. 二叉树遍…

MySQL-MHA高可用(一)

目录 &#x1f341;同步概念 &#x1f341;工作原理 &#x1f343;环境拓扑 &#x1f341;环境准备 &#x1f342;manager &#x1f342;master1 &#x1f342;master2 &#x1f342;slave &#x1f343;配置半同步复制 &#x1f341;master1 &#x1f341;master2 &#x1f34…

函数 tcgetpgrp tcsetpgrp 和 tcgetsid

① tcgetpgrp & tcsetpgrp 函数 tcgetpgrp函数是用来获取前台进程组的ID #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> int main() {printf("我的ID&#xff1a;%d---我…

【MySQL学习】MySQL库的操作

目录一、查看数据库的连接二、数据库的创建三、字符集和校验规则3.1 查看数据库默认的字符集以及校验规则3.2 查看数据库支持的字符集以及校验规则3.3 校验规则对数据库的影响四、操纵数据库4.1 查看数据库4.2 显示创建语句4.3 修改数据库4.4 数据库的删除五、数据库的备份与恢…

Nginx中的location规则与rewrite

nginx正则表达式 ^$空行 \d数字 \D代表非数字 \s 匹配空白符 \S 非空白字符 \w匹配任意单词符包括下划线[A-Za-z0-9_] {n} 匹配起那面字符n次 .* 除换行符\n匹配任意字符多次 {n,m}匹配前面字符5到10次 [abc] 匹配一次a,b,c ( )表达式的开始和结束 | 或运算符 &#…

【uniapp】sigmob广告加载失败:-5005、500422没有imei的解决办法(原创可用)

问题 最近打算将开发的uniapp应用对接uni-ad广告中去&#xff0c;在对接sigmob的时候出现了以下问题&#xff1a;①错误码-5005&#xff0c;查询了以下官方文档&#xff0c;发现是说我频繁调用&#xff0c;可是并没有&#xff0c;我是在真机上测试的没成功就没在弄了&#xff…

【力扣-876】链表的中间结点

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : ----------小Tips&#xff1a; 虽然都是口服液体制剂&#xff0c;且看起来单支容量都一样&#xff0c;但是“藿香正气水”与“藿香正气口服液”的区别你知道吗&#xff1f;藿香正气水里含有…

Vue电商项目实战之角色列表添加,编辑,删除功能

这是黑马vue电商项目后台,自己需要完成的功能,这里仅供参考当然还需要自己去理解. 一.添加功能 在roles.vue中 1.添加角色的对话框 代码如下: <!-- 添加角色的对话框 --><el-dialog :visible.sync"addRoleDialogVisible" title"添加角色" widt…

【C++技能树】原来比C方便这么多 --缺省参数、函数重载、引用讲解

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

DPCNN分类模型

论文 Deep Pyramid Convolutional Neural Networks for Text Categorization 提出深层金字塔卷积网&#xff08;DPCNN&#xff09;是 word-level 的广泛有效的深层文本分类卷积神经网络&#xff0c;比 TextCNN&#xff08;浅层CNN&#xff09;性能明显提高。 TextCNN 不能通过卷…

Unity InputSystem (一)

什么是InputSystem InputSystem 是 2019 年 Unity 新推出的插件&#xff0c;输入系统包实现了一个系统来使用任何类型的输入设备来控制你的 Unity 内容。它旨在成为 Unity 的经典输入管理器更强大、更灵活、更可配置的替代品。 新输入系统基于事件&#xff0c;输入设备和动作逻…

Redis 哨兵和集群

文章目录1. 单机模式2. 主从架构3. 哨兵4. 集群模式5. 哈希槽是什么&#xff1f;1. 单机模式 Redis 单副本&#xff0c;采用单个 Redis 节点部署架构&#xff0c;没有备用节点实时同步数据&#xff0c;不提供数据持久化和备份策略&#xff0c;适用于数据可靠性要求不高的纯缓存…

【硬件外设使用】——SPI

【硬件外设使用】——SPI SPI基本概念SPI通信协议SPI使用方法pyb.spimachine.spi SPI可用的传感器 SPI基本概念 SPI是一种串行端口通信接口&#xff0c;它是一种同步的全双工协议&#xff0c;用于在数字电路之间传输数据。SPI代表串行外设接口&#xff0c;是一种非常流行的数字…

UDS诊断测试

UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务&#xff09;诊断协议是在汽车电子ECU环境下的一种诊断通信协议。这种通信协议被用在几乎所有由OEM一级供应商所制造的新ECU上面。这些ECU控制车辆的各种功能&#xff0c;包括电控燃油喷射系统&#xff0…

TI在物联网和AI边缘计算中落伍了吗?

摘要&#xff1a;本文介绍一下TI在边缘计算工作中所做的努力。 发明“人工智能”这个term的老头儿也不会想到人工智能在中国有多火。 不管是懂还是不懂&#xff0c;啥东西披上“人工智能“的面纱都能瞬间成为大项目。 学习AI 的年轻人认识NVIDIA&#xff0c;可能不太知道DSP是…