React-Query چیست و چگونه با استفاده از react query داده ها را واکشی کنیم؟

معمولاً به این صورت است که داده ها را از باطن دریافت می کنیم.
import axios from "axios";
import { useEffect, useState } from "react";
interface Users {
id: number;
name: string;
}
const Users = () => {
const [users, setUsers] = useState<Users[]>([]);
const [error, setError] = useState("");
useEffect(() => {
axios
.get("https://jsonplaceholder.typicode.com/users")
.then((res) => setUsers(res.data))
.catch((err) => setError(err.message));
}, []);
if (error) return <div>{error}</div>;
return (
<div>
{users.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</div>
);
};
export default Users;
ما از useState استفاده می کنیم و به شما امکان می دهد حالت را به اجزای تابعی اضافه کنید و از useEffect برای واکشی داده ها از backend و ذخیره در متغیر وضعیت خود استفاده می کنیم.
اما مشکلات کمی در این کد وجود دارد.
- بدون لغو درخواست
- بدون تفکیک نگرانی ها
- بدون تلاش مجدد
- بدون رفرش خودکار
- بدون حافظه پنهان
1.) عدم لغو درخواست: اگر مؤلفه ما نصب نشده باشد، درخواست را لغو نمی کنیم.
2.) عدم تفکیک نگرانی ها: منطق پرس و جو در داخل کامپوننت به بیرون درز کرده است، ما نمی توانیم آن را در هر جایی دوباره استفاده کنیم.
3.) بدون تکرار: درخواست ناموفق را دوباره امتحان نمی کنیم.
4.) بدون رفرش خودکار: در صورتی که داده ها تغییر کند، در حالی که کاربران در این صفحه هستند، تغییرات را نمی بینند مگر اینکه بازخوانی کنند.
5.) بدون کش: اگر می خواهید بدانید که کش چیست؟ حافظه پنهان فرآیند ذخیره سازی داده ها در مکانی است که در آینده سریعتر و کارآمدتر به آنها دسترسی داشته باشید.
ما مشکلات زیادی داریم، به همین دلیل از React-query استفاده می کنیم.
React Query یک کتابخانه قدرتمند برای مدیریت واکشی و کش کردن داده ها در برنامه های React است.
برای نصب react query
در ترمینال شما
npm من @tanstack/react-query
import React from "react";
import ReactDOM from "react-dom/client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import App from "./App.tsx";
// We use QueryClient for managing and caching remote data in react query.
// first you need to create a new instance of Query client.
const queryClient = new QueryClient();
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</React.StrictMode>
);
برای واکشی داده با قلاب پرس و جو
ما از query hook برای واکشی داده ها و دادن شیء پیکربندی با دو ویژگی استفاده می کنیم
1.) queryKey
2.) queryFn
queryKey -> queryKey شناسه منحصر به فرد برای پرس و جو است، برای ذخیره سازی استفاده می شود، ما این را در آرایه ای از یک یا چند مقدار تنظیم می کنیم.
queryFn -> این تابعی است که ما برای واکشی داده ها از باطن استفاده می کنیم، این تابع باید قولی را برگرداند که داده ها را برطرف می کند یا خطا ایجاد می کند.
در بدنه تابع من از axios برای واکشی دادهها از backend استفاده کردهام.
const userQuery = useQuery({
queryKey: ["users"],
queryFn: axios.get("https://jsonplaceholder.typicode.com/users").then(res => res.data)
})
این userQuery دارای چندین ویژگی مانند داده، خطا، isLoading و غیره است.
اجازه دهید userQuery را تخریب کنیم.
const {data, error, isLoading} = useQuery({
queryKey: ["users"],
queryFn: axios.get("https://jsonplaceholder.typicode.com/users").then(res => res.data)
})
بنابراین هنگام فراخوانی قلاب پرس و جو، باید نوع خطاهایی را که ممکن است هنگام واکشی داده رخ دهد، مشخص کنیم.
const {data, error, isLoading} = useQuery<User[], Error>({
queryKey: ["users"],
queryFn: axios.get("https://jsonplaceholder.typicode.com/users").then(res => res.data)
})
import { useQuery } from "@tanstack/react-query";
import axios from "axios";
import { useEffect, useState } from "react";
interface Users {
id: number;
name: string;
}
const Users = () => {
const { data, error, isLoading } = useQuery<User[], Error>({
queryKey: ["users"],
queryFn: () =>
axios
.get<Users[]>("https://jsonplaceholder.typicode.com/users")
.then((res) => res.data),
});
if(isLoading) return <div>Loading....!</div>
if(error) return <div>{error.message}</div>
return (
<div>
{data?.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</div>
);
};
export default Users;
اما مشکلی در این کد وجود دارد، ما تفکیک نگرانی نداریم، پرس و جو ما لو رفته است.
بنابراین یک پوشه به نام hooks ایجاد کنید -> یک فایل به نام useUsers.ts ایجاد کنید
import { useQuery } from "@tanstack/react-query";
import axios from "axios";
interface Users {
id: number;
name: string;
}
const useUsers = () =>
useQuery<Users[], Error>({
queryKey: ["users"],
queryFn: () =>
axios
.get<Users[]>("https://jsonplaceholder.typicode.com/users")
.then((res) => res.data),
});
export default useUsers;
import useUsers from "./hooks/useUsers";
const Users = () => {
const { data, error, isLoading } = useUsers();
if (isLoading) return <div>Loading.....!</div>;
if (error) return <div>{error.message}</div>;
return (
<div>
{data?.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</div>
);
};
export default Users;
متشکرم!