• 关于在ts中使用最新版redux的方法记录


    1.首先在react-ts项目中引入redux&react-redux

    npm i  --save redux  react-redux

    2.redux文件及目录建设

    3.文件说明

    Store.ts:为入口文件
    reducers: 为多个reducer独立文件,并且每个reducer都设置自己的类型注解文件

    代码展示如下:

    1. //Store.ts
    2. /**
    3. rtk的configureStore集成了redux中的combineReducers,createStore,middleware以及默认支持reduxDevTools;
    4. */
    5. import { configureStore } from "@reduxjs/toolkit";
    6. //reducer引入
    7. import CollapsedReducer from "./reducers/collapsed/CollapsedReducer";
    8. const store = configureStore({
    9. reducer:CollapsedReducer
    10. });
    11. export default store;
    12. /**
    13. * returnType:可以获取返回值的类型,使代码更具可维护性和可读性,
    14. * 特别是在处理复杂的函数类型时,可以减少手动定义类型的工作,
    15. * 同时增加了代码的类型安全性。它在编写高度类型化的代码或使用泛型函数时特别有用。
    16. * */
    17. export type AppDispatch = typeof store.dispatch; //获取修改方法
    18. export type RootState = ReturnType<typeof store.getState>; //获取设置的状态变量
    1. //CollapsedReducer.ts
    2. /**
    3. PayloadAction:是 Redux Toolkit 中的一个类型,它用于定义 action 的结构以及传递给 reducer 的数据
    4. **/
    5. import { createSlice ,PayloadAction} from "@reduxjs/toolkit";
    6. import { CollapsedState } from "./interface";
    7. const initialState:CollapsedState = {
    8. isCollapsed: false,
    9. }
    10. //createSlice:创建切片对象
    11. const CollapsedReducerSlice = createSlice({
    12. name:"CollapsedReducer", //唯一标识
    13. initialState, //初始化状态数据
    14. reducers:{ //1.定义reducers
    15. //2.定义reducer更新状态数据的函数 ,setisCollapsed方法在后期组件中执行dispatch时是作为action函数的函数名去使用
    16. setisCollapsed(state,{ payload }: PayloadAction){ //传入两个参数1state(代理的proxy对象),一个是action
    17. console.log(state,"state");
    18. console.log(payload,"payload");
    19. state.isCollapsed = payload.isCollapsed
    20. }
    21. }
    22. })
    23. export const {
    24. setisCollapsed
    25. } = CollapsedReducerSlice.actions ;
    26. export default CollapsedReducerSlice.reducer;
    27. //interface.ts
    28. export interface CollapsedState{
    29. isCollapsed:boolean
    30. }

    关于定义hooks.ts文件的初衷:

            因为当我准备在组件中使用cosnt isCollapsed = useSelector((state)=>state.isCollapsed)时会出现报错警告:'state' is of type 'unknown';

    这个错误信息 "'state' 的类型为 'unknown'" 表示 TypeScript 无法推断你的 Redux 存储中的状态的类型。这可能是因为你没有正确定义 Redux 状态和 reducer 的类型。

            所以最后的解决方案就是对使用状态就行类型注解并

    1. //hooks.ts
    2. import { TypedUseSelectorHook, useSelector,useDispatch } from 'react-redux';
    3. import {AppDispatch, RootState } from "./Store"; // 导入你的 RootState
    4. /**
    5. * TypedUseSelectorHook:可以·提高代码维护与可读性减少重复类型注解
    6. * RootState:是数据类型
    7. * */
    8. export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector; //全局使用useAppSelector
    9. export const useAppDispatch: () => AppDispatch = useDispatch;

    ~~~~~~~~上述就对redux完成配置~~~~~~~

    组件使用:这里为了简单演示将两个组件代码写在了一起,组件1&组件2

    1. //组件1
    2. import {useAppSelector} from "../../redux/hooks";
    3. import {shallowEqual} from "react-redux";
    4. /***
    5. shallowEqual:在组件决定是否被渲染之前,会进行一次浅比较如果该组件依赖的state并没有被更改,不进行渲染
    6. */
    7. function SideMenu() {
    8. //获取store值
    9. const isCollapsed = useAppSelector(state => state,shallowEqual);
    10. return(
    11. <div>{isCollapsed.isCollapsed}div>
    12. )
    13. }
    14. //组件2
    15. import { Button } from 'antd';
    16. import {useAppDispatch,useAppSelector} from "../../redux/hooks";
    17. import {setisCollapsed} from "../../redux/reducers/collapsed/CollapsedReducer";
    18. import {shallowEqual} from "react-redux";
    19. function TopHeader(){
    20. const dispatch = useAppDispatch();
    21. const { isCollapsed } = useAppSelector(state => state,shallowEqual);
    22. return(
    23. <Button
    24. type="text"
    25. icon={isCollapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
    26. onClick={() => {
    27. console.log("111",!isCollapsed)
    28. dispatch(setisCollapsed({ isCollapsed: !isCollapsed }));
    29. }}
    30. )
    31. }

    最后千万切记要在项目根节点中设置Provider包裹全局使用store

    <><>

  • 相关阅读:
    Elasticsearch 日期数据类型
    自学Python 66 Tkinter开发基础
    双硬盘WIN+UBUNTU 系统, 重装UNBUNTU20.14系统后无法启动, 进入进入grub rescue
    如何写论文
    【Linux】常用文件管理命令
    STM32CubeIDE设置Flash烧录地址和大小(告别Keil魔术棒)
    基于深度学习的端到端语音识别时代
    java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
    npm ERR! While resolving: ruoyi@3.8.5npm ERR! Found: webpack@5.89.0
    搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库
  • 原文地址:https://blog.csdn.net/qq_41030766/article/details/132715084