我对redux工具包还不熟悉,但经过长时间的研究,我设法为redux工具包编写了这个配置,以便从我的后端Express API获取数据.如果我走对了,有谁能给我指路吗?

我应该使用createAsyncThunk还是这个配置也是正确的?

100

import { configureStore } from "@reduxjs/toolkit";
import productReducer from "./features/productSlice";

export const store = configureStore({
  reducer: {
    products: productReducer,
  },
});

100

import { createSlice } from "@reduxjs/toolkit";

const initialState = {
  products: [],
  isLoading: false,
  error: null,
};

export const productsSlice = createSlice({
  name: "products",
  initialState,
  reducers: {
    startLoading: (state) => {
      state.isLoading = true;
    },
    hasError: (state, action) => {
      state.error = action.payload;
      state.isLoading = false;
    },
    allProductsSuccess: (state, action) => {
      state.products = action.payload;
      state.isLoading = false;
    },
  },
});

export default productsSlice.reducer;

100

import axios from "axios";
import { productsSlice } from "./productSlice";

const { allProductsSuccess, startLoading, hasError } = productsSlice.actions;

export const fetchProducts = () => async (dispatch) => {
  dispatch(startLoading());
  try {
    const { data } = await axios.get("/api/v1/products");

    dispatch(allProductsSuccess(data.products));
  } catch (e) {
    dispatch(hasError(e?.response?.data?.message));
  }
};

100

const { products, isLoading } = useSelector((state) => state.products);
console.log(products, isLoading)

useEffect(() => {
   dispatch(fetchProducts());
}, []);

谢谢!

推荐答案

对吗?当然,它看起来可以编译和运行,并做您想做的事情.

这是推荐的实施吗?不完全同意.使用createAsyncThunk实用程序,您可以减少一些样板/重复性代码.您可以有效地"合并"productSlice.jsproductActions.js文件,因为所有相关的操作都可以从productSlice.js文件中导出.createAsyncThunk为您生成"Pending"/"Success"/"Error"操作.

示例:

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import axios from "axios";

export const fetchProducts = createAsyncThunk(
  "products/fetchProducts",
  async (_, thunkAPI) => {
    try {
      const { data } = await axios.get("/api/v1/products");

      return data;
    } catch (e) {
      return thunkAPI.rejectWithValue(e?.response?.data?.message);
    }
  }
);

const initialState = {
  products: [],
  isLoading: false,
  error: null,
};

const productsSlice = createSlice({
  name: "products",
  initialState,
  extraReducers: builder => {
    builder
      .addCase(fetchProducts.pending, (state) => {
        state.isLoading = true;
      })
      .addCase(fetchProducts.fulfilled, (state, action) => {
        state.products = action.payload.products;
        state.isLoading = false;
      })
      .addCase(fetchProducts.rejected, (state, action) => {
        state.error = action.payload;
        state.isLoading = false;
      });
  },
});

export default productsSlice.reducer;

Reactjs相关问答推荐

无法从正在使用Reaction的Electron 商务store 项目中的购物车中删除项目

如何在react 流中使用文本区域和改变 node 的输入大小?

有没有办法将在服务器端全局获取的一些数据传递到Next&>13应用程序目录中的客户端组件?

为什么我的react虚拟化列表不显示滚动条,除非我确保高度低于rowCount*rowHeight?

在React Create App TS项目中安装material UI

捕获表单数据时的Reactjs问题

为什么react日历时间轴项Renderprops 不能与useState挂钩一起使用?

错误:操作必须是普通对象.使用自定义中间件进行异步操作. Redux/工具包

警告:遇到两个子元素拥有同一把 keys .键应该是唯一的,以便组件在更新时保持其身份

ReactJS 中的图像加载顺序

Syncfusion:带有 TabItemsDirective 的选项卡组件不显示任何内容

Next.js i18n 路由不适用于动态路由

一周前刚开始学习React,一直在调试为什么输入框在每次输入后都没有焦点

NextJS htaccess 设置

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

setState 改变对象引用

在表格中显示具有自定义声明的用户状态

.filter() 函数在删除函数中创建循环 - React

如何跨微前端 React 应用管理状态管理?

react-three-fiber 场景背景比原图更亮