javascript - Redux 工具包和 Axios

标签 javascript reactjs redux axios toolkit

我正在使用 Redux Toolkit 通过 Axios 连接到 API。 我正在使用以下代码:

const products = createSlice({
    name: "products",
    initialState: {
        products[]
    },
    reducers: {
        reducer2: state => {
            axios
                .get('myurl')
                .then(response => {
                    //console.log(response.data.products);
                    state.products.concat(response.data.products);
            })

        }
    }
});

axios 正在连接到 API,因为要打印到控制台的注释行正在向我显示数据。但是,state.products.concat(response.data.products);抛出以下错误:

类型错误:无法在已撤销的代理上执行“get”

有什么办法可以解决这个问题吗?

最佳答案

我更愿意将 createAsyncThunkextraReducers 一起用于 API 数据

假设此页面名称为 productSlice.js

从“@reduxjs/toolkit”导入{ createSlice,createSelector,PayloadAction,createAsyncThunk,};

export const fetchProducts = createAsyncThunk(
  "products/fetchProducts", async (_, thunkAPI) => {
     try {
        //const response = await fetch(`url`); //where you want to fetch data
        //Your Axios code part.
        const response = await axios.get(`url`);//where you want to fetch data
        return await response.json();
      } catch (error) {
         return thunkAPI.rejectWithValue({ error: error.message });
      }
});

const productsSlice = createSlice({
   name: "products",
   initialState: {
      products: [],
      loading: "idle",
      error: "",
   },
   reducers: {},
   extraReducers: (builder) => {
      builder.addCase(fetchProducts.pending, (state) => {
        state. products = [];
          state.loading = "loading";
      });
      builder.addCase(
         fetchProducts.fulfilled, (state, { payload }) => {
            state. products = payload;
            state.loading = "loaded";
      });
      builder.addCase(
        fetchProducts.rejected,(state, action) => {
            state.loading = "error";
            state.error = action.error.message;
      });
   }
});


export const selectProducts = createSelector(
  (state) => ({
     products: state.products,
     loading: state.products.loading,
  }), (state) =>  state
);
export default productsSlice;

在您的store.js中添加productsSlice: productsSlice.reducer到out store reducer 中。

然后为了在组件中使用添加这些代码......我也更喜欢使用钩子(Hook)

import { useSelector, useDispatch } from "react-redux";

import {
  fetchProducts,
  selectProducts,
} from "path/productSlice.js";

然后最后一部分像这样在你的主管中调用这些方法

const dispatch = useDispatch();
const { products } = useSelector(selectProducts);
React.useEffect(() => {
   dispatch(fetchProducts());
}, [dispatch]); 

最后,您可以在组件中将数据作为产品进行访问。

关于javascript - Redux 工具包和 Axios,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60220514/

相关文章:

javascript - 插件 SDK。将 main.js 分割成几个单元?

javascript - ReactJS - 无法读取状态对象上的 this.props.value

javascript - react 路由器 this.props.location

reactjs - 使用react-router-redux,如何以编程方式重定向到URL

javascript - 我应该在何时何地为 Redux 存储中的规范化数据使用 "fetchingData"状态?

javascript - A* 六边形网格中的寻路

javascript - 如何删除 nicEdit 文本编辑器中的上传按钮

javascript - React-native redux - this.props 未从 AsyncStorage 定义

reactjs - 什么是 react typescript 的 React.ComponentPropsWithoutRef

javascript - React 仅重新渲染网格中更改的元素