React Hooks — এগুলো কি, প্রধান হুক এবং ব্যবহারের নিয়ম

লেখক: IT Sectr প্রকাশিত: 2026-07-04 পড়ার সময়: 10 মিনিট

React Hooks হল ফাংশন যা আপনাকে ক্লাস না লিয়ে ফাংক্শনাল কম্পোনেন্টে স্টেট, ইফেক্ট, কন্টেক্সট এবং React এর অন্যান্য বৈশিষ্ট্য ব্যবহার করতে দেয়। React 16.8 এ উপস্থাপিত, হুক HOC এবং render props এর মতো জটিল প্যাটার্ন প্রতিস্থাপন করে বিকাশ পদ্ধতিকে আমূল পরিবর্তন করেছে। React, 2024 এর মতে, সব কম্পোনেন্ট পরিচালনা পরিদৃশ্য আবরণ করে 15টি বিল্ট-ইন হুক আছে।

মূল কথা

  • হুক — extends Component ছাড়াই ফাংক্শনাল কম্পোনেন্টে React বৈশিষ্ট্য সংযোগ করার জন্য ফাংশন।
  • useState — অবস্থা পরিচালনার জন্য মৌলিক হুক, একটি মান এবং একটি সেটার ফিরিয়ে দেয়।
  • useEffect — সাইড ইফেক্টের জন্য: API অনুরোধ, সাবস্ক্রিপশন, টাইমার, DOM ম্যানিপুলেশন।
  • useContext — Consumer র্যাপার এবং static contextType ছাড়াই React কন্টেক্সট অ্যাক্সেসের জন্য।
  • হুকের নিয়ম — শুদুমাত্র উপরের স্তরে এবং শুদুমাত্র ফাংক্শনাল কম্পোনেন্ট বা কাস্টম হুকের মধ্যে ডাকুন।

React Hooks কি?

React Hooks হল React এ নির্মিত ফাংশনের একটি সেট যা আপনাকে ক্লাস না তৈরি করে ফ্রেমওয়ার্কের আন্তরিক প্রক্রিয়ায় “সংযুক্ত হতে” দেয়। React 16.8 এর আগে, ফাংক্শনাল কম্পোনেন্ট শুদুমাত্র props আক্ষেপ করতে এবং JSX ফিরিয়ে দিতে পারত — যেকোনো জটিল যুক্তির জন্য একটি ক্লাস কম্পোনেন্ট প্রয়োজন হত।

ক্লাস কম্পোনেন্টের সমস্যা হল সংপর্কিত যুক্তি বিচ্ছিন্ন। একটি এন্টিটির সঙ্গে সম্পর্কিত কোড (যেমন, একটি WebSocket সাবস্ক্রিপশন) জোর করে componentDidMount, componentDidUpdate এবং componentWillUnmount এর মধ্যে বিভক্ত ছিল। হুক এটি সমাধান করে: সব যুক্তি একটি useEffect এ গ্রুপবদ্ধ হয়।

দ্বিতীয় সমস্যা হল যুক্তি পুনর্ব্যবহার। ক্লাস কম্পোনেন্টের মধ্যে অবস্থা যুক্তি পুনর্ব্যবহার করতে, আপনাকে HOC (উচ্চ-স্তরের কম্পোনেন্ট) বা render props প্রয়োগ করতে হত — উভয় প্যাটার্ন কম্পোনেন্ট ট্রিতে অতিরিক্ত নেস্টিং তৈরি করত। কাস্টম হুক নেস্টিং ছাড়াই এটি সমাধান করে।

useState — অবস্থা পরিচালনা

useState হল সবচেয়ে মৌলিক হুক। এটি একটি প্রারম্ভিক মান নেয় এবং একটি টিউপল ফিরিয়ে দেয়: বর্তমান মান এবং এটি আপডেট করার একটি ফাংশন। ক্লাসে this.setState এর বিপরীত, useState অবজেক্ট মার্জ করে না — নতুন অবস্থা একটি নির্দিষ্ট useState কলের জন্য পূর্ববর্তী অবস্থাকে সম্পূর্ণ প্রতিস্থাপন করে।

