首页 > 其他分享 >react状态管理store用法二: 使用Hooks 配置redux

react状态管理store用法二: 使用Hooks 配置redux

时间:2023-05-15 15:23:06浏览次数:37  
标签:const string Hooks react state export import redux store

react最通用的状态管理方案就是的redux,下面介绍通过Hooks的方式使用redux

npm install react-redux @reduxjs/toolkit -S

 

创建store

1.新建store文件夹,在下面新建index.tsx文件和slices文件夹,其中slices文件夹用来定义需要放进store的数据结构和方法

slices文件夹下新建app.ts文件,内容

import api from '@/api';
import {createAsyncThunk, createSlice} from '@reduxjs/toolkit';
import type {RootState} from '../index';

export interface BInfo {
    title: string;
    link?: string;
}
interface AppState {
    bInfo: BInfo[];
    collapsed: boolean;
    user: {
        userName: string;
        loading: boolean;
        authList: string[];
    };
}

interface QueryUserInfoReturned {
    userName: string;
    authList: string[];
}
export const queryUserInfo = createAsyncThunk<QueryUserInfoReturned>('app/userinfo', async (_, {rejectWithValue}) => {
    try {
        const res = await api.getUserInfo();
        const userName: string = res?.loginEmail || '"';
        const roleList: any[] = res?.authList || [];
        const authList: string[] = Array.from(
            new Set(
                roleList
                    .map((item) => {
                        const authKeyList: string | undefined = item.resourceIds;
                        return authKeyList ? authKeyList.split(',') : [];
                    })
                    .flat()
            )
        );
        return {
            userName,
            authList
        };
    } catch (err: any) {
        return rejectWithValue(err?.msg || '网络错误');
    }
});

const initialState: AppState = {
    bInfo: [],
    collapsed: false,
    user: {
        loading: true,
        userName: '',
        authList: []
    }
};

export const appSlice = createSlice({
    name: 'app',
    initialState,
    reducers: {
        setBInfo(state, {payload}) {
            Array.isArray(payload) && (state.binfo = payload);
        },
        toggleCollapse(state) {
            state.collapsed = !state.collapsed;
        }
    },
    extraReducers: (builder) =>
        builder
            .addCase(queryUserInfo.pending, (state) => {
                state.user.loading = true;
            })
            .addCase(queryUserInfo.fulfilled, (state, {payload}) => {
                state.user.loading = false;
                state.user.userName = payload.userName;
                state.user.authList = payload.authList;
            })
            .addCase(queryUserInfo.rejected, (state) => {
                state.user.loading = false;
            })
});

export const {setBInfo, toggleCollapse} = appSlice.actions;
export const selectApp = (state: RootState) => state.app;

export default appSlice.reducer;

 createAsyncThunk用来处理异步数据,正常情况使用createSlice的action即可。

 index.tsx文件

import {configureStore} from '@reduxjs/toolkit';

import app from './slices/app';
// import pageList from './slices/pageList'; //     组件状态


const store = configureStore({
    reducer: {
        app,
       // pageList
    },
        //关闭redux序列化检测
    middleware: getDefaultMiddleware => [
        ...getDefaultMiddleware({serializableCheck: false}),
    ],
});

export default store;

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export interface AppThunkApiConfig {
    state: RootState;
    rejectValue: string;
}

使用

import {Provider} from 'react-redux';
import store from '@/store';
const App = () => {
  return (
  <Provider store={store} >
    <Component>      
</Provider>  
)  
}
export default App;

调用

import React, { useEffect} from 'react';
import {useDispatch, useSelector} from 'react-redux';
import {queryUserInfo, setBinfo,selectApp} from '@/store/slices/app';

const Mycomponent =() => {
    const dispatch = useDispatch();
    const {user} = useSelector(selectApp);
    useEffect(() => {
        dispatch(queryUserInfo());
    }, [dispatch]);
    useEffect(() => {
        dispatch(setBInfo([1,2,3]));
    }, [dispatch]);
  return (<div>


</div>)  
}
export default Mycomponent;

