உங்கள் செயலிகளில் சிக்கலான பக்க விளைவுகளை நிர்வகிக்க, ரியாக்ட் கஸ்டம் ஹூக்குகள் மற்றும் எஃபெக்ட் கம்போசிஷனின் ஆற்றலைப் பயன்படுத்துங்கள். சுத்தமான, பராமரிக்க எளிதான குறியீட்டிற்கு விளைவுகளை எவ்வாறு ஒருங்கிணைப்பது என்பதை அறிக.
ரியாக்ட் கஸ்டம் ஹூக் எஃபெக்ட் கம்போசிஷன்: சிக்கலான விளைவு ஒருங்கிணைப்பில் தேர்ச்சி பெறுதல்
ரியாக்ட் கஸ்டம் ஹூக்குகள் நமது செயலிகளில் நிலை சார்ந்த தர்க்கத்தையும் (stateful logic) பக்க விளைவுகளையும் (side effects) நிர்வகிக்கும் முறையை புரட்சிகரமாக மாற்றியுள்ளன. useEffect
ஒரு சக்திவாய்ந்த கருவியாக இருந்தாலும், சிக்கலான காம்போனென்டுகள் பல, பின்னிப்பிணைந்த விளைவுகளால் விரைவில் கையாள முடியாததாகிவிடும். இங்குதான் எஃபெக்ட் கம்போசிஷன் (effect composition) வருகிறது – இது சிக்கலான விளைவுகளை சிறிய, மீண்டும் பயன்படுத்தக்கூடிய கஸ்டம் ஹூக்குகளாகப் பிரிக்க அனுமதிக்கும் ஒரு நுட்பமாகும், இதன் விளைவாக சுத்தமான, பராமரிக்க எளிதான குறியீடு கிடைக்கிறது.
எஃபெக்ட் கம்போசிஷன் என்றால் என்ன?
எஃபெக்ட் கம்போசிஷன் என்பது, பொதுவாக கஸ்டம் ஹூக்குகளில் இணைக்கப்பட்ட பல சிறிய விளைவுகளை ஒன்றிணைத்து, ஒரு பெரிய, சிக்கலான விளைவை உருவாக்கும் நடைமுறையாகும். எல்லா தர்க்கத்தையும் ஒரே useEffect
அழைப்பில் திணிப்பதற்குப் பதிலாக, தேவைக்கேற்ப ஒன்றாக இணைக்கக்கூடிய, மீண்டும் பயன்படுத்தக்கூடிய செயல்பாட்டு அலகுகளை நாம் உருவாக்குகிறோம். இந்த அணுகுமுறை குறியீட்டின் மறுபயன்பாட்டை ஊக்குவிக்கிறது, வாசிப்புத்திறனை மேம்படுத்துகிறது, மற்றும் சோதனையை எளிதாக்குகிறது.
எஃபெக்ட் கம்போசிஷனை ஏன் பயன்படுத்த வேண்டும்?
உங்கள் ரியாக்ட் ப்ராஜெக்டுகளில் எஃபெக்ட் கம்போசிஷனைப் பயன்படுத்த பல வலுவான காரணங்கள் உள்ளன:
- மேம்படுத்தப்பட்ட குறியீடு மறுபயன்பாடு: கஸ்டம் ஹூக்குகளை பல காம்போனென்டுகளில் மீண்டும் பயன்படுத்தலாம், இது குறியீடு நகலெடுப்பைக் குறைத்து பராமரிப்பை மேம்படுத்துகிறது.
- மேம்பட்ட வாசிப்புத்திறன்: சிக்கலான விளைவுகளை சிறிய, கவனம் செலுத்திய அலகுகளாகப் பிரிப்பது குறியீட்டைப் புரிந்துகொள்வதையும் பகுத்தாய்வதையும் எளிதாக்குகிறது.
- எளிதாக்கப்பட்ட சோதனை: சிறிய, தனிமைப்படுத்தப்பட்ட விளைவுகளை சோதிப்பதும் பிழைதிருத்தம் செய்வதும் எளிது.
- அதிகரித்த மாடுலாரிட்டி: எஃபெக்ட் கம்போசிஷன் ஒரு மாடுலர் கட்டமைப்பை ஊக்குவிக்கிறது, இது செயலியின் பிற பகுதிகளைப் பாதிக்காமல் செயல்பாடுகளைச் சேர்ப்பது, நீக்குவது அல்லது மாற்றுவதை எளிதாக்குகிறது.
- குறைக்கப்பட்ட சிக்கல்தன்மை: ஒரே
useEffect
இல் அதிக எண்ணிக்கையிலான பக்க விளைவுகளை நிர்வகிப்பது சிக்கலான குறியீட்டிற்கு வழிவகுக்கும். எஃபெக்ட் கம்போசிஷன் சிக்கலை நிர்வகிக்கக்கூடிய பகுதிகளாக உடைக்க உதவுகிறது.
அடிப்படை உதாரணம்: தரவுப் பெறுதல் மற்றும் லோக்கல் ஸ்டோரேஜ் நிலைத்தன்மையை இணைத்தல்
ஒரு ஏபிஐ-யிலிருந்து பயனர் தரவைப் பெற்று அதை லோக்கல் ஸ்டோரேஜில் சேமிக்க வேண்டிய ஒரு சூழ்நிலையை கருத்தில் கொள்வோம். எஃபெக்ட் கம்போசிஷன் இல்லாமல், இந்த இரண்டு பணிகளையும் கையாளும் ஒரே useEffect
உடன் நாம் முடிவடையலாம். எஃபெக்ட் கம்போசிஷன் மூலம் அதே முடிவை எவ்வாறு அடைவது என்பது இங்கே:
1. useFetchData
ஹூக்கை உருவாக்குதல்
இந்த ஹூக் ஒரு ஏபிஐ-யிலிருந்து தரவைப் பெறுவதற்குப் பொறுப்பாகும்.
import { useState, useEffect } from 'react';
function useFetchData(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);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const json = await response.json();
setData(json);
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
}
export default useFetchData;
2. useLocalStorage
ஹூக்கை உருவாக்குதல்
இந்த ஹூக் லோக்கல் ஸ்டோரேஜில் தரவை நிலைநிறுத்துவதைக் கையாளுகிறது.
import { useState, useEffect } from 'react';
function useLocalStorage(key, initialValue) {
const [storedValue, setStoredValue] = useState(() => {
try {
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
} catch (error) {
console.error(error);
return initialValue;
}
});
useEffect(() => {
try {
window.localStorage.setItem(key, JSON.stringify(storedValue));
} catch (error) {
console.error(error);
}
}, [key, storedValue]);
return [storedValue, setStoredValue];
}
export default useLocalStorage;
3. ஒரு காம்போனென்டில் ஹூக்குகளை இணைத்தல்
இப்போது நாம் இந்த ஹூக்குகளை ஒரு காம்போனென்டில் இணைத்து பயனர் தரவைப் பெற்று லோக்கல் ஸ்டோரேஜில் சேமிக்கலாம்.
import React from 'react';
import useFetchData from './useFetchData';
import useLocalStorage from './useLocalStorage';
function UserProfile() {
const { data: userData, loading, error } = useFetchData('https://api.example.com/user/profile');
const [storedUserData, setStoredUserData] = useLocalStorage('userProfile', null);
useEffect(() => {
if (userData) {
setStoredUserData(userData);
}
}, [userData, setStoredUserData]);
if (loading) {
return Loading user profile...
;
}
if (error) {
return Error fetching user profile: {error.message}
;
}
if (!userData && !storedUserData) {
return No user data available.
;
}
const userToDisplay = storedUserData || userData;
return (
User Profile
Name: {userToDisplay.name}
Email: {userToDisplay.email}
);
}
export default UserProfile;
இந்த எடுத்துக்காட்டில், தரவுப் பெறும் தர்க்கத்தையும் லோக்கல் ஸ்டோரேஜ் நிலைத்தன்மை தர்க்கத்தையும் இரண்டு தனித்தனி கஸ்டம் ஹூக்குகளாகப் பிரித்துள்ளோம். UserProfile
காம்போனென்ட் பின்னர் இந்த ஹூக்குகளை இணைத்து விரும்பிய செயல்பாட்டை அடைகிறது. இந்த அணுகுமுறை குறியீட்டை மேலும் மாடுலர், மீண்டும் பயன்படுத்தக்கூடிய மற்றும் சோதிக்க எளிதானதாக ஆக்குகிறது.
மேம்பட்ட எடுத்துக்காட்டுகள்: சிக்கலான விளைவுகளை ஒருங்கிணைத்தல்
மேலும் சிக்கலான சூழ்நிலைகளைக் கையாளும் போது எஃபெக்ட் கம்போசிஷன் இன்னும் சக்திவாய்ந்ததாகிறது. சில மேம்பட்ட எடுத்துக்காட்டுகளை ஆராய்வோம்.
1. சந்தாக்கள் மற்றும் நிகழ்வு கேட்பான்களை நிர்வகித்தல்
ஒரு WebSocket-க்கு நீங்கள் குழுசேர்ந்து குறிப்பிட்ட நிகழ்வுகளைக் கேட்க வேண்டிய ஒரு சூழ்நிலையைக் கவனியுங்கள். காம்போனென்ட் அன்மவுன்ட் ஆகும் போது சுத்திகரிப்பையும் நீங்கள் கையாள வேண்டும். இதை நிர்வகிக்க எஃபெக்ட் கம்போசிஷனை எவ்வாறு பயன்படுத்தலாம் என்பது இங்கே:
a. useWebSocket
ஹூக்கை உருவாக்குதல்
இந்த ஹூக் ஒரு WebSocket இணைப்பை நிறுவி, மீண்டும் இணைக்கும் தர்க்கத்தைக் கையாளுகிறது.
import { useState, useEffect, useRef } from 'react';
function useWebSocket(url) {
const [socket, setSocket] = useState(null);
const [isConnected, setIsConnected] = useState(false);
const retryCount = useRef(0);
useEffect(() => {
const connect = () => {
const newSocket = new WebSocket(url);
newSocket.onopen = () => {
console.log('WebSocket connected');
setIsConnected(true);
retryCount.current = 0;
};
newSocket.onclose = () => {
console.log('WebSocket disconnected');
setIsConnected(false);
// Exponential backoff for reconnection
const timeout = Math.min(3000 * Math.pow(2, retryCount.current), 60000);
retryCount.current++;
console.log(`Reconnecting in ${timeout/1000} seconds...`);
setTimeout(connect, timeout);
};
newSocket.onerror = (error) => {
console.error('WebSocket error:', error);
};
setSocket(newSocket);
};
connect();
return () => {
if (socket) {
socket.close();
}
};
}, [url]);
return { socket, isConnected };
}
export default useWebSocket;
b. useEventListener
ஹூக்கை உருவாக்குதல்
இந்த ஹூக் WebSocket இல் குறிப்பிட்ட நிகழ்வுகளை எளிதாகக் கேட்க உங்களை அனுமதிக்கிறது.
import { useEffect } from 'react';
function useEventListener(socket, eventName, handler) {
useEffect(() => {
if (!socket) return;
const listener = (event) => handler(event);
socket.addEventListener(eventName, listener);
return () => {
socket.removeEventListener(eventName, listener);
};
}, [socket, eventName, handler]);
}
export default useEventListener;
c. ஒரு காம்போனென்டில் ஹூக்குகளை இணைத்தல்
import React, { useState } from 'react';
import useWebSocket from './useWebSocket';
import useEventListener from './useEventListener';
function WebSocketComponent() {
const { socket, isConnected } = useWebSocket('wss://echo.websocket.events');
const [message, setMessage] = useState('');
const [receivedMessages, setReceivedMessages] = useState([]);
useEventListener(socket, 'message', (event) => {
setReceivedMessages((prevMessages) => [...prevMessages, event.data]);
});
const sendMessage = () => {
if (socket && isConnected) {
socket.send(message);
setMessage('');
}
};
return (
WebSocket Example
Connection Status: {isConnected ? 'Connected' : 'Disconnected'}
setMessage(e.target.value)}
placeholder="Enter message"
/>
Received Messages:
{receivedMessages.map((msg, index) => (
- {msg}
))}
);
}
export default WebSocketComponent;
இந்த எடுத்துக்காட்டில், useWebSocket
WebSocket இணைப்பை, மறு இணைப்பு தர்க்கம் உட்பட, நிர்வகிக்கிறது, அதே நேரத்தில் useEventListener
குறிப்பிட்ட நிகழ்வுகளுக்கு குழுசேர ஒரு சுத்தமான வழியை வழங்குகிறது. WebSocketComponent
இந்த ஹூக்குகளை இணைத்து ஒரு முழுமையான WebSocket கிளையண்டை உருவாக்குகிறது.
2. சார்புகளுடன் கூடிய ஒத்திசைவற்ற செயல்பாடுகளை ஒருங்கிணைத்தல்
சில நேரங்களில், விளைவுகள் ஒரு குறிப்பிட்ட வரிசையில் அல்லது சில சார்புகளின் அடிப்படையில் தூண்டப்பட வேண்டும். நீங்கள் பயனர் தரவைப் பெற வேண்டும், பின்னர் பயனர் ஐடியின் அடிப்படையில் அவர்களின் இடுகைகளைப் பெற வேண்டும், பின்னர் UI ஐப் புதுப்பிக்க வேண்டும் என்று வைத்துக்கொள்வோம். இந்த ஒத்திசைவற்ற செயல்பாடுகளை ஒருங்கிணைக்க எஃபெக்ட் கம்போசிஷனைப் பயன்படுத்தலாம்.
a. useUserData
ஹூக்கை உருவாக்குதல்
இந்த ஹூக் பயனர் தரவைப் பெறுகிறது.
import { useState, useEffect } from 'react';
function useUserData(userId) {
const [userData, setUserData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const json = await response.json();
setUserData(json);
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
};
fetchData();
}, [userId]);
return { userData, loading, error };
}
export default useUserData;
b. useUserPosts
ஹூக்கை உருவாக்குதல்
இந்த ஹூக் பயனர் ஐடியின் அடிப்படையில் பயனர் இடுகைகளைப் பெறுகிறது.
import { useState, useEffect } from 'react';
function useUserPosts(userId) {
const [userPosts, setUserPosts] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
if (!userId) {
setUserPosts(null);
setLoading(false);
return;
}
const fetchPosts = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}/posts`);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const json = await response.json();
setUserPosts(json);
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
};
fetchPosts();
}, [userId]);
return { userPosts, loading, error };
}
export default useUserPosts;
c. ஒரு காம்போனென்டில் ஹூக்குகளை இணைத்தல்
import React, { useState } from 'react';
import useUserData from './useUserData';
import useUserPosts from './useUserPosts';
function UserProfileWithPosts() {
const [userId, setUserId] = useState(1); // Start with a default user ID
const { userData, loading: userLoading, error: userError } = useUserData(userId);
const { userPosts, loading: postsLoading, error: postsError } = useUserPosts(userId);
return (
User Profile with Posts
setUserId(parseInt(e.target.value, 10))}
/>
{userLoading ? Loading user data...
: null}
{userError ? Error loading user data: {userError.message}
: null}
{userData ? (
User Details
Name: {userData.name}
Email: {userData.email}
) : null}
{postsLoading ? Loading user posts...
: null}
{postsError ? Error loading user posts: {postsError.message}
: null}
{userPosts ? (
User Posts
{userPosts.map((post) => (
- {post.title}
))}
) : null}
);
}
export default UserProfileWithPosts;
இந்த எடுத்துக்காட்டில், useUserPosts
ஆனது userId
ஐச் சார்ந்துள்ளது. ஒரு சரியான userId
கிடைக்கும்போது மட்டுமே ஹூக் இடுகைகளைப் பெறுகிறது. இது விளைவுகள் சரியான வரிசையில் தூண்டப்படுவதையும், UI அதற்கேற்ப புதுப்பிக்கப்படுவதையும் உறுதி செய்கிறது.
எஃபெக்ட் கம்போசிஷனுக்கான சிறந்த நடைமுறைகள்
எஃபெக்ட் கம்போசிஷனை முழுமையாகப் பயன்படுத்த, பின்வரும் சிறந்த நடைமுறைகளைக் கவனியுங்கள்:
- ஒற்றைப் பொறுப்புக் கொள்கை: ஒவ்வொரு கஸ்டம் ஹூக்கிற்கும் ஒரு ஒற்றை, நன்கு வரையறுக்கப்பட்ட பொறுப்பு இருக்க வேண்டும்.
- விளக்கமான பெயர்கள்: உங்கள் கஸ்டம் ஹூக்குகளின் நோக்கத்தைத் தெளிவாகக் குறிக்க விளக்கமான பெயர்களைப் பயன்படுத்தவும்.
- சார்பு வரிசைகள்: தேவையற்ற மறு-ரெண்டர்கள் அல்லது முடிவற்ற சுழற்சிகளைத் தவிர்க்க, உங்கள்
useEffect
அழைப்புகளில் சார்பு வரிசைகளை கவனமாக நிர்வகிக்கவும். - சோதனை: உங்கள் கஸ்டம் ஹூக்குகள் எதிர்பார்த்தபடி செயல்படுவதை உறுதிசெய்ய யூனிட் சோதனைகளை எழுதுங்கள்.
- ஆவணப்படுத்தல்: உங்கள் கஸ்டம் ஹூக்குகளை எளிதாகப் புரிந்துகொள்ளவும் மீண்டும் பயன்படுத்தவும் ஆவணப்படுத்துங்கள்.
- அதிகப்படியான சுருக்கத்தைத் தவிர்க்கவும்: உங்கள் கஸ்டம் ஹூக்குகளை அதிகமாக வடிவமைக்க வேண்டாம். அவற்றை எளிமையாகவும் கவனம் செலுத்தியதாகவும் வைத்திருங்கள்.
- பிழை கையாளுதலைக் கருத்தில் கொள்ளுங்கள்: எதிர்பாராத சூழ்நிலைகளை நேர்த்தியாகக் கையாள உங்கள் கஸ்டம் ஹூக்குகளில் வலுவான பிழை கையாளுதலைச் செயல்படுத்தவும்.
உலகளாவிய பரிசீலனைகள்
உலகளாவிய பார்வையாளர்களுக்காக ரியாக்ட் செயலிகளை உருவாக்கும் போது, பின்வரும் பரிசீலனைகளை மனதில் கொள்ளுங்கள்:
- சர்வதேசமயமாக்கல் (i18n): பல மொழிகளை ஆதரிக்க
react-intl
அல்லதுi18next
போன்ற நூலகத்தைப் பயன்படுத்தவும். - உள்ளூர்மயமாக்கல் (l10n): தேதி மற்றும் எண் வடிவங்கள் போன்ற பல்வேறு பிராந்திய விருப்பங்களுக்கு உங்கள் செயலியை மாற்றியமைக்கவும்.
- அணுகல்தன்மை (a11y): WCAG வழிகாட்டுதல்களைப் பின்பற்றுவதன் மூலம் உங்கள் செயலி மாற்றுத்திறனாளிகளுக்கு அணுகக்கூடியதாக இருப்பதை உறுதி செய்யவும்.
- செயல்திறன்: வெவ்வேறு நெட்வொர்க் நிலைமைகள் மற்றும் சாதனத் திறன்களுக்கு உங்கள் செயலியை மேம்படுத்துங்கள். குறியீடு பிரித்தல் மற்றும் சோம்பேறி ஏற்றுதல் போன்ற நுட்பங்களைப் பயன்படுத்துவதைக் கருத்தில் கொள்ளுங்கள்.
- உள்ளடக்க விநியோக நெட்வொர்க்குகள் (CDNs): உங்கள் செயலியின் சொத்துக்களை உங்கள் பயனர்களுக்கு அருகிலுள்ள சேவையகங்களிலிருந்து வழங்க ஒரு CDN ஐப் பயன்படுத்தவும், இது தாமதத்தைக் குறைத்து செயல்திறனை மேம்படுத்துகிறது.
- நேர மண்டலங்கள்: தேதிகள் மற்றும் நேரங்களைக் கையாளும் போது, வெவ்வேறு நேர மண்டலங்களைக் கவனத்தில் கொண்டு,
moment-timezone
அல்லதுdate-fns-timezone
போன்ற பொருத்தமான நூலகங்களைப் பயன்படுத்தவும்.
எடுத்துக்காட்டு: சர்வதேசமயமாக்கப்பட்ட தேதி வடிவமைப்பு
import { useIntl, FormattedDate } from 'react-intl';
function MyComponent() {
const intl = useIntl();
const now = new Date();
return (
Current Date:
Current Date (German):
);
}
export default MyComponent;
முடிவுரை
எஃபெக்ட் கம்போசிஷன் என்பது ரியாக்ட் செயலிகளில் சிக்கலான பக்க விளைவுகளை நிர்வகிப்பதற்கான ஒரு சக்திவாய்ந்த நுட்பமாகும். பெரிய விளைவுகளை சிறிய, மீண்டும் பயன்படுத்தக்கூடிய கஸ்டம் ஹூக்குகளாகப் பிரிப்பதன் மூலம், நீங்கள் குறியீடு மறுபயன்பாட்டை மேம்படுத்தலாம், வாசிப்புத்திறனை அதிகரிக்கலாம், சோதனையை எளிதாக்கலாம் மற்றும் ஒட்டுமொத்த சிக்கலைக் குறைக்கலாம். உலகளாவிய பார்வையாளர்களுக்காக சுத்தமான, பராமரிக்க எளிதான மற்றும் அளவிடக்கூடிய ரியாக்ட் செயலிகளை உருவாக்க எஃபெக்ட் கம்போசிஷனைப் பயன்படுத்தவும்.