Reactive Accelerator
React Js
Going Deep into React: Adding Interactivity
2.1 - Responding to Events - Adding Event Handlers

রিয়াক্ট আমাদের ইভেন্ট হ্যন্ডেল করার সিস্টেম দিয়ে দিয়েছে। ইভেন্ট হ্যান্ডেলার হলো মূলত যখন কোন ইভেন্ট ট্রিগার হয়, যেমন ঃ ক্লিক,হভার,ফোকাস এসব।

Adding Event Handler to JSX

রিয়াক্টে আমরা দুটি স্টেপে Event Handler এড করতে পারিঃ

হ্যান্ডেলার ফাংশন ডিক্লেয়ার করা এবং লজিক এড করাঃ

প্রথমত একটা হ্যান্ডেলার ফাংশন ডিক্লেয়ার করতে হবে এবং এতে লজিক ইমপ্লিমেন্ট করতে হবে। ধরুন, একটা button এ ক্লিক করলে আমরা দেখাতে চাই যে "বাটনে ক্লিক করা হয়েছে" সেক্ষেত্রে আমাদের হ্যান্ডেলার ফাংশন ও লজিক হবে এমনঃ

Button.jsx
export default function Button(){
 
    function handleClick(){ // এখনে handleClick নামে একটা হ্যন্ডেলার ফাংশন ডিক্লেয়ার করা হয়েছে এবং তার ভিতরে লজিক ইমপ্লিমেন্ট করা হয়েছে।
        alert("বাটনে ক্লিক করা হয়েছে");
    }
 
}
 

হ্যান্ডেলার ফাংশনটি বাটনে এড করাঃ

এরপর হ্যান্ডেলার ফাংশনটি button এলিমেন্টে এড করতে হবেঃ

Button.jsx
export default function Button(){
 
    function handleClick(){
        alert("বাটনে ক্লিক করা হয়েছে");
    }
 
return <button onClick={handleClick}>Click Me</button> // এখনে বাটনের onClick এ হ্যান্ডেলার ফাংশনটি এড করা হয়েছে।
 
}

এছাড়াও আমরা JSX এর ইনলাইনেও Event Handler ফাংশন এড করতে পারি ।

যেমনঃ

Button.jsx
export default function Button(){
 
return <button onClick={ function handleClick(){
        alert("বাটনে ক্লিক করা হয়েছে");
    }}>Click Me</button> // এখনে বাটনের onClick এ হ্যান্ডেলার ফাংশনটি এড করা হয়েছে।
 
}

অথবা আরও ছোট করেও লিখতে পারি Arrow Function এর সিনট্যাক্সেঃ

Button.jsx
export default function Button() {
    return (
        <button
            onClick={() => {
                alert("বাটনে ক্লিক করা হয়েছে");
            }}>
            Click Me
        </button>
    ); // এখনে বাটনের onClick এ হ্যান্ডেলার ফাংশনটি এড করা হয়েছে।
}

এখানে একটি ফাংশন ডিফাইন করা হয়েছে handleClick নামে এবং তা button এলিমেন্টে as a props পাস করা হয়েছে । handleClick ফাংশনটি একটা event handler ফাংশন।

💡
  • 👉 ইভেন্ট হ্যান্ডেলার ফাংশনগুলো কম্পোনেন্ট এর ভিতরে ডিফাইন করতে হয় ।

  • 👉 কনভেনশন অনুযায়ী event handlerএর নামগুলোর শুরুতে handle এবং তারপর event name দিয়ে লিখতে হয়। যেমনঃhandleClick handleMouseEnter handleMouseLeave


📍

ইভেন্ট হ্যান্ডেলার ফাংশনগুলো কম্পোনেন্ট এর ভিতরে পাস করতে হবে, অবশ্যই শুধুমাত্র পাস করা লাগবে, কল করা যাবেনা যেমনঃ

✅ শুধুমাত্র পাস করা হয়েছে❌ সরাসরি কল করা হয়েছে
<button onClick={handleClick}</button><button onClick={handleClick()}</button>