js
import React, { useState } from 'react';

function Form() {
  const [text, setText] = useState('');
  const [submitting, setSubmitting] = useState(false);

  async function handleSubmit() {
    setSubmitting(true);
    await fetch('/api/submit', {
      method: 'POST',
      body: JSON.stringify({ text })
    });
    setSubmitting(false);
  }

  return (
    <div>
      <input
        value={text}
        onChange={e => setText(e.target.value)}
      />
      <button onClick={handleSubmit}
        disabled={submitting}>
        {submitting ? 'Saving...' : 'Submit'}
      </button>
    </div>
  );
}

ফাংক্শনাল setState ফর্ম

useState সেটার একটি ফাংশন আক্ষেপ করতে পারে যা পূর্ববর্তী মান প্রাপ্ত করে এবং একটি নতুন মান ফিরিয়ে দেয়। ফাংক্শনাল ফর্ম আবশ্যক যখন নতুন অবস্থা পূর্ববর্তী অবস্থা থেকে গণনা করা হয় এবং ব্যচ করা setState কল সম্ভব — প্রতিটি কল বর্তমান পূর্ববর্তী মান পাবে।

useEffect — সাইড ইফেক্ট এবং জীবনচক্র

useEffect ফাংক্শনাল কম্পোনেন্টে সাইড ইফেক্ট করার জন্য একটি হুক। এটি দুটি আর্গুমেন্ট নেয়: একটি ইফেক্ট ফাংশন এবং একটি ডিপেন্ডেন্সি অ্যারে। React প্রতিটি রেণ্ডারের পর ইফেক্ট চালায়, কিন্তু যখন ডিপেন্ডেন্সি নির্দিষ্ট করা হয় — শুদুমাত্র যখন তাদের মধ্যে কোনোটি পরিবর্তন হয়।

একটি খালি ডিপেন্ডেন্সি অ্যারে [] মানে ইফেক্টটি প্রথম রেণ্ডারের পর একবার চালে (componentDidMount এর অনুরূপ)। ইফেক্ট থেকে একটি ফাংশন ফিরিয়ে দেওয়া একটি পরিষ্কার যা আনমৌন্টে চালে (componentWillUnmount এর অনুরূপ) এবং ইফেক্ট পুনরায় চালানোর আগে।

js
import React, { useState, useEffect } from 'react';

function ChatRoom({ roomId }) {
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    const socket = new WebSocket(`wss://chat/${roomId}`);

    socket.onmessage = (event) => {
      setMessages(prev => [...prev, JSON.parse(event.data)]);
    };

    // পরিষ্কার - সকেট বন্ধ করুন
    return () => socket.close();
  }, [roomId]);

  return <ul>
    {messages.map((msg, i) =>
      <li key={i}>{msg.text}</li>
    )}
  </ul>;
}

useEffect এর ডিপেন্ডেন্সি ইফেক্ট এবং বাইরের দুনিয়ার মধ্যে একমাত্র সংযোগ। যদি ইফেক্ট props বা অবস্থা থেকে একটি ভেরিয়েবল ব্যবহার করে, তাকে ডিপেন্ডেন্সি অ্যারে থাকতে হবে। এই নিয়ম অগ্রাহ করা পুরনো closures সহ বগের উৎস।

useContext — কন্টেক্সট অ্যাক্সেস

useContext কন্টেক্সট মান পড়ার জন্য একটি হুক। এটি React.createContext দ্বারা তৈরি একটি কন্টেক্সট অবজেক্ট নেয় এবং বর্তমান মান ফিরিয়ে দেয়। যদি কন্টেক্সট পরিবর্তিত হয়, তবে কম্পোনেন্ট স্বচালিতভাবে নতুন মান দিয়ে পুনরায় রেণ্ডার হয়।

