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

React Query + Redux toolkit 封装异步请求

当你需要进行 Redux 和 React Query 的组合时,除了常规的 Redux 方法(例如手动派发 action 和更新 state),还可以使用 createSlice 和 React Query 进行组合,这可以让你更方便地封装异步请求和更容易地更新状态。

使用 createSlice 创建 reducer:

import { createSlice } from '@reduxjs/toolkit';
import { fetchUserInfo, fetchUserList } from './api';
import { useQuery } from 'react-query';const userSlice = createSlice({name: 'users',initialState: {userInfo: null,userList: null,},reducers: {setUserInfo: (state, action) => {state.userInfo = action.payload;},setUserList: (state, action) => {state.userList = action.payload;},},
});export const { setUserInfo, setUserList } = userSlice.actions;export const useUserInfoQuery = (userId) => {const { data, isLoading, isError } = useQuery(['userInfo', userId], () => fetchUserInfo(userId));if (data) {dispatch(setUserInfo(data));}return {user: useSelector((state) => state.users.userInfo),isLoading,isError,};
};export const useUserListQuery = () => {const { data, isLoading, isError } = useQuery('userList', fetchUserList);if (data) {dispatch(setUserList(data));}return {userList: useSelector((state) => state.users.userList),isLoading,isError,};
};export default userSlice.reducer;

接着,在 store 中注册 userReducer reducer,并添加 React Query Provider,这样可以在整个应用程序中共享 React Query 的 cache,避免重复的请求。

import { configureStore } from '@reduxjs/toolkit';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import userReducer from './userSlice';const queryClient = new QueryClient();const store = configureStore({reducer: {users: userReducer,},
});ReactDOM.render(<Provider store={store}><QueryClientProvider client={queryClient}><App /></QueryClientProvider></Provider>,document.getElementById('root')
);

最后,在组件中使用创建的 useUserInfoQueryuseUserListQuery hooks,展示用户信息和用户列表。

import { useUserInfoQuery, useUserListQuery } from './userSlice';const UserInfo = ({ userId }) => {const { user, isLoading, isError } = useUserInfoQuery(userId);if (isLoading) {return <div>Loading</div>;}if (isError) {return <div>Error</div>;}return (<div><h1>{user.name}</h1><p>{user.email}</p><p>{user.phone}</p></div>);
};const UserList = () => {const { userList, isLoading, isError } = useUserListQuery();if (isLoading) {return <div>Loading</div>;}if (isError) {return <div>Error</div>;}return (<div>{userList.map(user => (<div key={user.id}><h2>{user.name}</h2><p>{user.email}</p><p>{user.phone}</p></div>))}</div>);
};

通过使用 createSlice 和 React Query 结合的方式,不仅可以更轻松管理 Redux 的异步状态和数据请求,也更方便地管理用户的相关状态信息。

http://www.lryc.cn/news/217461.html

相关文章:

  • CSS基础知识点速览
  • Windows 时间服务配置和配置工具
  • cmake find_package、引用GDAL 初步学习
  • 紫光同创FPGA编写的8画面分割器演示
  • openLayers--绘制多边形、获取视图的中心点、获取当前地图等级、设置地图等级
  • CSP-31补题日记--梯度求解
  • MySQL 8.0.32 union 语句中文查不到数据
  • FlinkCDC系列:通过skipped.operations参数选择性处理新增、更新、删除数据
  • 高压检测设备
  • Vue3问题:如何实现组件拖拽实时预览功能?
  • 基于jsp的采购管理系统的分析与实现
  • react配置二级路由
  • C++ 模板特化
  • Spring-createBean部分源码
  • 2015年亚太杯APMCM数学建模大赛C题识别网络中的错误连接求解全过程文档及程序
  • js:可选链运算符(?.)和空值合并运算符(??)
  • 【Java 进阶篇】Java ServletContext功能:获取文件服务器路径
  • Android startActivity流程
  • Qt实验室
  • diffusers-Load adapters
  • CVI 串口调试助手
  • 【蓝桥杯选拔赛真题48】python最小矩阵 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
  • 如何在家庭网络中开启 IPv6内网穿透
  • CodeWhisperer 的安装及体验
  • 【C/C++】虚析构和纯虚析构
  • 第四章 应用SysML基本特性集的汽车示例 P1|系统建模语言SysML实用指南学习
  • C语言 写一个简易音乐播放器
  • 面试题:有一个 List 对象集合,如何优雅地返回给前端?
  • DAY43 完全背包理论基础 + 518.零钱兑换II
  • unity 从UI上拖出3D物体,(2D转3D)