redux与react-redux状态集中管理

news/2025/1/15 6:29:56/

一、redux:可用于react、Vue等中

redux应用:状态的管理,共享状态,Redux用一个单独的常量状态树(state对象)保存这一整个应用(如tab选项卡的状态、城市等需要应用在整个页面的信息)的状态。其本质是发布订阅模式。

1.工作工作流

store 是通过 createStore创建出来的,

dispatch, 用于action的分发,改变store里面的state,并在内部遍历subcribe注册的监听器subscribe,注册listener,store里面state发生改变后,执行该listener

getState, 取store里面的值

 不同的action所处理的属性之间没有联系,我们可以把 Reducer 函数拆分,也可以把 action函数拆分。不同的函数负责处理不同属性,最终把它们合并成一个大的 Reducer 即可;

①Reducer函数

const TabbarReducer = (prevState = {show: true
}, action = {}) => {let newState = {...prevState}; //深复制,只读switch (action.type) {case "hide-tabbar":newState.show = false;return newState;case "show-tabbar":newState.show = true;return newState;default:return prevState;}
}export default TabbarReducer

 ②action函数

function show(){return {type:"show-tabbar"}
}function hide(){return {type:"hide-tabbar"}
}export {show,hide}

③.store创建

//1.引入redux
import {combineReducers, createStore,applyMiddleware,compose} from 'redux';//redux安装:npm i redux
import CityReducers from "./reducers/CityReducers";
import TabbarReducers from "./reducers/TabbarReducers";//Reducer函数
import CinemaListReducers from "./reducers/CinemaListReducers";
//常用中间件redux-thunk和redux-promise,两者可以共同使用
import ReduxThunk from 'redux-thunk';//中间件:处理异步。redux安装:npm i redux-thunk
import ReduxPromise from 'redux-promise';//中间件:处理异步。redux安装:npm i redux-promise//combineReducers:合并函数
const reducer = combineReducers({CityReducers,TabbarReducers,CinemaListReducers
})const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;//devtools调试工具:看状态变化
const store = createStore(reducer,composeEnhancers(applyMiddleware(ReduxThunk,ReduxPromise)));export default store

④.在App.js注册


import React, { Component } from "react";
import Mrouter from "./router/indexRouter";
import Tabbar from "./component/Tabbar";
import "./App.css";
import store from "../05-redux/redux/store";// store subscribe订阅
export default class App extends Component {state = {isShow: store.getState(), // 控制tab显示};componentDidMount() {store.subscribe(() => {this.setState({isShow: store.getState().TabbarReducers.show,});});}render() {return (<div><Mrouter> {this.state.isShow && <Tabbar> </Tabbar>} </Mrouter></div>);}
}

⑤.dispatch分发

import React, { useEffect } from "react";
import store from "../redux/store";
import { show, hide } from "../redux/actionCreator/TabbarActionCreator";
export default function Detail(props) {useEffect(() => {store.dispatch(hide());return () => {store.dispatch(show());};}, []);return <div>Detail</div>;
}

二、react-redux:仅仅用于react中 

react-redux中不需要subscribe注册,而是通过connect函数,生成一个父组件,提供高阶组件。react中推荐使用react-redux。

安装:npm install react-redux

1.React-Redux 提供Provider组件,可以让容器组件拿到state。在主入口文件index.js中设置。

import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import store from './store'
import App from './App'
const rootElement = document.getElementById('root')
ReactDOM.render(<Provider store={store}><App /></Provider>,rootElement
)

2.④.App.js更改

import React, { Component } from "react";
import Mrouter from "./router/indexRouter";
import Tabbar from "./component/Tabbar";
import "./App.css";
import store from "../05-redux/redux/store";
import {connect} from 'react-redux';class App extends Component {componentDidMount() {console.log(this.props);//访问到connect里的数据}render() {return (<div><Mrouter> {this.props.isShow && <Tabbar> </Tabbar>} </Mrouter></div>);}
}const mapStateToProps=(state)=>{console.log(state);//能访问到所有订阅return{isShow:state.TabbarReducers.show}
}export default connect(mapStateToProps)(App)

2.⑤.dispatch分发更改

import React, { useEffect } from "react";
import { show, hide } from "../redux/actionCreator/TabbarActionCreator";
import {connect} from 'react-redux';function Detail(props) {let {hide,show,match}=props;useEffect(() => {// store.dispatch 发布、通知hide();return () => {show();};}, [match.params.myid,show,hide]);return <div>Detail</div>;
}const mapDispatchToProps={show,hide 
}//connect(给孩子传的属性,孩子传的回调函数)
export default connect(null,mapDispatchToProps)(Detail)


http://www.ppmy.cn/news/104275.html

相关文章

Windows下利用Anaconda创建多个CUDA环境

参考 https://blog.csdn.net/qq_42395917/article/details/126237388 https://blog.csdn.net/qq_42406643/article/details/109545766 (待学习补充) https://blog.csdn.net/qq_43919533/article/details/125694437 (待学习补充) 安装cudatoolkit和cudnn # 前提是我已经安装了…

JAVA基础 - 如何使用split方法?

写在前面 在工作中一直使用split进行字串的分隔&#xff0c;但是始终没有认真研究过该方法&#xff0c;今天在使用该方法时遇到了一些问题&#xff0c;特进行学习记录。 遇到的问题 在使用“|”作为字串的分隔符的时候&#xff0c;分隔结果和预期不一样。 方法定义 // 从方…

Android使用多模块+MVI+Koin+Flow构建项目框架

Android使用多模块MVIKoinFlow构建项目框架 前言模块路由核心接口&#xff0c;用于在模块中绑定路由对应关系使用建造者模式定义传递的参数创建路由加载核心类, 本质上包含了一个全局路由表跳转类使用 MVI封装介绍&#xff0c;本质上使用flow作为核心定义数据类型&#xff0c;该…

I2C通信协议MPU6050

目录 I2C通信协议 硬件 软件 I2C时序 MPU6050 I2C通信协议 硬件 为了避免总线没协调好导致电源短路&#xff0c;配置为开漏输出&#xff0c;所有设备输出低电平不输出高电平&#xff0c;即右图。又为了避免高电平造成的引浮空&#xff0c;&#xff08;第三点&#xff09;总…

浏览器兼容性:CSS 回退属性

一个 CSS 类可以由许多声明组成&#xff0c;每个声明都具有property: value语法的语法&#xff1a; .cls {property: value; } 可以为同一个属性设置不同的值。稍后出现的值会覆盖它之前的值。浏览器将尝试使用最后的声明。在无法识别声明的情况下&#xff0c;它将回退到以前…

MapReduce【数据压缩】

目录 概述 压缩的优缺点 优点 缺点 压缩的原则 MapReduce支持的压缩编码 压缩算法对比 压缩性能比较 压缩方式的选择 Gzip 压缩 Bzip2 压缩 Lzo 压缩 Snappy 压缩 压缩位置选择 压缩位置选择 1、输入端采用压缩 2、Mapper输出采用压缩 3、Reducer输出采用压缩…

SpringBoot框架面试专题(初级-中级)-第一节

欢迎大家一起探讨相关问题&#xff0c;我们共同进步&#xff0c;喜欢的话可以关注点赞&#xff0c;后续会持续更新&#xff0c;谢谢&#xff5e; 问题&#xff1a; 1.Spring Boot是什么&#xff1f;它与Spring Framework有什么区别&#xff1f; 解析&#xff1a; Spring Bo…

Rust 笔记:WebAssembly 的 JavaScript API

WebAssembly WebAssembly 的 JavaScript API 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/ar…