ps: 上面只是介绍了hooks使用方式,但也可以在类组件中正常使用,你可以按原来的方式使用redux

// 类组件使用
import store from '@/store';
// 你自己的数据结构
const {
        pageList: {
                        pageName:{
                            selectedRow: [],
                            selectedRowKeys: [],
                        },
                    },
         } = store.getState();

store.dispatch(setSelectedRowKeys(
                    {
                        pageName,
                        selectedRowKeys: _selectedRowKeys,
                    }
   ));

 

标签:const,string,Hooks,react,state,export,import,redux,store
From: https://www.cnblogs.com/anin/p/17394435.html

相关文章

  • react微信扫码登录
    第一步<scriptsrc="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js">第二步//缓存已经加载的资源回调importloadScriptOncefrom'load-script-once'//加载一次functionloadScriptOnceSync(src:string,success:any){loadScriptO......
  • 如何优雅的处理 React 表单
    如何优雅的处理React表单HTML表单处理本身是一件比较简单的事情,但是当我们对交互的要求高了之后,他就会变得异常复杂——尤其是在React中使用时,我们不得不创建冗长的代码去维护各种状态。那么有没有什么现成的开源方案可以供我们使用,最终优雅的创建React表单呢?本文不会详......
  • vue3 hooks
    一.在项目目录中新增hoos文件夹 import{ref,onMounted}from"vue";//vue3中的hooks就是函数的一种写法,就是将文件的一些单独功能的js代码进行抽离出来,放到单独的js文件中,//或者说是一些可以复用的公共方法/功能。其实hooks和vue2中的mixin有点类似,但是相对......
  • react Ref 什么时候用,怎么用
    何时使用ref通常,当你的组件需要“跳出”React并与外部API通信时,你会用到ref——通常是不会影响组件外观的浏览器API。以下是这些罕见情况中的几个:存储timeoutID存储和操作DOM元素存储不需要被用来计算JSX的其他对象。如果你的组件需要存储一些值,但不影......
  • useCallback,useMemo, React.memo的区别
     同:useCallback,useMemo和React.memo是三个在React中用于优化性能的方法。它们的主要目标是避免不必要的重新渲染和计算。因为当一个组件的状态发生变化时,React会重新渲染整个组件树。用这三个hook和组件,可以提升性能。 异:下面从属性,接收参数,返回值,意义和案例等方面进行详细地......
  • react useReactStore.js
    import{useCallback,useEffect,useMemo,useRef,useState}from'react';import_getfrom'lodash.get';import_setfrom'lodash.set';exportconstKEY_SAVED_TICK_COUNT='KEY_SAVED_TICK_COUNT';exportclassGlo......
  • React笔记-组件通信(六)
    React笔记-组件通信(六)props概念props是组件之间通讯的纽带props也是组件中内置的一个属性通过父级组件传入在类组件里可以直接通过this.props获取注意:props是不可变的(只读)修改需要从传值的组件中修改props改变会使视图重新渲染组件传值父传子在父组件......
  • react echarts tooltip 区域新加一个输入框,可以编辑保存数据
     //demo页面//需求:产品要求在折线图的tooltip上新加一个输入框,可以编辑这个输入框保存备注信息,需要两种交互方式:1.鼠标滑过展示备注信息。2.鼠标点击某一个日期时,鼠标可以滑到tooltip上做保存/编辑操作。//思路:1.保留初始鼠标滑过echarts图效果。//2.主要难点是点击时to......
  • react-html2canvas-jspdf 自动分页导出pdf
    //新建exportPDF.js文件importhtml2canvasfrom'html2canvas';importjsPDFfrom'jspdf';functiongeneratePDF(id,title){ //下载pdf方法 letdemo=document.getElementById(id); demo.style.overflow='visible'; html2canvas(......
  • ReactRedux工具包reduxjs/toolkit的使用
    首先可以先看一下Redux如何工作store负责存储数据,相当于仓库,action负责dispatch派发数据,reducer负责接收处理数据然后交给store(个人理解可能有些偏差欢迎交流斧正)传统redux写法(旧)//reducerconstcounterReducer=(state={counter:0},action)=>{if(action.type......