React Query + Redux toolkit 封装异步请求

news/2024/7/15 19:47:42 标签: react.js, javascript, ecmascript

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

使用 createSlice 创建 reducer:

javascript">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,避免重复的请求。

javascript">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,展示用户信息和用户列表。

javascript">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.niftyadmin.cn/n/5140299.html

相关文章

2022最新版-李宏毅机器学习深度学习课程-P26 自注意力机制

一、应用情境 输入任意长度个向量进行处理。 从输入看 文字处理&#xff08;自然语言处理&#xff09; 将word表示为向量 one-hotword-embedding声音信号处理 每个时间窗口&#xff08;Window, 25ms&#xff09;视为帧&#xff08;Frame&#xff09;,视为向量图 每个节点视为…

Echats-自定义图表2

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh-cmn-Hans"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>…

企业 Tomcat 运维 部署tomcat反向代理集群

一、Tomcat 简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c; Tomcat和Nginx、Apache(httpd)、Web服务器一样&#xff0c;具有处理HTML页面的功能不过Tomcat处理静态HTML的能力不如Nginx/Apache服务器 一个tomcat默认并…

信号类型(通信)——QPSK、OQPSK、IJF_OQPSK调制信号

系列文章目录 《信号类型&#xff08;通信&#xff09;——仿真》 《信号类型&#xff08;通信&#xff09;——QAM调制信号》 文章目录 前言 一、QPSK通信调制信号 1.1、原理 1.2、仿真 二、OQPSK通信调制信号 1.1、原理 1.2、仿真 三、IJF_OQPSK通信调制信号 1.1、…

电脑如何录制小视频

如果你想在你的电脑上录制视频分享给你的朋友或者亲人&#xff0c;无论你的电脑是win还是mac&#xff0c;都可以在本篇文章中找到电脑录制视频的详细教程。小编为你们整理了2种不同系统电脑的录制详细流程&#xff0c;继续阅读查看吧&#xff01; 第一部分&#xff1a;windows…

关于中间件技术

1.分布式中中间件提供的支持 在一个分布式系统中&#xff0c;中间件通常提供两种不同类型的支持&#xff1a; 1、交互支持&#xff0c;中间件协调系统中的不同组件之间的交互。 2、提供公共服务&#xff0c;即中间件提供对服务的可复用的实现。这些服务可能会被分布 式系统中…

【深度学习】pytorch——快速入门

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ pytorch快速入门 简介张量&#xff08;Tensor&#xff09;操作创建张量向量拷贝张量维度张量加法函数名后面带下划线 _ 的函数索引和切片Tensor和Numpy的数组之间的转换张量&#xff08;tensor&#xff09;与标量…

stm32内 misc stm32f10x_hd stm32f10x_it stm32f10x_conf关系

STM32启动流程 初始位置 startup_stm32f10x_hd.s 查看源码 ;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s ;* Author : MCD Application Team ;* Version :…