[Front-end knowledge] React foundation consolidation (36) - asynchronous operation in RTK

React foundation consolidation (36) - asynchronous operations in RTK

1. Using asynchronous operations in RTK

  1. Introduce createAsyncThunk in RTK to monitor execution status in extraReducers

    import {
          
           createSlice, createAsyncThunk } from "@reduxjs/toolkit";
    import axios from "axios";
    
    export const fetchHomeMultidataAction = createAsyncThunk(
      "fetch/homemultidata",
      async () => {
          
          
        const res = await axios.get("http://123.207.32.32:8000/home/multidata");
        return res.data;
      }
    );
    
    const homeSlice = createSlice({
          
          
      name: "home",
      initialState: {
          
          
        banners: [],
        recommends: [],
      },
      reducers: {
          
          
        changeBanners(state, {
           
            payload }) {
          
          
          state.banners = payload;
        },
        changeRecommends(state, {
           
            payload }) {
          
          
          state.recommends = payload;
        },
      },
      extraReducers: {
          
          
        [fetchHomeMultidataAction.pending](state, action) {
          
          
          console.log("fetchHomeMultidataAction pending");
        },
        [fetchHomeMultidataAction.fulfilled](state, {
           
            payload }) {
          
          
          console.log("fetchHomeMultidataAction fulfilled");
          state.banners = payload.data.banner.list;
          state.recommends = payload.data.recommend.list;
        },
        [fetchHomeMultidataAction.rejected](state, action) {
          
          
          console.log("fetchHomeMultidataAction rejected");
        },
      },
    });
    
    export const {
          
           changeBanners, changeRecommends } = homeSlice.actions;
    export default homeSlice.reducer;
    
    
  2. Introduce the required asynchronous operation Action in the interface

    import React, {
          
           PureComponent } from "react";
    import {
          
           connect } from "react-redux";
    import {
          
           addNumber } from "../store/features/counter";
    import {
          
           fetchHomeMultidataAction } from "../store/features/home";
    
    export class Home extends PureComponent {
          
          
      componentDidMount() {
          
          
        this.props.fetchHomeMultidata()
      }
    
      addNumber(num) {
          
          
        this.props.addNumber(num);
      }
    
      render() {
          
          
        const {
          
           counter } = this.props;
        return (
          <div>
          home:{
          
          counter}
      <button onClick={
          
          (e) => this.addNumber(5)}>+5</button>
    <button onClick={
          
          (e) => this.addNumber(8)}>+8</button>
    <button onClick={
          
          (e) => this.addNumber(18)}>+18</button>
    </div>
    );
    }
    }
    
    const mapStateToProps = (state) => ({
          
          
      counter: state.counter.counter,
    });
    
    const mapDispatchToProps = (dispatch) => ({
          
          
      addNumber(num) {
          
          
        dispatch(addNumber(num));
      },
      fetchHomeMultidata(){
          
          
        dispatch(fetchHomeMultidataAction())
      }
    });
    
    export default connect(mapStateToProps, mapDispatchToProps)(Home);
    
    
  3. View running results
    insert image description here

2. Another way of writing extraReducer (chain call)

  1. extraReducer can also pass in a function that accepts a builder parameter:
extraReducers: (builder) => {
    
    
  builder
    .addCase(fetchHomeMultidataAction.pending, (state, action) => {
    
    
    console.log("fetchHomeMultidataAction pending");
  })
    .addCase(fetchHomeMultidataAction.fulfilled, (state, {
     
      payload }) => {
    
    
    console.log("fetchHomeMultidataAction fulfilled");
    state.banners = payload.data.banner.list;
    state.recommends = payload.data.recommend.list;
  })
    .addCase(fetchHomeMultidataAction.rejected, (state, action) => {
    
    
    console.log("fetchHomeMultidataAction rejected");
  });
},
  1. View the running results, which are consistent with the previous writing results
    insert image description here

Guess you like

Origin blog.csdn.net/weixin_42919342/article/details/131996389