useContext এর আগে, ফাংক্শনাল কম্পোনেন্টে কন্টেক্সট অ্যাক্সেস করতে Context.Consumer এ মুড়িয়ে দেওয়া প্রয়োজন ছিল, যা নেস্টিং তৈরি করত। useContext সম্পূর্ণ ভাবে Consumer দূর করে — শুদুমাত্র ফাংক্শনাল কম্পোনেন্টে যেকোনো জায়গায় হুকটি ডাকুন।

js
import React, { createContext, useContext } from 'react';

const ThemeContext = createContext('হালকা');

function ThemedButton() {
  const theme = useContext(ThemeContext);

  return <button
    className={`btn btn-${theme}`}
  >
    {theme === 'dark' ? 'moon' : '☀️'}
  </button>;
}

useContext Redux বা বৈশ্বিক অবস্থার বিকল্প নয়। React কম পরিবর্তিত মান — থিম, লোকেল, প্রমাণীকরণ স্টেটাসের জন্য কন্টেক্সট ব্যবহার করার পরামর্শ দেয়। বারবার আপডেট ডেটার জন্য, প্রতিটি পুনরায় রেণ্ডার সব কন্টেক্সট গ্রাহকের পুনরায় গণনা করবে, যা কার্যদক্ষতা হ্রাস করতে পারে।

useReducer — জটিল অবস্থা যুক্তি

useReducer জটিল আপডেট যুক্তি সহ অবস্থার জন্য useState এর একটি বিকল্প। এটি একটি রিডিউসার ফাংশন এবং প্রারম্ভিক অবস্থা নেয়, বর্তমান অবস্থা এবং একটি dispatch ফাংশন ফিরিয়ে দেয়। রিডিউসার বর্তমান অবস্থা এবং কার্য প্রাপ্ত করে, একটি নতুন অবস্থা ফিরিয়ে দেয় — সাইড ইফেক্ট ছাড়া একটি বিশুদ্ধ ফাংশন।

useReducer বিশেষ করে উপযোগী যখন একাধিক কার্য (set, reset, increment, addItem) একটি অবস্থা পরিচালনা করে। বিভিন্ন সেটার সহ একাধিক useState কলের পরিবর্তে — স্পষ্ট কার্য ধরনের সাথে একটি রিডিউসার। এটি যুক্তিকে পূর্বানুমানযোগ্য এবং সহজে পরীক্ষণযোগ্য করে।

js
import React, { useReducer } from 'react';

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { ...state, count: state.count + 1 };
    case 'setStep':
      return { ...state, step: action.step };
    case 'reset':
      return { count: 0, step: 1 };
    default:
      throw new Error('Unknown action: ' + action.type);
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, {
    count: 0,
    step: 1
  });

  return (
    <>
      <p>Count: {state.count}</p>
      <button
        onClick={() => dispatch({ type: 'increment' })}>+</button>
      <button
        onClick={() => dispatch({ type: 'reset' })}>Reset</button>
    </>
  );
}

useRef, useMemo, useCallback — অপ্টিমাইজেশন

useRef একটি পরিবর্তনীয় অবজেক্ট তৈরি করে যা রেণ্ডারের মধ্যে টিকে থাকে। current পরিবর্তন করলে পুনরায় রেণ্ডার হয় না। প্রধান ব্যবহার হল DOM উপাদান অ্যাক্সেস এবং পরিবর্তনীয় মান (টাইমার, পূর্ববর্তী মান, লাইব্রেরী ইনস্টেন্স) সংরক্ষণ।

useMemo একটি ফাংশনের ফলাফল মেমাইজ করে। এটি শুদুমাত্র তখন মান পুনরায় গণনা করে যখন একটি ডিপেন্ডেন্সি পরিবর্তিত হয়। ব্যয়বহুল গণনার জন্য এটি ব্যবহার করুন — বড় অ্যারে ফিল্টারিং, সর্টিং, ডেটা ফরম্যাটিং। useCallback ফাংশন মেমাইজিংয়ের জন্য useMemo এর একটি বিশেষ মামলা।

js
import React, { useRef, useMemo, useCallback } from 'react';

