React-এর experimental_useEffectEvent হুকটি জানুন: এর সুবিধা, ব্যবহার এবং এটি কিভাবে আপনার React অ্যাপ্লিকেশনগুলিতে useEffect ও স্টেল ক্লোজার সমস্যা সমাধান করে তা বুঝুন।
React experimental_useEffectEvent: স্টেবল ইভেন্ট হুকটির একটি গভীর বিশ্লেষণ
রিঅ্যাক্ট ক্রমাগত বিকশিত হচ্ছে, ডেভেলপারদেরকে ডাইনামিক এবং পারফরম্যান্ট ইউজার ইন্টারফেস তৈরি করার জন্য আরও শক্তিশালী এবং পরিমার্জিত টুলস সরবরাহ করছে। এরকম একটি টুল, যা বর্তমানে পরীক্ষামূলক পর্যায়ে রয়েছে, তা হলো experimental_useEffectEvent হুক। এই হুকটি useEffect ব্যবহারের সময় সম্মুখীন হওয়া একটি সাধারণ চ্যালেঞ্জ মোকাবেলা করে: স্টেল ক্লোজারের সাথে ডিল করা এবং ইভেন্ট হ্যান্ডলারদের সর্বশেষ স্টেটে অ্যাক্সেস নিশ্চিত করা।
useEffect-এর সাথে স্টেল ক্লোজারের সমস্যা বোঝা
experimental_useEffectEvent-এ যাওয়ার আগে, আসুন এটি যে সমস্যা সমাধান করে তা পুনরায় আলোচনা করি। useEffect হুক আপনাকে আপনার রিঅ্যাক্ট কম্পোনেন্টে সাইড এফেক্ট সম্পাদন করার সুযোগ দেয়। এই এফেক্টগুলির মধ্যে ডেটা ফেচ করা, সাবস্ক্রিপশন সেট আপ করা বা DOM ম্যানিপুলেট করা অন্তর্ভুক্ত থাকতে পারে। যাইহোক, useEffect যে স্কোপে সংজ্ঞায়িত হয় সেখান থেকে ভেরিয়েবলের মান ক্যাপচার করে। এটি স্টেল ক্লোজারের কারণ হতে পারে, যেখানে এফেক্ট ফাংশন স্টেট বা প্রপসের পুরনো মান ব্যবহার করে।
এই উদাহরণটি বিবেচনা করুন:
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setTimeout(() => {
alert(`Count is: ${count}`); // count-এর প্রাথমিক মান ক্যাপচার করে
}, 3000);
return () => clearTimeout(timer);
}, []); // খালি ডিপেন্ডেন্সি অ্যারে
return (
Count: {count}
);
}
export default MyComponent;
এই উদাহরণে, useEffect হুক একটি টাইমার সেট আপ করে যা ৩ সেকেন্ড পরে count-এর বর্তমান মান অ্যালার্ট করে। যেহেতু ডিপেন্ডেন্সি অ্যারে খালি ([]), এফেক্টটি শুধুমাত্র একবার রান করে, যখন কম্পোনেন্ট মাউন্ট হয়। setTimeout কলব্যাকের ভিতরের count ভেরিয়েবলটি count-এর প্রাথমিক মান, অর্থাৎ ০, ক্যাপচার করে। আপনি যদি count একাধিকবার বৃদ্ধি করেনও, অ্যালার্ট সবসময় "Count is: 0" দেখাবে। এর কারণ হলো ক্লোজারটি প্রাথমিক স্টেট ক্যাপচার করেছে।
একটি সাধারণ সমাধান হলো count ভেরিয়েবলটিকে ডিপেন্ডেন্সি অ্যারেতে অন্তর্ভুক্ত করা: [count]। এটি count পরিবর্তন হওয়ার সাথে সাথে এফেক্টটিকে পুনরায় রান করতে বাধ্য করে। যদিও এটি স্টেল ক্লোজার সমস্যার সমাধান করে, এটি এফেক্টের অপ্রয়োজনীয় পুনঃ실행ের কারণও হতে পারে, যা পারফরম্যান্সকে প্রভাবিত করতে পারে, বিশেষ করে যদি এফেক্টে ব্যয়বহুল অপারেশন জড়িত থাকে।
experimental_useEffectEvent-এর পরিচিতি
experimental_useEffectEvent হুক এই সমস্যার জন্য একটি আরও সুন্দর এবং পারফরম্যান্ট সমাধান প্রদান করে। এটি আপনাকে এমন ইভেন্ট হ্যান্ডলার সংজ্ঞায়িত করার সুযোগ দেয় যা সবসময় সর্বশেষ স্টেটে অ্যাক্সেস পায়, এফেক্টটিকে অপ্রয়োজনে পুনরায় রান না করিয়ে।
পূর্ববর্তী উদাহরণটি পুনর্লিখন করতে আপনি কীভাবে experimental_useEffectEvent ব্যবহার করবেন তা এখানে দেখানো হলো:
import React, { useState } from 'react';
import { unstable_useEffectEvent as useEffectEvent } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
const handleAlert = useEffectEvent(() => {
alert(`Count is: ${count}`); // সবসময় count-এর সর্বশেষ মান থাকে
});
useEffect(() => {
const timer = setTimeout(() => {
handleAlert();
}, 3000);
return () => clearTimeout(timer);
}, []); // খালি ডিপেন্ডেন্সি অ্যারে
return (
Count: {count}
);
}
export default MyComponent;
এই সংশোধিত উদাহরণে, আমরা handleAlert ফাংশনটি সংজ্ঞায়িত করতে experimental_useEffectEvent ব্যবহার করেছি। এই ফাংশনটি সবসময় count-এর সর্বশেষ মানে অ্যাক্সেস পায়। useEffect হুকটি এখনও শুধুমাত্র একবার রান করে কারণ এর ডিপেন্ডেন্সি অ্যারে খালি। যাইহোক, যখন টাইমার শেষ হয়, তখন handleAlert() কল করা হয়, যা count-এর সবচেয়ে সাম্প্রতিক মান ব্যবহার করে। এটি একটি বিশাল সুবিধা কারণ এটি ইভেন্ট হ্যান্ডলার লজিককে স্টেট পরিবর্তনের উপর ভিত্তি করে useEffect-এর পুনঃ실행 থেকে আলাদা করে।
experimental_useEffectEvent-এর মূল সুবিধা
- স্থিতিশীল ইভেন্ট হ্যান্ডলার:
experimental_useEffectEventদ্বারা রিটার্ন করা ইভেন্ট হ্যান্ডলার ফাংশনটি স্থিতিশীল, অর্থাৎ এটি প্রতিটি রেন্ডারে পরিবর্তন হয় না। এটি চাইল্ড কম্পোনেন্টগুলির অপ্রয়োজনীয় রি-রেন্ডার প্রতিরোধ করে যা হ্যান্ডলারটিকে প্রপ হিসাবে পায়। - সর্বশেষ স্টেটে অ্যাক্সেস: ইভেন্ট হ্যান্ডলারটি সর্বদা সর্বশেষ স্টেট এবং প্রপস-এ অ্যাক্সেস পায়, এমনকি যদি এফেক্টটি একটি খালি ডিপেন্ডেন্সি অ্যারে দিয়ে তৈরি করা হয়।
- উন্নত পারফরম্যান্স: এফেক্টের অপ্রয়োজনীয় পুনঃ실행 এড়িয়ে চলে, যার ফলে উন্নত পারফরম্যান্স পাওয়া যায়, বিশেষত জটিল বা ব্যয়বহুল অপারেশন সহ এফেক্টগুলির জন্য।
- পরিষ্কার কোড: সাইড এফেক্ট লজিক থেকে ইভেন্ট হ্যান্ডলিং লজিককে আলাদা করে আপনার কোডকে সহজ করে তোলে।
experimental_useEffectEvent-এর ব্যবহারের ক্ষেত্র
experimental_useEffectEvent বিশেষত সেইসব ক্ষেত্রে কার্যকর যেখানে আপনাকে useEffect-এর মধ্যে ঘটে যাওয়া ইভেন্টের উপর ভিত্তি করে কাজ করতে হবে এবং সর্বশেষ স্টেট বা প্রপস-এ অ্যাক্সেসের প্রয়োজন।
- টাইমার এবং ইন্টারভাল: পূর্ববর্তী উদাহরণে যেমন দেখানো হয়েছে, এটি টাইমার বা ইন্টারভাল জড়িত পরিস্থিতিগুলির জন্য আদর্শ যেখানে আপনাকে একটি নির্দিষ্ট বিলম্বের পরে বা নিয়মিত বিরতিতে কাজ করতে হবে।
- ইভেন্ট লিসেনার: একটি
useEffect-এর মধ্যে ইভেন্ট লিসেনার যোগ করার সময় এবং কলব্যাক ফাংশনের সর্বশেষ স্টেটে অ্যাক্সেসের প্রয়োজন হলে,experimental_useEffectEventস্টেল ক্লোজার প্রতিরোধ করতে পারে। মাউসের অবস্থান ট্র্যাক করা এবং একটি স্টেট ভেরিয়েবল আপডেট করার একটি উদাহরণ বিবেচনা করুন।experimental_useEffectEventছাড়া, mousemove লিসেনার প্রাথমিক স্টেট ক্যাপচার করতে পারে। - ডিবouncing সহ ডেটা ফেচিং: ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে ডেটা ফেচিংয়ের জন্য ডিবouncing প্রয়োগ করার সময়,
experimental_useEffectEventনিশ্চিত করে যে ডিবান্সড ফাংশনটি সর্বদা সর্বশেষ ইনপুট মান ব্যবহার করে। একটি সাধারণ পরিস্থিতি হলো সার্চ ইনপুট ফিল্ড যেখানে আমরা ব্যবহারকারীর টাইপিং বন্ধ করার কিছু সময় পরেই কেবল ফলাফল ফেচ করতে চাই। - অ্যানিমেশন এবং ট্রানজিশন: বর্তমান স্টেট বা প্রপসের উপর নির্ভরশীল অ্যানিমেশন বা ট্রানজিশনের জন্য,
experimental_useEffectEventসর্বশেষ মানগুলিতে অ্যাক্সেস করার একটি নির্ভরযোগ্য উপায় সরবরাহ করে।
useCallback-এর সাথে তুলনা
আপনি হয়তো ভাবছেন experimental_useEffectEvent এবং useCallback-এর মধ্যে পার্থক্য কী। যদিও উভয় হুকই ফাংশনকে মেমোইজ করতে ব্যবহার করা যেতে পারে, তারা ভিন্ন উদ্দেশ্যে কাজ করে।
- useCallback: প্রধানত চাইল্ড কম্পোনেন্টের অপ্রয়োজনীয় রি-রেন্ডার প্রতিরোধ করতে ফাংশন মেমোইজ করার জন্য ব্যবহৃত হয়। এটির জন্য ডিপেন্ডেন্সি নির্দিষ্ট করতে হয়। যদি সেই ডিপেন্ডেন্সিগুলি পরিবর্তিত হয়, মেমোইজড ফাংশনটি পুনরায় তৈরি করা হয়।
- experimental_useEffectEvent: একটি স্থিতিশীল ইভেন্ট হ্যান্ডলার সরবরাহ করার জন্য ডিজাইন করা হয়েছে যা এফেক্টকে পুনরায় রান না করিয়ে সর্বদা সর্বশেষ স্টেটে অ্যাক্সেস পায়। এটির জন্য ডিপেন্ডেন্সি অ্যারে প্রয়োজন হয় না এবং এটি বিশেষভাবে
useEffect-এর মধ্যে ব্যবহারের জন্য তৈরি।
সংক্ষেপে, useCallback পারফরম্যান্স অপটিমাইজেশনের জন্য মেমোইজেশন সম্পর্কিত, যেখানে experimental_useEffectEvent useEffect-এর ভিতরে ইভেন্ট হ্যান্ডলারের মধ্যে সর্বশেষ স্টেটে অ্যাক্সেস নিশ্চিত করা সম্পর্কিত।
উদাহরণ: একটি ডিবান্সড সার্চ ইনপুট তৈরি করা
আসুন একটি আরও বাস্তবসম্মত উদাহরণ দিয়ে experimental_useEffectEvent-এর ব্যবহার ব্যাখ্যা করি: একটি ডিবান্সড সার্চ ইনপুট ফিল্ড তৈরি করা। এটি একটি সাধারণ প্যাটার্ন যেখানে আপনি একটি ফাংশনের এক্সিকিউশন (যেমন, সার্চ ফলাফল ফেচ করা) বিলম্বিত করতে চান যতক্ষণ না ব্যবহারকারী একটি নির্দিষ্ট সময়ের জন্য টাইপিং বন্ধ করে।
import React, { useState, useEffect } from 'react';
import { unstable_useEffectEvent as useEffectEvent } from 'react';
function SearchInput() {
const [searchTerm, setSearchTerm] = useState('');
const handleSearch = useEffectEvent(async () => {
console.log(`Fetching results for: ${searchTerm}`);
// আপনার আসল ডেটা ফেচিং লজিক দিয়ে প্রতিস্থাপন করুন
// const results = await fetchResults(searchTerm);
// setResult(results);
});
useEffect(() => {
const timer = setTimeout(() => {
handleSearch();
}, 500); // ৫০০ms এর জন্য ডিবান্স করুন
return () => clearTimeout(timer);
}, [searchTerm]); // searchTerm পরিবর্তন হলে এফেক্ট পুনরায় চালান
const handleChange = (event) => {
setSearchTerm(event.target.value);
};
return (
);
}
export default SearchInput;
এই উদাহরণে:
searchTermস্টেট ভেরিয়েবলটি সার্চ ইনপুটের বর্তমান মান ধারণ করে।handleSearchফাংশন, যাexperimental_useEffectEventদিয়ে তৈরি করা হয়েছে, বর্তমানsearchTerm-এর উপর ভিত্তি করে সার্চ ফলাফল ফেচ করার জন্য দায়ী।useEffectহুকটি একটি টাইমার সেট আপ করে যাsearchTermপরিবর্তন হওয়ার সাথে সাথে ৫০০ms বিলম্বের পরেhandleSearchকল করে। এটি ডিবouncing লজিক প্রয়োগ করে।handleChangeফাংশনটি ব্যবহারকারী যখন ইনপুট ফিল্ডে টাইপ করে তখনsearchTermস্টেট ভেরিয়েবল আপডেট করে।
এই সেটআপটি নিশ্চিত করে যে handleSearch ফাংশনটি সর্বদা searchTerm-এর সর্বশেষ মান ব্যবহার করে, যদিও useEffect হুক প্রতিটি কীস্ট্রোকের উপর পুনরায় রান করে। ডেটা ফেচিং (বা আপনি যা ডিবান্স করতে চান) শুধুমাত্র ব্যবহারকারী ৫০০ms ধরে টাইপিং বন্ধ করার পরেই ট্রিগার হয়, যা অপ্রয়োজনীয় API কল প্রতিরোধ করে এবং পারফরম্যান্স উন্নত করে।
অ্যাডভান্সড ব্যবহার: অন্যান্য হুকের সাথে সমন্বয়
experimental_useEffectEvent আরও জটিল এবং পুনঃব্যবহারযোগ্য কম্পোনেন্ট তৈরি করতে অন্যান্য রিঅ্যাক্ট হুকের সাথে কার্যকরভাবে একত্রিত করা যেতে পারে। উদাহরণস্বরূপ, আপনি এটি জটিল স্টেট লজিক পরিচালনা করতে useReducer-এর সাথে ব্যবহার করতে পারেন, অথবা নির্দিষ্ট কার্যকারিতা এনক্যাপসুলেট করতে কাস্টম হুকের সাথে ব্যবহার করতে পারেন।
আসুন একটি পরিস্থিতি বিবেচনা করি যেখানে আপনার একটি কাস্টম হুক আছে যা ডেটা ফেচিং পরিচালনা করে:
import { useState, useEffect } from 'react';
function useData(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(url);
const json = await response.json();
setData(json);
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
}
export default useData;
এখন, ধরুন আপনি এই হুকটি একটি কম্পোনেন্টে ব্যবহার করতে চান এবং ডেটা সফলভাবে লোড হয়েছে কিনা বা কোনো ত্রুটি আছে কিনা তার উপর ভিত্তি করে একটি বার্তা প্রদর্শন করতে চান। আপনি বার্তা প্রদর্শনের জন্য experimental_useEffectEvent ব্যবহার করতে পারেন:
import React from 'react';
import useData from './useData';
import { unstable_useEffectEvent as useEffectEvent } from 'react';
function MyComponent({ url }) {
const { data, loading, error } = useData(url);
const handleDisplayMessage = useEffectEvent(() => {
if (error) {
alert(`Error fetching data: ${error.message}`);
} else if (data) {
alert('Data fetched successfully!');
}
});
useEffect(() => {
if (!loading && (data || error)) {
handleDisplayMessage();
}
}, [loading, data, error]);
return (
{loading ? Loading...
: null}
{data ? {JSON.stringify(data, null, 2)} : null}
{error ? Error: {error.message}
: null}
);
}
export default MyComponent;
এই উদাহরণে, handleDisplayMessage experimental_useEffectEvent ব্যবহার করে তৈরি করা হয়েছে। এটি ত্রুটি বা ডেটার জন্য পরীক্ষা করে এবং একটি উপযুক্ত বার্তা প্রদর্শন করে। useEffect হুকটি লোডিং সম্পূর্ণ হওয়ার পরে এবং ডেটা উপলব্ধ বা একটি ত্রুটি ঘটলে handleDisplayMessage ট্রিগার করে।
সতর্কতা এবং বিবেচ্য বিষয়
যদিও experimental_useEffectEvent উল্লেখযোগ্য সুবিধা প্রদান করে, এর সীমাবদ্ধতা এবং বিবেচ্য বিষয়গুলি সম্পর্কে সচেতন থাকা অপরিহার্য:
- পরীক্ষামূলক এপিআই: নাম থেকেই বোঝা যায়,
experimental_useEffectEventএখনও একটি পরীক্ষামূলক এপিআই। এর মানে হলো ভবিষ্যতে রিঅ্যাক্ট রিলিজে এর আচরণ বা বাস্তবায়ন পরিবর্তিত হতে পারে। রিঅ্যাক্টের ডকুমেন্টেশন এবং রিলিজ নোটগুলির সাথে আপডেটেড থাকা অত্যন্ত গুরুত্বপূর্ণ। - অপব্যবহারের সম্ভাবনা: যেকোনো শক্তিশালী টুলের মতো,
experimental_useEffectEvent-এরও অপব্যবহার হতে পারে। এর উদ্দেশ্য বোঝা এবং এটি যথাযথভাবে ব্যবহার করা গুরুত্বপূর্ণ। সব ক্ষেত্রেuseCallback-এর প্রতিস্থাপন হিসাবে এটি ব্যবহার করা থেকে বিরত থাকুন। - ডিবাগিং:
experimental_useEffectEventসম্পর্কিত সমস্যা ডিবাগ করা প্রথাগতuseEffectসেটআপের তুলনায় আরও চ্যালেঞ্জিং হতে পারে। যেকোনো সমস্যা চিহ্নিত এবং সমাধান করার জন্য ডিবাগিং টুল এবং কৌশল কার্যকরভাবে ব্যবহার করুন।
বিকল্প এবং ফলব্যাক
আপনি যদি একটি পরীক্ষামূলক এপিআই ব্যবহার করতে দ্বিধা বোধ করেন, অথবা যদি আপনি সামঞ্জস্যতার সমস্যার সম্মুখীন হন, তবে আপনি কিছু বিকল্প পদ্ধতি বিবেচনা করতে পারেন:
- useRef: আপনি সর্বশেষ স্টেট বা প্রপসের একটি পরিবর্তনযোগ্য রেফারেন্স ধরে রাখতে
useRefব্যবহার করতে পারেন। এটি আপনাকে এফেক্ট পুনরায় না চালিয়ে আপনার এফেক্টের মধ্যে বর্তমান মানগুলিতে অ্যাক্সেস করার অনুমতি দেয়। তবে, স্টেট আপডেটের জন্যuseRefব্যবহার করার সময় সতর্ক থাকুন, কারণ এটি রি-রেন্ডার ট্রিগার করে না। - ফাংশনাল আপডেট: পূর্ববর্তী স্টেটের উপর ভিত্তি করে স্টেট আপডেট করার সময়,
setState-এর ফাংশনাল আপডেট ফর্মটি ব্যবহার করুন। এটি নিশ্চিত করে যে আপনি সর্বদা সবচেয়ে সাম্প্রতিক স্টেট মানের সাথে কাজ করছেন। - রিডাক্স বা কনটেক্সট এপিআই: আরও জটিল স্টেট ম্যানেজমেন্ট পরিস্থিতির জন্য, রিডাক্স বা কনটেক্সট এপিআই-এর মতো একটি স্টেট ম্যানেজমেন্ট লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন। এই টুলগুলি আপনার অ্যাপ্লিকেশন জুড়ে স্টেট পরিচালনা এবং শেয়ার করার জন্য আরও কাঠামোবদ্ধ উপায় সরবরাহ করে।
experimental_useEffectEvent ব্যবহারের সেরা অনুশীলন
experimental_useEffectEvent-এর সুবিধাগুলি সর্বাধিক করতে এবং সম্ভাব্য সমস্যাগুলি এড়াতে, এই সেরা অনুশীলনগুলি অনুসরণ করুন:
- সমস্যাটি বুঝুন: নিশ্চিত করুন যে আপনি স্টেল ক্লোজার সমস্যাটি বোঝেন এবং কেন আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে
experimental_useEffectEventএকটি উপযুক্ত সমাধান। - অল্প পরিমাণে ব্যবহার করুন:
experimental_useEffectEvent-এর অতিরিক্ত ব্যবহার করবেন না। এটি কেবল তখনই ব্যবহার করুন যখন আপনারuseEffect-এর মধ্যে একটি স্থিতিশীল ইভেন্ট হ্যান্ডলারের প্রয়োজন হয় যা সর্বদা সর্বশেষ স্টেটে অ্যাক্সেস পায়। - সম্পূর্ণভাবে পরীক্ষা করুন:
experimental_useEffectEventপ্রত্যাশা অনুযায়ী কাজ করছে এবং আপনি কোনো অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া তৈরি করছেন না তা নিশ্চিত করতে আপনার কোডটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন। - আপডেটেড থাকুন:
experimental_useEffectEventএপিআই-এর সর্বশেষ আপডেট এবং পরিবর্তনগুলি সম্পর্কে অবগত থাকুন। - বিকল্প বিবেচনা করুন: যদি আপনি একটি পরীক্ষামূলক এপিআই ব্যবহার সম্পর্কে অনিশ্চিত হন, তবে
useRefবা ফাংশনাল আপডেটের মতো বিকল্প সমাধানগুলি অন্বেষণ করুন।
উপসংহার
experimental_useEffectEvent রিঅ্যাক্টের ক্রমবর্ধমান টুলকিটে একটি শক্তিশালী সংযোজন। এটি useEffect-এর মধ্যে ইভেন্ট হ্যান্ডলারগুলি পরিচালনা করার একটি পরিষ্কার এবং কার্যকর উপায় সরবরাহ করে, স্টেল ক্লোজার প্রতিরোধ করে এবং পারফরম্যান্স উন্নত করে। এর সুবিধা, ব্যবহারের ক্ষেত্র এবং সীমাবদ্ধতাগুলি বোঝার মাধ্যমে, আপনি আরও শক্তিশালী এবং রক্ষণাবেক্ষণযোগ্য রিঅ্যাক্ট অ্যাপ্লিকেশন তৈরি করতে experimental_useEffectEvent-কে কাজে লাগাতে পারেন।
যেকোনো পরীক্ষামূলক এপিআই-এর মতোই, সতর্কতার সাথে এগিয়ে যাওয়া এবং ভবিষ্যতের উন্নয়ন সম্পর্কে অবগত থাকা অপরিহার্য। যাইহোক, experimental_useEffectEvent জটিল স্টেট ম্যানেজমেন্ট পরিস্থিতি সহজ করার এবং রিঅ্যাক্টে সামগ্রিক ডেভেলপার অভিজ্ঞতা উন্নত করার জন্য দারুণ সম্ভাবনা রাখে।
এর ক্ষমতা সম্পর্কে গভীর ধারণা পেতে অফিসিয়াল রিঅ্যাক্ট ডকুমেন্টেশন পরামর্শ করা এবং হুকটি নিয়ে পরীক্ষা করতে ভুলবেন না। হ্যাপি কোডিং!