React Academy · leksjon

Asynkron logikk med createAsyncThunk

Håndter API-kall i Redux med createAsyncThunk og livssyklusen pending/fulfilled/rejected.

Leksjon 2 av 413 trinn

Asynkron logikk med createAsyncThunk er en gratis leksjon i React Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i React Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i React Academy inneholder totalt 4 leksjoner.

Velkommen

I denne leksjonen skal du håndtere API-kall i Redux med createAsyncThunk og håndtere lifecycle-actionene pending, fulfilled og rejected i slicen din.

Hva er createAsyncThunk?

createAsyncThunk genererer en thunk-action creator som automatisk sender tre lifecycle-actions: pending (startet), fulfilled (fullført) og rejected (mislyktes). Du håndterer hver av dem i extraReducers.

Definere en thunk

Kall createAsyncThunk med en typestreng og en asynkron payload creator-funksjon. Returner dataene du vil ha som fulfilled-payloaden.
import { createAsyncThunk } from '@reduxjs/toolkit';

export const fetchUser = createAsyncThunk(
  'users/fetchById',
  async (userId) => {
    const response = await fetch('/api/users/' + userId);
    return response.json(); // becomes action.payload on fulfilled
  }
);

Håndtere i extraReducers

Legg til cases for alle de tre lifecycle-tilstandene i slicens extraReducers. Håndter loading-, data- og error-state etter behov.
extraReducers: (builder) => {
  builder
    .addCase(fetchUser.pending, state => {
      state.loading = true;
      state.error = null;
    })
    .addCase(fetchUser.fulfilled, (state, action) => {
      state.loading = false;
      state.user = action.payload;
    })
    .addCase(fetchUser.rejected, (state, action) => {
      state.loading = false;
      state.error = action.error.message;
    });
}

Sende thunk-en

Send thunk-en fra en komponent med useDispatch. Send argumenter direkte til thunk-action creatoren.
const dispatch = useDispatch();
useEffect(() => {
  dispatch(fetchUser(userId));
}, [userId]);

Få tilgang til state i thunk-en

Payload creator-funksjonen mottar et thunkAPI-objekt som sitt andre argument. Bruk thunkAPI.getState() for å lese gjeldende Redux-state, og thunkAPI.dispatch() for å sende andre actions.
export const saveItem = createAsyncThunk(
  'items/save',
  async (item, { getState }) => {
    const { auth } = getState();
    return fetch('/api/items', {
      method: 'POST',
      headers: { Authorization: 'Bearer ' + auth.token },
      body: JSON.stringify(item),
    }).then(r => r.json());
  }
);

Håndtere feil med rejectWithValue

Hvis du vil sende en egendefinert error-payload til rejected-caset, bruker du thunkAPI.rejectWithValue(). Den avviste actionens action.payload vil inneholde det egendefinerte error-objektet ditt.
export const fetchData = createAsyncThunk(
  'data/fetch',
  async (id, { rejectWithValue }) => {
    const res = await fetch('/api/' + id);
    if (!res.ok) return rejectWithValue({ status: res.status });
    return res.json();
  }
);
// In rejected case: action.payload.status is available

Avbryte thunk-er

Send et AbortController-signal til fetch-kallet ditt inne i thunk-en. createAsyncThunk gjør signal tilgjengelig via thunkAPI.signal automatisk når thunk-en avbrytes med dispatch.abort().
async (id, { signal }) => {
  const res = await fetch('/api/' + id, { signal });
  return res.json();
}

Vente på en sendt thunk

dispatch() av en thunk returnerer et Promise. Du kan vente på det for å vite når det asynkrone arbeidet er fullført, noe som er nyttig i mønstre der du omdirigerer etter lagring.
const result = await dispatch(saveItem(data));
if (saveItem.fulfilled.match(result)) {
  navigate('/success');
}

Builder-notasjon kontra objektnotasjon

Bruk builder.addCase-callbackmønsteret i extraReducers — det er typesikkert og støttet. Den eldre objektnøkkel-notasjonen er foreldet i nyere RTK-versjoner.

Hurtigsjekk

Hva skjer når den asynkrone funksjonen inne i createAsyncThunk kaster en feil?

Oppsummering

createAsyncThunk genererer automatisk actions for pending, fulfilled og rejected. Håndter alle tre i extraReducers. Bruk rejectWithValue for egendefinerte error-payloads og thunkAPI.getState() for å få tilgang til gjeldende state inne i thunk-er.

Neste

Neste leksjon: **RTK Query: Endpoints & Auto-Caching** — du skal definere API-endepunkter med createApi og la RTK Query håndtere caching automatisk.
Gratis å komme i gang

Lær deg React med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
88
Leksjoner
324

Ofte stilte spørsmål

Er leksjonen «Asynkron logikk med createAsyncThunk» gratis?

Ja – hele teksten i «Asynkron logikk med createAsyncThunk» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av React Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i React Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Asynkron logikk med createAsyncThunk»?

Håndter API-kall i Redux med createAsyncThunk og livssyklusen pending/fulfilled/rejected. Du øver på React Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med React Academy?

Ingen tidligere erfaring er nødvendig. React Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Asynkron logikk med createAsyncThunk»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne React Academy-leksjonen?

Ja. Alle React Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Redux Toolkit-slices og createSlice
  2. Asynkron logikk med createAsyncThunk
  3. RTK Query: Endpoints og automatisk caching
  4. Optimistiske oppdateringer og ugyldiggjøring av cache
← Tilbake til React Academy