function SearchPage({ items, query, onItemSelect }) {
  const inputRef = useRef(null);

  // মৌন্টে অটোফোকাস
  useEffect(() => {
    inputRef.current?.focus();
  }, []);

  // ফিল্টার করা ফলাফল মেমাইজ করুন
  const filtered = useMemo(() => {
    return items.filter(item =>
      item.name.toLowerCase()
        .includes(query.toLowerCase())
    );
  }, [items, query]);

  // কলব্যাক মেমাইজ করুন
  const handleSelect = useCallback((id) => {
    onItemSelect(id);
  }, [onItemSelect]);

  return (
    <div>
      <input ref={inputRef}
        value={query}
        onChange={e => setQuery(e.target.value)}
      />
      <ul>
        {filtered.map(item =>
          <li key={item.id}>
            <button
              onClick={() => handleSelect(item.id)}>
              {item.name}
            </button>
          </li>
        )}
      </ul>
    </div>
  );
}

একটি গুরুত্বপূর্ণ নিয়ম: useRef, useMemo এবং useCallback হল অপ্টিমাইজেশন টুল, বাধ্যতামূলক গঠন নয়। সব কিছু useMemo এ মুড়িয়ে দেবেন না — প্রথমে কার্যদক্ষতা মাপুন। অকালে অপ্টিমাইজেশন কোড জটিল করে। React কম্পোনেন্ট দ্রুত রেণ্ডার করে; useMemo কেবল তখনই প্রয়োজন যখন গণনা সত্যিই ব্যয়বহুল (O(n²) এবং উপরে।

হুকের নিয়ম এবং সাধারণ ভুল

React হুকের জন্য দুটি কড়া নিয়ম চালু করেছে। প্রথম: শুদুমাত্র উপরের স্তরে হুক ডাকুন — শর্ত, লূপ বা নেস্টেড ফাংশনের মধ্যে নয়। দ্বিতীয়: শুদুমাত্র React ফাংক্শনাল কম্পোনেন্ট বা কাস্টম হুক থেকে হুক ডাকুন। ESLint প্লাগইন eslint-plugin-react-hooks স্বচালিতভাবে উভয় নিয়ম পরীক্ষা করে।

সবচেয়ে সাধারণ ভুল হল হুক কলের ক্রম লঙ্ঘন। React রেণ্ডারের মধ্যে হুক কলের ক্রমের উপর নির্ভর করে। যদি একটি হুক একটি শর্তের মধ্যে থাকে এবং একটি রেণ্ডারে চালা না, তবে পরবর্তী সকল হুক সরে যায়, যা বগ সৃষ্টি করে।

ভুলকি হয়সমাধান
শর্তে হুকহুকের ক্রম ভেঙ্গে যায়শর্ত যুক্তি হুকের মধ্যে সরান
Stale closureইফেক্ট পুরনো মান ব্যবহার করেসব ডিপেন্ডেন্সি অ্যারে যুক্ত করুন
অসীম লূপuseEffect ডিপেন্ডেন্সি ছাড়া state পরিবর্তন করেডিপেন্ডেন্সি নির্দিষ্ট করুন বা useReducer ব্যবহার করুন
render এ ref পরিবর্তনফাংশন বড়িতে সাইড ইফেক্টম্যুটেশন useEffect এ সরান

দ্বিতীয় সাধারণ ভুল হল useEffect এ stale closure। যদি ইফেক্ট একটি ভেরিয়েবল ব্যবহার করে যা ডিপেন্ডেন্সিতে নির্দিষ্ট নয়, তবে ইফেক্টটি ক্লোজার তৈরির সময় এর মান “ক্যাপচার” করে। সমাধান হল সব ব্যবহৃত ভেরিয়েবল সবসময় ডিপেন্ডেন্সি অ্যারে অন্তর্ভুক্ত করা। যদি অনেক ডিপেন্ডেন্সি থাকে, তবে ইফেক্টটিকে একাধিক ভাগে বিভক্ত করার কথা চিন্তা করুন।

সামন্য প্রশ্নোত্তরি

হুক কেন শর্তের মধ্যে ডাকা যায় না?

React রেণ্ডারের মধ্যে হুক কলের ক্রমের উপর নির্ভর করে। যদি একটি হুক একটি শর্তের মধ্যে ডাকা হয় এবং একটি রেণ্ডারে চালা না, তবে পরবর্তী সকল হুক সরে যায় — তাদের অবস্থা মিশে যায়। ESLint নিয়ম hooks/exhaustive-deps এ সম্পর্কে সাবধান করে।

useEffect এবং useLayoutEffect এর মধ্যে পার্থক্য কি?

useLayoutEffect সিংক্রোনাস এবং ব্রাউজার পরিবর্তন আঁকার আগে চালে। useEffect অ্যাসিংক্রোনাস — আঁকার পরে। শুদুমাত্র তখন useLayoutEffect ব্যবহার করুন যখন আপনাকে ব্যবহারকারী পরিবর্তন দেখার আগে DOM মাপতে বা পরিবর্তন করতে হবে (popover অবস্থান, স্ক্রল পুনরুদ্ধার)।

আনমৌন্টে একটি fetch অনুরোধ কিভাবে বাতিল করবেন?

useEffect এর মধ্যে AbortController ব্যবহার করুন। একটি controller তৈরি করুন, signal টি fetch এ পাস করুন, এবং cleanup ফাংশনে controller.abort() কল করুন। পুরনো ব্রাউজারের জন্য, একটি cancelled ফ্ল্যাগ ব্যবহার করুন: return () => { cancelled = true; } setState এর আগে একটি যাচাই সহ।

কাস্টম হুক কি এবং কখন এটি তৈরি করবেন?

কাস্টম হুক হল একটি JavaScript ফাংশন যার use উপসর্গ আছে এবং যা বিল্ট-ইন হুক ব্যবহার করে। এটি তৈরি করুন যখন হুকের সাথে একই যুক্তি দুই বা ততোধিক কম্পোনেন্টে পুনরাবৃত্তি হয়। উদাহরণ: useDebounce, useLocalStorage, useMediaQuery। কাস্টম হুক HOC এবং render props প্রতিস্থাপন করে।

Strict Mode এ useEffect দুইবার কেন চালে?

Strict Mode এ, React ইচ্ছাকৃতভাবে ডিভেলপমেন্টে অপরিষ্কৃত ইফেক্টের সাথে বগ খুঁজতে কম্পোনেন্টটিকে দুইবার মৌন্ট এবং আনমৌন্ট করে। যদি cleanup সঠিকভাবে লেখা হয়, তবে দুইবার কল কোনো সমস্যা সৃষ্টি করে না। প্রোডাক্শন মোডে এটি হয় না।

সারাংশ

  • React Hooks — ক্লাস প্রতিস্থাপন করে ফাংক্শনাল কম্পোনেন্টে অবস্থা, ইফেক্ট এবং কন্টেক্সট ব্যবহারের জন্য ফাংশন।
  • useState — নিরাপদ আপডেটের জন্য ফাংক্শনাল সেটার সহ স্থানীয় অবস্থার জন্য মৌলিক হুক।
  • useEffect — ডিপেন্ডেন্সি অ্যারে এবং cleanup ফাংশন সহ সাইড ইফেক্টের জন্য সার্বত্রিক হুক।
  • useContext — Consumer র্যাপার এবং অতিরিক্ত নেস্টিং ছাড়াই React কন্টেক্সটে সরাসরি অ্যাক্সেস।
  • useReducer — একটি কম্পোনেন্টের মধ্যে Redux এর বিকল্প হিসাবে কার্য ধরনের সাথে জটিল অবস্থা যুক্তির জন্য।
  • useRef, useMemo, useCallback — অপ্টিমাইজেশন টুল: DOM রিফারেন্স, মান এবং কলব্যাক মেমাইজেশন।
  • উপরের স্তর নিয়ম — শর্ত, লূপ এবং নেস্টেড ফাংশনের বাইরে হুক ডাকার কঠোর নিষেধ।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন