রিয়াক্ট আমাদের ইভেন্ট হ্যন্ডেল করার সিস্টেম দিয়ে দিয়েছে। ইভেন্ট হ্যান্ডেলার হলো মূলত যখন কোন ইভেন্ট ট্রিগার হয়, যেমন ঃ ক্লিক,হভার,ফোকাস এসব।
Adding Event Handler to JSX
রিয়াক্টে আমরা দুটি স্টেপে Event Handler এড করতে পারিঃ
হ্যান্ডেলার ফাংশন ডিক্লেয়ার করা এবং লজিক এড করাঃ
প্রথমত একটা হ্যান্ডেলার ফাংশন ডিক্লেয়ার করতে হবে এবং এতে লজিক ইমপ্লিমেন্ট করতে হবে।
ধরুন, একটা button এ ক্লিক করলে আমরা দেখাতে চাই যে "বাটনে ক্লিক করা হয়েছে" সেক্ষেত্রে আমাদের হ্যান্ডেলার ফাংশন ও লজিক হবে এমনঃ
export default function Button(){
function handleClick(){ // এখনে handleClick নামে একটা হ্যন্ডেলার ফাংশন ডিক্লেয়ার করা হয়েছে এবং তার ভিতরে লজিক ইমপ্লিমেন্ট করা হয়েছে।
alert("বাটনে ক্লিক করা হয়েছে");
}
}
হ্যান্ডেলার ফাংশনটি বাটনে এড করাঃ
এরপর হ্যান্ডেলার ফাংশনটি button এলিমেন্টে এড করতে হবেঃ
export default function Button(){
function handleClick(){
alert("বাটনে ক্লিক করা হয়েছে");
}
return <button onClick={handleClick}>Click Me</button> // এখনে বাটনের onClick এ হ্যান্ডেলার ফাংশনটি এড করা হয়েছে।
}এছাড়াও আমরা JSX এর ইনলাইনেও Event Handler ফাংশন এড করতে পারি ।
যেমনঃ
export default function Button(){
return <button onClick={ function handleClick(){
alert("বাটনে ক্লিক করা হয়েছে");
}}>Click Me</button> // এখনে বাটনের onClick এ হ্যান্ডেলার ফাংশনটি এড করা হয়েছে।
}অথবা আরও ছোট করেও লিখতে পারি Arrow Function এর সিনট্যাক্সেঃ
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দিয়ে লিখতে হয়। যেমনঃhandleClickhandleMouseEnterhandleMouseLeave
ইভেন্ট হ্যান্ডেলার ফাংশনগুলো কম্পোনেন্ট এর ভিতরে পাস করতে হবে, অবশ্যই শুধুমাত্র পাস করা লাগবে, কল করা যাবেনা যেমনঃ
| ✅ শুধুমাত্র পাস করা হয়েছে | ❌ সরাসরি কল করা হয়েছে |
|---|---|
<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 ডিফাইন করে তা প্রপস আকারে চাইল্ড কম্পোনেন্টে পাস করা যায়।
চলুন একটু বিস্তারিত বুঝিঃ
export default function App() {
function handlePlay() {
alert("Movie is playing");
}
return <MovieCard onPlay={handlePlay} />;
}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ব্যাবহার করা যায় ।