Адрасаванне дадзейнаў са RTK Query: Практычны пакальпнік па мутацыях
Дазвольце даклэ научыцца, як выкарыстоўваць builder.mutation() у RTK Query для адправкі запытак типу POST, керавання станамі заваношчання і адзынакоў, а таксама стварэння функцыональнага компонента формы.
Введэнне
Раней мы розглядалі, як настроўваць Redux Toolkit Query (RTK Query) і выканаляваць операцыі чытання за дапамою builder.query(). Гэта дазволіла нам запрашваць даны з API і прадставляць іх у аплікацыі на React без неабяжнага стварэння useEffect(), useState() чы аднойчынай логікі запрашэння.
Аднак чытанне дадзеных — це толькі палова прыбліжнасць у работе з API. Большасць аплікацыяў таксама патрабуе спосабоў дадавання, змены чы адчынення записаў на сервере.
Разглянем калькі распашчытных сцэнарыяў:
- Форма регистрацыі адправляе новыя даны абліковання.
- Экран заходу адправляе даны абліковання для пераканання.
- Платформа для блогавання публікуе новыя статты.
- Інтернет-магазін стварае новыя замовленні.
- Аплікацыя для задач сахоўвае новададзеныя заведаменні.
Кожна з эых дзеянняў перадае інфармацыю з кліента на сервер, і гэта зазвычай выканаецца через запит HTTP POST.
RTK Query не спрацоўвае запыты POST як запыты — ён спрацоўвае іх як мутацыі.
У гэтым артыкуле показана, як адправляць даныя за дапамою builder.mutation(). Мы разберам кожны фрагмент коду і кожна настройка, ўпэўніваючыся, што вы разумеете не толькі тое, што трэба запісаць, але і чаму кожная частка мае значэнне.
Разумеўце методы HTTP
Перш чым прыступіць да коду, корыстна пераглянуць разныя дзеяння HTTP і для чаго яны выкорыстоўваюцца.
Тыповая REST API адкрывае кілька операцый:
| Метод | Цэль | Прыклад |
|---|---|---|
| GET | Чытанне даных | Зялезьце всіх корыстнікаў |
| POST | Дадаць новыя даны |
Этыя інструкцыі сфокусаваны на POST — методзе, які викорыстоўваецца для стварэння новых ресурсаў на серверы.
Чаму POST не викорыстоўвае builder.query()?
Эта прычына часта вызывае плутанне у новачакоў.
Якшо builder.query() можа запрашваць даныя, чаму тая ж функцыя не можа адправіць даныя на сервер?
Прычына крыўціцца тым, для чаго створены кожны з інструментаў.
Запыты
Запыты існуюць для зяўлення інформацыі.
Тыповыя прыклады:
- З’явіцься пользователяў
- З’явіцься продуктав
- З’явіцься замовэнняў
- З’явіцься паспэўдак
Паколькі тыя ж данні можаць быць запрашаныя параду, запиты автаматычна кэшуюць свае рэзультаты.
Мутацыі
Мутацыі існуюць для модыфікаціі даных.
Тыповыя прыклады:
- Стварэнне пользователя
- Апдэйт пользователя
- Выдаленне пользователя
- Уваход
- Рэгістрацыя
Мутацыя сігналізуе серверу, што ў чымусь трэба змяніцца.
Саме гэта разлікаванне ў тым, чаму RTK Query обрабоцвае мутацыі окрема ад запитоў.
Што мы будамы ствараць
Мы створым базовую форму, якая надае новага пользователя серверу.
Цэльвы канцэнтр паадрасу ёсьць:
https://jsonplaceholder.typicode.com/users
А пакет дадзеных, які надаецца ў тэле запиту, будзе выглядаць так:
{
"name": "John Doe",
"email": "john@example.com"
}
Структура проекта
src
│
├── app
│ └── store.js
│
├── services
│ └── api.js
│
├── components
│ └── AddUser.jsx
│
├── App.jsx
│
└── main.jsx
Канфігурацыя хранення Redux застаецца такой, як і ранейш. Всё, што нам трэба дадаць, — это канец-пункт мутацыі плюс компонент, які керуе адправленнем формы.
Шаг 1 — Створыць канец-пункт мутацыі
Ачыніце файл службы API:
src/services/api.js
Потым дадаце новая вялічыню канец-пункта ўнутрь об’екта endpoints.
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
export const api = createApi({
reducerPath: "api", baseQuery: fetchBaseQuery({
baseUrl: "https://jsonplaceholder.typicode.com/",
}), endpoints: (builder) => ({ addUser: builder.mutation({ query: (newUser) => ({
url: "users",
method: "POST",
body: newUser,
}), }), }),});export const {
useAddUserMutation,
} = api;
Давайце рассмотрым гэты код лінія за лініяй.
Разумеўце builder.mutation()
addUser: builder.mutation({
Хоча builder.query() прызначаны для запрашэння дадзейна, builder.mutation() викорыстоўваецца тады, калі трэба зменіць якісь элемент на сервере.
Пашырэныя сценарыі ўжывання:
- Створэнне корыстнікаў
- Рэгістрацыя абліков
- Увайшчыце
- Апдэйт продуктаў
- Выдаленне пасоў
Калі ваша аплікацыя запішвае чыста зменяе данні на бэкэнде, мутацыя ўсёраследны інструмент для гэтага.
Разумеўце query()
query: (newUser) => ({
Гэтая функцыя прымеўае любыя данні, якія вы перадаеце ёй з коду React.
Напрыклад, якщо вы адправляеце:
addUser({
name: "John",
email: "john@example.com",
});
тады параметр пад назвай
newUser
будзе мячыць:
{
name: "John",
email: "john@example.com"
}
Гэты об’ект і ўтварае тэла запытку.
Разумеўце URL
url: "users",
Усёлякі чыны, калі базовы URL налаштаваны як:
https://jsonplaceholder.typicode.com/
RTK Query аўтаматычна спаівае іх у:
https://jsonplaceholder.typicode.com/users
так што вам ніколі не трэба самим пісаць полны адрес.
Разумеўце методу
method: "POST",
Гэтыя рэчы ясна працаваюць з RTK Query, каб ён адправіў запытку типу POST. Якщо яго не паказваць, запытка за замовчаннем будзе типу GET.
Разумеўце тэла
body: newUser,
Усё, што зберагаецца ў newUser, перадаецца як пэўнай кантэнт пытання, напрыклад:
{
"name": "John",
"email": "john@example.com"
}
Сервер прыме гэты об’ект абсолютна такім, які быў створаны.
Шаг 2 — Экспорт стваранага хука
export const {
useAddUserMutation,
} = api;
Так сама, як запыткі даўнаюць автаматычна створаны хук, напрыклад
useGetUsersQuery()
мутацыі автаматычна ствараюць свой сабе хук:
useAddUserMutation()
Вы ніколі не пішаце гэты хук вручную — RTK Query стварае яго для вас на адной заснове назвы канцэнтра.
Шаг 3 — Стварэнне компонента React
Створыце новы файл:
src/components/AddUser.jsx
і дадзіце гэты код:
import { useState } from "react";
import { useAddUserMutation } from "../services/api";const AddUser = () => { const [name, setName] = useState("");
const [email, setEmail] = useState(""); const [
addUser,
{
isLoading,
isSuccess,
error,
},
] = useAddUserMutation(); const handleSubmit = async (e) => { e.preventDefault(); await addUser({
name,
email,
}); setName("");
setEmail(""); }; return (
<form onSubmit={handleSubmit}> <input
type="text"
placeholder="Enter Name"
value={name}
onChange={(e) => setName(e.target.value)}
/> <input
type="email"
placeholder="Enter Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/> <button type="submit">
Add User
</button> {isLoading && <p>Saving...</p>} {isSuccess && <p>User Added Successfully.</p>} {error && <p>Something went wrong.</p>} </form>
);};export default AddUser;
Давайце разберам, што тут відбываецца.
Розумэнне useAddUserMutation()
const [
addUser,
{
isLoading,
isSuccess,
error,
},
] = useAddUserMutation();
У працоўнасці з хукамі мутацый у працоўнасці з хукамі запыткаў вяртаецца маса замест аб’екта. Першы элемент:
addUser
Эта функцыя ўтвараецца для запуску запиту, а другі элемент — это об’ект, які мае корисную інформацыю пра статус таго запиту.
Разумеўце addUser()
await addUser({
name,
email,
});
Выкліканне гэтай функцыі запускае запит таким чынам:
POST /users
Запит носіць пакет дадзеных у формате JSON:
{
"name": "John",
"email": "john@example.com"
}
У бэкенде гэты пакет дадзеных викорыстоўваецца для стварэння абсалютна новага запису пра корыстніка.
Разумеўце статусаў мутацый
Паралельна з функцыяю-трыгерам, RTK Query даўае вам кальку статусных флагоў, якія описваюць, што ведзеца з запитам.
isLoading
isLoading
Гэты флаг станавіцца true, калі мутацыя ў процесе выканання, таму ён ідзямы для блакавання кнопкі адправкі чыстаць спінер, пакуль не будзе атрымана адпаведнасць.
isSuccess
isSuccess
Калі запит завершыцца без адзінаго бяга, гэта значэнне стане true, чым будзе дацца ясны сігнал для адказвання паведамленнем пра пאўтверджэнне або перанаслання пользователя ў інша месца.
error
error
Якщо сервер адказае пра няверненне, дакладны мэтаданы будуць тут, чым будзе можна паказаць чытальны адказ пра адзінак, а не зламаны інтерфейс.
Шаг 4 — Адрасаванне компонента
Ачніце галоўны файл прыкладнай програмы:
src/App.jsx
і заменіце яго ўместа на следуючы:
import AddUser from "./components/AddUser";
function App() {
return <AddUser />;
}export default App;
Потым запусціце сервер разработчика:
npm run dev
Запыніце поля формы і нажміце Add User — RTK Query сама адправіць запыт типу POST.
Полны трыбут запыту
Ёсць статыстыка таго, што адбываецца пад капотам, ад выканання формы да абнавлення статаусу:
User Fills Form
│
▼
Clicks Submit
│
▼
addUser()
│
▼
Generated Mutation Hook
│
▼
RTK Query
│
▼
fetchBaseQuery()
│
▼
POST Request
│
▼
Server Response
│
▼
Mutation State Updates
│
▼
React Re-renders
Зверніце увагу на все, чаго няма ў гэтым алгорытме:
fetch()axios.post()useEffect()- Ручныя запісы стану завантажэння
- Ручныя запісы стану адзінакоў
RTK Query сама караецца па кожнам з гэтых аспектаў у тылу.
builder.query() проты builder.mutation()
Дужа важна знать, калі выкарыстоўваць кожны з гэтых методаў-білдераў.
builder.query() прызначан для запрашоўкі дадзейнасі, зазвычай праз запиты GET, і ён стварае хукі, такія як useGetUsersQuery(), які запускаюцца аўтаматычна як толькі компонент атрыбутуецца. На протывесу гэтаму, builder.mutation() прызначан для змены дадзейнасі праз методы на кшталт POST, PUT, PATCH або DELETE. Ён стварае хукі, такія як useAddUserMutation(), які запускаюцца толькі тады, калі вы явна вызываеце функцыю-трыгер, а не пад час атрыбутування компонента. Коротка сказаў, запрашоўкі выкорыстовуюцца для чытання, а мутацыі — для стварэння, апдэйта чы скасывання.
Выбір правага інструмента для кожной задачы дапамагае падтрымаць цэнзыяльнасць логіки API і яе зрозумеласць.
Найкращыя практыкі
Памяроцуйце гэтыя рэкамендаціі ўсё час, калі ствараеце функцыянал POST з RTK Query:
- Вжывайце
builder.mutation()кожны раз, калі операцыя меняе дадзейнась на серверы.
isLoading, isSuccess і error, каб інтэрфейс быў реактыўным і інформатыўным.addUser, createPost або registerUser.unwrap(), якщо хочаце кераваць успехам і нявыпадкамі за дапамогою блока try...catch у своіх компонентах.Ключовыя выводы
Пройшоўшы гід, вы вучыліся:
- Ствараць мутацыю за дапамогою
builder.mutation(). - Падключыць канцаўку POST унутрошчы API slice.
- Адправляць данні JSON да бэкенд-сервісу.
useAddUserMutation().Такі патэрн часта відбываецца ў прыкладных дапраўках — процесы рэгістрацыі корыстнікаў, аутантыфікацыі, публікацыі стацэйк у блогу, артыкулявання замоваў і бесліч іншых сцэнарыяў стварэння дадзеных.
Што далей?
Колі вы вже ведаеце, як працаваць з запытамі POST, наступны логічны крок — выучыцца, як аднавляць і вычысцваць існуючыя записы.
У наступным кансалтатэ ўзьмуцца:
- Аднавленне записаў за дапамогою запытоў PUT і PATCH.
- Вычысцванне записаў за дапамогою запыту DELETE.
providesTags і invalidatesTags — каб усё заставаць сінхронным без ручнага падтрымання дадзейнаў.Калі вы заканчыце чытанне гіда, вы будете абяжаны для стварэння полныя прыкладаў аплікацый типу CRUD, выкорыстоўваючы патэрны RTK Query, готавыя да прыменення ў рэальных умовах.
Спаднія матэрыялы
- Змены стандартных налашчэнняў у TypeScript 6.0: практычны гід па міграцыі — Дазвольце дазнацца, якія дзевяць стандартных налашчэнняў кампайляра TypeScript 6.0 зменіліся, як налаштаваць tsconfig для 2026 года і як падготавіць кодавы базы для версіі TypeScript 7, створанай на архітектуре Go.
- Стандарты Full-Stack JavaScript у 2026 году: TypeScript, RSC і іншыя — Адказвае, чаму TypeScript, React Server Components і болей простыя методы карбавання стану сталі стандартным комплектам для команд, якія працуюць з JavaScript у 2026 году.