当前位置: 首页 > news >正文

react深入2 - react-redux

1.react-redux使用

1.1 安装

npm i redux
npm i react-redux

1.2 创建一个store

// src\store\index.tsimport { createStore, Action } from 'redux';function countReducer(count:number = 0, action:Action) {switch (action.type) {case 'ADD':return count + 1;case 'MINUS':return count - 1;default:return count;}
}export default createStore(countReducer);

1.3 Provider 提供给全局组件使用

// src\main.tsximport React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import store from './store';
import ClassPage from './view/ClassPage';function App() {return (<div><Provider store={store}><ClassPage /></Provider></div>);
}render(<App />, document.getElementById('root'));

1.4 子class 组件使用

// src\view\ClassPage.tsximport React, { Component } from 'react';
import { connect } from 'react-redux';// eslint-disable-next-line react/prefer-stateless-function
class ClassPage extends Component {render(): React.ReactNode {console.log(this.props);// eslint-disable-next-line react/prop-typesconst { count, add, minus } = (this.props as any);return (<div><p>{count}</p><button onClick={() => add()} type="button">add</button><button onClick={() => minus()} type="button">minus</button></div>);}
}export default connect((count:number) => ({ count }),(dispatch) => {const add = () => dispatch({ type: 'ADD' });const minus = () => dispatch({ type: 'MINUS' });return {add,minus,dispatch,};},
)(ClassPage);

2.实现自己的 react-redux

// src\react-redux\index.tsximport React, { useContext, useLayoutEffect, useReducer } from 'react';// 创建一个用于存放store的上下文
const Context = React.createContext(undefined);
const StoreProvider = Context.Provider;export function Provider({ store, children }:any) {return <StoreProvider value={store}>{children}</StoreProvider>;
}function useForceUpdate() {const [,forceUpdate] = useReducer((i) => i + 1, 0);return () => forceUpdate();
}
// eslint-disable-next-line max-len
export const connect = (mapStateToProps:any, mapDispatchToProps:any) => (WrappedComponent:any) => (props:any) => {const store = useContext(Context) as any;const forceUpdate = useForceUpdate();const stateProps = mapStateToProps(store.getState());let dispatchProps:any = {};if (typeof mapDispatchToProps === 'function') {dispatchProps = mapDispatchToProps(store.dispatch);} else {// eslint-disable-next-line no-restricted-syntaxfor (const key in mapDispatchToProps) {if (Object.prototype.hasOwnProperty.call(mapDispatchToProps, key)) {dispatchProps[key] = (...args:any) => store.dispatch(mapDispatchToProps[key](...args));}}}useLayoutEffect(() => {const unsubscribe = store.subscribe(() => {forceUpdate();});return () => unsubscribe();}, [forceUpdate, store]);// eslint-disable-next-line react/jsx-props-no-spreadingreturn <WrappedComponent {...props} {...stateProps} {...dispatchProps} />;
};export default {};

3.hook 中使用 react-redux

import React, { useCallback } from 'react';
import { useSelector, useDispatch } from 'react-redux';export default function FunctionPage() {const num = useSelector((count:number) => count);const dispatch = useDispatch();const add = useCallback(() => {dispatch({type: 'ADD',});}, [dispatch]);return (<div><p>{num}</p><button onClick={() => add()} type="button">add</button></div>);
}

4 hooks useSelector useDispatch实现

// src\react-redux\index.tsx// hooks
export function useSelector(selector:any) {const forceUpdate = useForceUpdate();const store = useContext(Context) as any;const selectorState = selector(store.getState());useLayoutEffect(() => {const unsubscribe = store.subscribe(() => {forceUpdate();});return () => unsubscribe();}, [forceUpdate, store]);return selectorState;
}export function useDispatch() {const store = useContext(Context) as any;return store.dispatch;
}

源码

最后编辑于:2025-05-18 10:42:46


喜欢的朋友记得点赞、收藏、关注哦!!!

相关文章:

  • MySQL——6、内置函数
  • 2025年- H31-Lc139- 242.回文链表(快慢指针)---java版--需2刷
  • c++编写中遇见的错误
  • 如何利用DeepSeek提升工作效率
  • LaTeX OCR - 数学公式识别系统
  • matlab分段函数
  • 大模型解析:AI技术的现状、原理与应用前景
  • Ubuntu搭建NFS服务器的方法
  • 【Linux】第十八章 调优系统性能
  • 面试中的线程题
  • 系统架构设计(十二):统一过程模型(RUP)
  • 【设计模式】- 行为型模式2
  • 深度解析:AWS NLB 与 ALB 在 EKS 集群中的最佳选择
  • HarmonyOS:应用文件访问(ArkTS)
  • ACL完全解析:从权限管理到网络安全的核心防线
  • SMT贴片加工工艺优化与效率提升
  • 基于FPGA的电子万年历系统开发,包含各模块testbench
  • 开启健康生活的多元养生之道
  • 现代生活健康养生新视角
  • 科学养生指南:解锁健康生活密码
  • 520、521婚登预约迎高峰?上海民政:将增派力量,新人可现场办理
  • 推开“房间”的门:一部“生命存在的舞台” 史
  • 复旦建校120周年大型义诊举行,百余名专家服务市民超三千人次
  • 菲律宾中期选举结果揭晓,马科斯与杜特尔特家族重回“权力的游戏”
  • 多少Moreless:向世界展示现代中式家具的生活美学
  • 《歌手》回归,人均技术流,00后整顿职场