redux-toolkit之异步请求

简介

  • 我是使用axios来进行异步请求 ,安装请点击

  • 我们一般使用createAsyncThunk来创建一个异步请求点击

    • createAsyncThunk创建一个异步的action,这个方法被触发的时候会有三个状态 pending(进行中)fulfilled(成功)rejected(失败)
    • 返回一个标准的Redux thunk action creator。thunk动作创建器函数将为pending, fulfilled, rejected情况提供普通action creator,并将其作为嵌套字段附加

参数

  1. actionType字符串(如weather/loadPic), rtk会会基于此生成以下三个action creator,具体点击
pending: 'weather/loadPic/pending'
fulfilled: 'weather/loadPic/fulfilled'
rejected: 'weather/loadPic/rejected'
  1. payloadCreator:回调函数,他应该返回一个值,且这个值会在fulfilledaction creater中作为payload的值,他一般返回一个promise
export const loadPic = createAsyncThunk('weather/loadPic', async () => {
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("后台返回的数据")
        },2000)
    })
});
  • 在前台我们要await来等待数据
    const handleWeather = async() => {
        // 在这里dispatch返回一个promise
        const res = await dispatch(loadPic()) 
        console.log("组件",res);
    }

例子

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

import { increment } from './counterSlice';

// axios返回promise
const loadPicAPI = () => axios.get("https://bird.ioliu.cn/v1?url=http://www.bing.com/HPImageArchive.aspx?format=js&idx=1&n=1")


export const loadPic = createAsyncThunk('weather/loadPic', async () => {
    const res = await loadPicAPI();
    return res; // 此处的返回结果会在 .fulfilled中作为payload的值
});

export const weatherSlice = createSlice({
    name: 'weather',
    initialState: {
        weather:""
    },
    reducers: {
        loadWeatherData(state, { payload }) {
            state.weather = payload;
        },
    },
    // 可以额外的触发其他slice中的数据关联改变
    extraReducers: {
        [loadPic.fulfilled](state, { payload }) {
            console.log("payload",payload);
            console.log("111111111");
            increment({step:3})
            state.weather = payload.data.images[0].copyrightlink;
        },
        [loadPic.rejected](state, err) {
            console.log(err);
        },
        [loadPic.pending](state) {
            console.log('进行中');
        },
    },
});

export const { loadWeatherData } = weatherSlice.actions;
export default weatherSlice.reducer;
  • extraReducers除了跟一个对象外,还可以跟一个函数,点击
createSlice({
	...
    extraReducers: builder => {
        builder.addCase(loadPic.fulfilled, (state, action) => {
            console.log(action);
            state.weather = action.payload.data.images[0].copyrightlink;
        })
    }
})
  1. 在实例当中createAsyncThunk会生成三对actionaction creater,在适当的时机就会触发,相应的action creater
pending: 'weather/loadPic/pending'
fulfilled: 'weather/loadPic/fulfilled'
rejected: 'weather/loadPic/rejected'

报错

  • 在我们使用的时候可能会遇到报错,我们可以做如下处理
    在这里插入图片描述

因为redux存储时是将数据序列化后存储的,并且@reduxjs/toolkit里面会默认检查是否序列化

export default configureStore({
    reducer: {
        counter: counterSlice,
        weather: weatherSlice
    },
    middleware:(getDefaultMiddleware)=> getDefaultMiddleware({serializableCheck:false})
});
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Redux Toolkit 包含一个名为 `createAsyncThunk` 的工具函数,它可以帮助我们轻松地处理异步请求。 使用 `createAsyncThunk` 函数,我们可以定义一个函数来处理异步请求,并且该函数会自动生成与请求相关的三个 action:pending(请求开始),fulfilled(请求成功)和 rejected(请求失败)。 下面是一个使用 `createAsyncThunk` 的示例: ```javascript import { createAsyncThunk } from '@reduxjs/toolkit'; import { fetchUser } from './api'; export const getUser = createAsyncThunk( 'user/fetch', async (userId, thunkAPI) => { const response = await fetchUser(userId); return response.data; } ); // 然后在 reducer 中处理请求状态 const userSlice = createSlice({ name: 'user', initialState: { user: null, isLoading: false, error: null, }, reducers: {}, extraReducers: { [getUser.pending]: (state, action) => { state.isLoading = true; }, [getUser.fulfilled]: (state, action) => { state.isLoading = false; state.user = action.payload; }, [getUser.rejected]: (state, action) => { state.isLoading = false; state.error = action.error.message; }, }, }); ``` 在上面的示例中,我们首先使用 `createAsyncThunk` 函数创建了一个名为 `getUser` 的异步 action,它的名称为 `user/fetch`。然后我们在 `extraReducers` 中处理了请求状态。当请求开始时,`getUser.pending` action 会被触发,我们可以在这里将 `isLoading` 设置为 `true`。当请求成功时,`getUser.fulfilled` action 会被触发,我们可以在这里将 `isLoading` 设置为 `false` 并将返回的数据保存在 `user` 属性中。当请求失败时,`getUser.rejected` action 会被触发,我们可以在这里将 `isLoading` 设置为 `false` 并将错误信息保存在 `error` 属性中。 注意,我们在异步函数中的第二个参数 `thunkAPI` 中可以访问 `dispatch`、`getState`、`extra` 和 `fulfillWithValue` 等方法,这些方法可以帮助我们更好地处理异步请求

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值