તમારી એપ્લિકેશન્સમાં જટિલ સાઇડ ઇફેક્ટ્સનું સંચાલન કરવા માટે રિએક્ટ કસ્ટમ હુક્સ અને ઇફેક્ટ કમ્પોઝિશનની શક્તિનો ઉપયોગ કરો. સ્વચ્છ અને વધુ જાળવણી યોગ્ય કોડ માટે ઇફેક્ટ્સને કેવી રીતે ઓર્કેસ્ટ્રેટ કરવી તે શીખો.
રિએક્ટ કસ્ટમ હૂક ઇફેક્ટ કમ્પોઝિશન: જટિલ ઇફેક્ટ ઓર્કેસ્ટ્રેશનમાં નિપુણતા
રિએક્ટ કસ્ટમ હુક્સે આપણી એપ્લિકેશન્સમાં સ્ટેટફુલ લોજિક અને સાઇડ ઇફેક્ટ્સનું સંચાલન કરવાની રીતમાં ક્રાંતિ લાવી છે. જ્યારે useEffect
એક શક્તિશાળી સાધન છે, ત્યારે જટિલ કમ્પોનન્ટ્સ બહુવિધ, ગૂંથાયેલી ઇફેક્ટ્સ સાથે ઝડપથી અવ્યવસ્થિત બની શકે છે. અહીં જ ઇફેક્ટ કમ્પોઝિશન કામ આવે છે – એક એવી ટેકનિક જે આપણને જટિલ ઇફેક્ટ્સને નાના, પુનઃઉપયોગી કસ્ટમ હુક્સમાં વિભાજિત કરવાની મંજૂરી આપે છે, જેના પરિણામે સ્વચ્છ અને વધુ જાળવણી યોગ્ય કોડ મળે છે.
ઇફેક્ટ કમ્પોઝિશન શું છે?
ઇફેક્ટ કમ્પોઝિશન એ બહુવિધ નાની ઇફેક્ટ્સને, જે સામાન્ય રીતે કસ્ટમ હુક્સમાં સમાવિષ્ટ હોય છે, જોડીને એક મોટી, વધુ જટિલ ઇફેક્ટ બનાવવાની પ્રથા છે. બધી લોજિકને એક જ useEffect
કોલમાં ભરવાને બદલે, આપણે કાર્યક્ષમતાના પુનઃઉપયોગી એકમો બનાવીએ છીએ જેને જરૂર મુજબ એકસાથે કમ્પોઝ કરી શકાય છે. આ અભિગમ કોડ પુનઃઉપયોગીતાને પ્રોત્સાહન આપે છે, વાંચનક્ષમતા સુધારે છે અને ટેસ્ટિંગને સરળ બનાવે છે.
ઇફેક્ટ કમ્પોઝિશનનો ઉપયોગ શા માટે કરવો?
તમારા રિએક્ટ પ્રોજેક્ટ્સમાં ઇફેક્ટ કમ્પોઝિશન અપનાવવાના ઘણા આકર્ષક કારણો છે:
- સુધારેલી કોડ પુનઃઉપયોગીતા: કસ્ટમ હુક્સનો બહુવિધ કમ્પોનન્ટ્સમાં પુનઃઉપયોગ કરી શકાય છે, જેનાથી કોડ ડુપ્લિકેશન ઘટે છે અને જાળવણીક્ષમતા સુધરે છે.
- વધારેલી વાંચનક્ષમતા: જટિલ ઇફેક્ટ્સને નાના, કેન્દ્રિત એકમોમાં વિભાજીત કરવાથી કોડને સમજવો અને તેના વિશે તર્ક કરવો સરળ બને છે.
- સરળ ટેસ્ટિંગ: નાની, અલગ કરેલી ઇફેક્ટ્સનું ટેસ્ટિંગ અને ડિબગિંગ કરવું સરળ છે.
- વધારેલી મોડ્યુલારિટી: ઇફેક્ટ કમ્પોઝિશન મોડ્યુલર આર્કિટેક્ચરને પ્રોત્સાહન આપે છે, જેનાથી એપ્લિકેશનના અન્ય ભાગોને અસર કર્યા વિના કાર્યક્ષમતા ઉમેરવી, દૂર કરવી અથવા સુધારવી સરળ બને છે.
- ઓછી જટિલતા: એક જ
useEffect
માં મોટી સંખ્યામાં સાઇડ ઇફેક્ટ્સનું સંચાલન કરવાથી સ્પેગેટી કોડ થઈ શકે છે. ઇફેક્ટ કમ્પોઝિશન જટિલતાને વ્યવસ્થાપિત ટુકડાઓમાં વિભાજીત કરવામાં મદદ કરે છે.
મૂળભૂત ઉદાહરણ: ડેટા ફેચિંગ અને લોકલ સ્ટોરેજ પર્સિસ્ટન્સનું સંયોજન
ચાલો એક દૃશ્યનો વિચાર કરીએ જ્યાં આપણે API માંથી વપરાશકર્તા ડેટા મેળવવાની અને તેને લોકલ સ્ટોરેજમાં સાચવવાની જરૂર છે. ઇફેક્ટ કમ્પોઝિશન વિના, આપણે કદાચ એક જ useEffect
સાથે સમાપ્ત થઈશું જે બંને કાર્યોને સંભાળે છે. અહીં આપણે ઇફેક્ટ કમ્પોઝિશન સાથે સમાન પરિણામ કેવી રીતે પ્રાપ્ત કરી શકીએ છીએ તે છે:
1. useFetchData
હૂક બનાવવું
આ હૂક API માંથી ડેટા મેળવવા માટે જવાબદાર છે.
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. સબસ્ક્રિપ્શન્સ અને ઇવેન્ટ લિસનર્સનું સંચાલન
એક દૃશ્યનો વિચાર કરો જ્યાં તમારે વેબસોકેટ પર સબ્સ્ક્રાઇબ કરવાની અને ચોક્કસ ઇવેન્ટ્સ માટે સાંભળવાની જરૂર છે. તમારે કમ્પોનન્ટ અનમાઉન્ટ થાય ત્યારે ક્લીનઅપ પણ હેન્ડલ કરવાની જરૂર છે. આનું સંચાલન કરવા માટે તમે ઇફેક્ટ કમ્પોઝિશનનો ઉપયોગ કેવી રીતે કરી શકો છો તે અહીં છે:
a. useWebSocket
હૂક બનાવવું
આ હૂક વેબસોકેટ કનેક્શન સ્થાપિત કરે છે અને પુનઃજોડાણ લોજિકને સંભાળે છે.
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
હૂક બનાવવું
આ હૂક તમને વેબસોકેટ પર ચોક્કસ ઇવેન્ટ્સ માટે સરળતાથી સાંભળવાની મંજૂરી આપે છે.
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
વેબસોકેટ કનેક્શનનું સંચાલન કરે છે, જેમાં પુનઃજોડાણ લોજિકનો સમાવેશ થાય છે, જ્યારે useEventListener
ચોક્કસ ઇવેન્ટ્સ પર સબ્સ્ક્રાઇબ કરવાની સ્વચ્છ રીત પ્રદાન કરે છે. WebSocketComponent
સંપૂર્ણપણે કાર્યાત્મક વેબસોકેટ ક્લાયંટ બનાવવા માટે આ હુક્સને કમ્પોઝ કરે છે.
2. નિર્ભરતાઓ સાથે એસિંક્રોનસ ઓપરેશન્સનું ઓર્કેસ્ટ્રેશન
ક્યારેક, ઇફેક્ટ્સને ચોક્કસ ક્રમમાં અથવા અમુક નિર્ભરતાઓના આધારે ટ્રિગર કરવાની જરૂર પડે છે. ધારો કે તમારે વપરાશકર્તા ડેટા મેળવવાની જરૂર છે, પછી વપરાશકર્તા ID ના આધારે તેમની પોસ્ટ્સ મેળવવી, અને પછી 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
હૂક બનાવવું
આ હૂક વપરાશકર્તા ID ના આધારે વપરાશકર્તા પોસ્ટ્સ મેળવે છે.
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;
નિષ્કર્ષ
ઇફેક્ટ કમ્પોઝિશન એ રિએક્ટ એપ્લિકેશન્સમાં જટિલ સાઇડ ઇફેક્ટ્સનું સંચાલન કરવા માટે એક શક્તિશાળી તકનીક છે. મોટી ઇફેક્ટ્સને નાના, પુનઃઉપયોગી કસ્ટમ હુક્સમાં વિભાજીત કરીને, તમે કોડ પુનઃઉપયોગીતા સુધારી શકો છો, વાંચનક્ષમતા વધારી શકો છો, ટેસ્ટિંગને સરળ બનાવી શકો છો અને એકંદરે જટિલતા ઘટાડી શકો છો. વૈશ્વિક પ્રેક્ષકો માટે સ્વચ્છ, વધુ જાળવણી યોગ્ય અને માપનીય રિએક્ટ એપ્લિકેશન્સ બનાવવા માટે ઇફેક્ટ કમ્પોઝિશનને અપનાવો.