Fetching Data পাঠের loading/error/data প্যাটার্নটি দরকারি — আর এমন কিছুও যা আপনি যেকোনো কিছু fetch করা প্রতিটি কম্পোনেন্টে বারবার টাইপ করে ফেলবেন। একটি কাস্টম হুক সেই লজিককে একটি পুনঃব্যবহারযোগ্য ফাংশনে বের করে আনে, ঠিক একই কারণ যে কারণে আপনি যেকোনো পুনরাবৃত্ত লজিক একটি সাধারণ ফাংশনে বের করে আনতেন।
একমাত্র আসল নিয়ম: এর নাম use দিয়ে শুরু হয়। এটাই React-কে (আর linter-কে) Rules of Hooks মানা হচ্ছে কিনা যাচাই করতে দেয় — হুক শুধু একটি কম্পোনেন্টের বা আরেকটি হুকের top level-এ কল করা যায়, কখনো একটি কন্ডিশন, লুপ, বা নেস্টেড ফাংশনের ভেতরে নয়।
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
let ignore = false;
setLoading(true);
fetch(url)
.then((res) => res.json())
.then((json) => {
if (!ignore) setData(json);
})
.catch((err) => {
if (!ignore) setError(err.message);
})
.finally(() => {
if (!ignore) setLoading(false);
});
return () => {
ignore = true;
};
}, [url]);
return { data, loading, error };
}এটা Fetching Data পাঠের একই লজিক, লাইন বাই লাইন — শুধু নিজের একটি ফাংশনে মোড়ানো।
function UserProfile({ userId }) {
const { data: user, loading, error } = useFetch(`/api/users/${userId}`);
if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {error}</p>;
return <h1>{user.name}</h1>;
}
function PostList() {
const { data: posts, loading } = useFetch('/api/posts'); // same hook, reused
if (loading) return <p>Loading...</p>;
return <ul>{posts.map((p) => <li key={p.id}>{p.title}</li>)}</ul>;
}দুটো কম্পোনেন্টই useFetch-এ নিজস্ব স্বাধীন কল পায় — দুটো useState কল কখনো state শেয়ার না করার মতোই, একটি কাস্টম হুক দুইবার কল করলে এর অভ্যন্তরীণ state-এর দুটো সম্পূর্ণ আলাদা instance তৈরি হয়।
function useToggle(initialValue = false) {
const [value, setValue] = useState(initialValue);
const toggle = () => setValue((v) => !v);
return [value, toggle];
}
function Menu() {
const [isOpen, toggleOpen] = useToggle();
return <button onClick={toggleOpen}>{isOpen ? 'Close' : 'Open'}</button>;
}প্রথম ব্যবহারে নয়, দ্বিতীয় ব্যবহারে বের করে আনুন
একই stateful লজিক দ্বিতীয় একটি কম্পোনেন্টে দেখা দিলে একটি কাস্টম হুক বের করে আনুন — তার আগে নয়। একটি এক-বারের useState কলের নিজের হুক দরকার নেই; লাভটা নির্দিষ্টভাবে আসে এমন লজিক পুনরাবৃত্তি না করা থেকে যা নাহলে কপি-পেস্ট হতো।