এই দুইটা সিস্টেমের মাঝে খুব ভালো একটা পার্থক্য আছে।

  • শুধুমাত্র পাস করা <button onClick={handleClick}</button> মানে হলো - রিয়াক্ট কে বলা যে আমি তোমাকে একটা ইভেন্ট হ্যান্ডেলার দিয়ে দিলাম,তুমি এটা মনে রেখো যে যখনি ওই ইভেন্ট টা ঘটবে তখনই তুমি ফাংশন টা কল করে দিও। এক্ষেত্রে যেমন Click ইভেন্ট হ্যান্ডেলার ব্যাবহার করা হয়েছে,তার মানে হলো যখন Click হবে ঠিক তখনি ফাংশনটা কল হবে এবং আউটপুট দেখা যাবে ।

  • কিন্তু সরাসরি কল করে দেয়া <button onClick={handleClick()}</button> মানে হলোঃ কম্পোনেন্ট রেন্ডার হওয়ার সাথে সাথেই অটোমেটিক ফাংশন কল হয়ে যাবে , এতে ক্লিক হউয়ার জন্য ওয়েট করবেনা । এতে করে যদি কখনো কোন ফাংশনের দ্বারা State ম্যানেজ করা হয়ে থাকে, তখন বার বার State চেঞ্জ হতে থাকবে আর কম্পোনেন্ট রি-রেন্ডার হতে থাকবে। এটা এপ্লিকেশন একটা infinte লুপে পড়ে যাবে।

ইনলাইনে ফাংশন ডিফাইন করার ক্ষেত্রেও এই একই বিষয় টা খেয়াল রাখতে হয়। যদিও সেখানে শুদুমাত্র আমরা ফাংশনের ডেফিনেশন টাই লিখি ফাংশনটা কল করে দেইনা। তবে IIFE-(immediately invoked function expression) সাথে সাথেই কল হয়ে যায় বলে আমরা ইনলাইনে IIFE-(immediately invoked function expression) লিখতে পারবোনা।

Reading Props in Event Handler

ইভেন্ট হ্যান্ডেলারগুলো যেহেতু কম্পোনেন্টের ভিতরে লেখা হয় তাই কম্পোনেন্টের যেসব প্রপস আছে তা event handler functionগুলো সরাসরি এক্সেস করতে পারে ।

Pass Event Handler to Child Components as Props

কখনো কখনো আমাদের প্যারেন্ট কম্পোনেন্ট থেকে চাইল্ড কম্পোনেন্ট এর ইভেন্ট কে ম্যানেজ করা লাগে। সেই ক্ষেত্রে প্যারেন্ট কম্পোনেন্টে event handler function ডিফাইন করে তা প্রপস আকারে চাইল্ড কম্পোনেন্টে পাস করা যায়।

চলুন একটু বিস্তারিত বুঝিঃ

App.jsx
export default function App() {
    function handlePlay() {
        alert("Movie is playing");
    }
    return <MovieCard onPlay={handlePlay} />;
}
MovieCard.jsx
export default function MovieCard({ onPlay }) {
    return <button onClick={onPlay}>Play</button>;
}

এখানে App কম্পোনেন্ট একটি প্যারেন্ট কম্পোনেন্ট এবং এর চাইল্ড হিসেবে রয়েছে একটা MovieCard কম্পোনেন্ট। এবং মুভিকার্ড কম্পোনেন্ট এ একটা প্রপ্স পাস করা হয়েছে onPlay নামে। এই onPlay প্রপস এর মাধ্যমে মূলত handlePlay নামক একটা ইভেন্ট হ্যান্ডেলার পাস করা হয়েছে ।

চাইল্ড কম্পোনেন্ট MovieCard সেই প্রপস টাকে রিসিভ করেছে এবং বাটনের onClick এ তা ট্রিগার করা হয়েছে।

তার মানে হলো চাইল্ড কম্পোনেন্ট MovieCard এর বাটনে ক্লিক হলে কোন হ্যন্ডেলার ফাংশন কল হবে তা আমরা প্যারেন্ট কম্পোনেন্টেই ডিফাইন করতে পারি এবং তা প্রপস আকারে পাঠাতে পারি ।

Naming Conventions of event handler props

💡
  • 👉 ইভেন্ট হ্যান্ডেলার প্রপস এর নামের শুরুতে on দিয়ে শুরু করতে হয়।

  • 👉 যেসব রিসার্ভড কিওয়ার্ড আছে যেমনঃ onClick,onHover এসব শুধুমাত্র html এর নেটিভ ইলিমেন্টে ব্যাবহার করা উচিত।

  • 👉 onদিয়ে শুরু করে তারপর প্রসঙ্গত যেকোন নামেই ব্যাবহার করা যায়। যেমনঃ onClick এর পরিবর্তে onSmash ব্যাবহার করা যায় ।