Kokia yra Redux Thunk funkcija ir ar galima be jos apsieiti?
sobes.tech AI
Atsakymas iš AI
Redux Thunk — tai tarpininkas (middleware) Redux, kuris leidžia rašyti veiksmų kūrėjus, grąžinančius funkciją vietoj įprasto objekto.
Ši funkcija gauna argumentus dispatch (kitiems veiksmams siųsti) ir getState (prieigai prie dabartinės saugyklos būsenos). Thunk veiksmai naudingi asinchroninėms operacijoms atlikti, pvz., API užklausoms, prieš siunčiant sinchroninį veiksmą būsenos atnaujinimui.
Be Redux Thunk (arba panašaus middleware, pvz., Redux Saga ar Redux Observable), veiksmų kūrėjai turi grąžinti tik objektus, kas neleidžia tiesiogiai apdoroti asinchroninių operacijų standartiniame Redux.
Galima išvengti naudojant kitus middleware, pvz.,
- Redux Saga: naudoja generatorius asinchroninėms operacijoms valdyti, siūlo galingesnį ir testuojamą požiūrį.
- Redux Observable: pagrįstas RxJS, naudoja Observables asinchroniniams duomenų srautams valdyti.
- Redux Promise Middleware: automatiškai apdoroja pažadus, siųsdamas veiksmus jų sprendimo ar atmetimo metu.
Pasirinkimas priklauso nuo asinchroninės logikos sudėtingumo ir komandos pageidavimų. Paprastiems atvejams Thunk dažniausiai pakanka ir yra lengvas mokytis. Sudėtingesniems scenarijams, Saga ar Observable gali būti tinkamesni.
Pavyzdys — thunk veiksmas:
// actions/user.js
import axios from 'axios'; // API užklausų bibliotekos pavyzdys
export const FETCH_USER_REQUEST = 'FETCH_USER_REQUEST';
export const FETCH_USER_SUCCESS = 'FETCH_USER_SUCCESS';
export const FETCH_USER_FAILURE = 'FETCH_USER_FAILURE';
// Sinchroniniai veiksmų kūrėjai
const fetchUserRequest = () => ({
type: FETCH_USER_REQUEST
});
const fetchUserSuccess = (user) => ({
type: FETCH_USER_SUCCESS,
payload: user
});
const fetchUserFailure = (error) => ({
type: FETCH_USER_FAILURE,
payload: error
});
// Asinchroninis thunk veiksmas
export const fetchUser = (userId) => {
return async (dispatch, getState) => {
dispatch(fetchUserRequest()); // Siunčiame pradžios veiksmą
try {
const response = await axios.get(`/api/users/${userId}`); // Atlikti asinchroninį užklausą
dispatch(fetchUserSuccess(response.data)); // Siunčiame sėkmės veiksmą su duomenimis
} catch (error) {
dispatch(fetchUserFailure(error.message)); // Siunčiame klaidos veiksmą
}
};
};