ரியாக்ட்டின் useReducer ஹூக்கில் ஆழமாகப் பயணித்து, சிக்கலான பயன்பாட்டு நிலைகளைத் திறம்பட நிர்வகித்து, உலகளாவிய ரியாக்ட் திட்டங்களின் செயல்திறன் மற்றும் பராமரிப்பை மேம்படுத்துங்கள்.
ரியாக்ட் useReducer பேட்டர்ன்: சிக்கலான ஸ்டேட் நிர்வாகத்தில் தேர்ச்சி பெறுதல்
தொடர்ந்து மாறிவரும் ஃபிரன்ட்-எண்ட் மேம்பாட்டு உலகில், பயனர் இடைமுகங்களை உருவாக்குவதில் ரியாக்ட் ஒரு முன்னணி கட்டமைப்பாக தன்னை நிலைநிறுத்தியுள்ளது. பயன்பாடுகள் சிக்கலானதாக வளரும்போது, நிலையை (state) நிர்வகிப்பது பெருகிய முறையில் சவாலாகிறது. useState
ஹூக் ஒரு காம்போனென்டிற்குள் நிலையை நிர்வகிக்க ஒரு எளிய வழியை வழங்குகிறது, ஆனால் மிகவும் சிக்கலான சூழ்நிலைகளுக்கு, ரியாக்ட் ஒரு சக்திவாய்ந்த மாற்றீட்டை வழங்குகிறது: useReducer
ஹூக். இந்த வலைப்பதிவு இடுகை useReducer
பேட்டர்னை ஆழமாக ஆராய்கிறது, அதன் நன்மைகள், நடைமுறைச் செயல்பாடுகள் மற்றும் அது உலகளவில் உங்கள் ரியாக்ட் பயன்பாடுகளை எவ்வாறு கணிசமாக மேம்படுத்தும் என்பதை விளக்குகிறது.
சிக்கலான ஸ்டேட் நிர்வாகத்தின் தேவையைப் புரிந்துகொள்ளுதல்
ரியாக்ட் பயன்பாடுகளை உருவாக்கும்போது, ஒரு காம்போனென்டின் நிலை வெறும் ஒரு எளிய மதிப்பாக இல்லாமல், ஒன்றுக்கொன்று இணைக்கப்பட்ட தரவுகளின் தொகுப்பாகவோ அல்லது முந்தைய நிலையின் மதிப்புகளைச் சார்ந்த நிலையாகவோ இருக்கும் சூழ்நிலைகளை நாம் அடிக்கடி சந்திக்கிறோம். இந்த எடுத்துக்காட்டுகளைக் கவனியுங்கள்:
- பயனர் அங்கீகாரம்: உள்நுழைவு நிலை, பயனர் விவரங்கள் மற்றும் அங்கீகார டோக்கன்களை நிர்வகித்தல்.
- படிவ கையாளுதல்: பல உள்ளீட்டு புலங்களின் மதிப்புகள், சரிபார்ப்புப் பிழைகள் மற்றும் சமர்ப்பிப்பு நிலையை கண்காணித்தல்.
- மின்-வணிக கூடை (E-commerce Cart): பொருட்கள், அளவுகள், விலைகள் மற்றும் செக்அவுட் தகவல்களை நிர்வகித்தல்.
- நிகழ்நேர அரட்டை பயன்பாடுகள்: செய்திகள், பயனர் இருப்பு மற்றும் இணைப்பு நிலையை கையாளுதல்.
இந்த சூழ்நிலைகளில், useState
மட்டும் பயன்படுத்துவது சிக்கலான மற்றும் நிர்வகிக்க கடினமான குறியீட்டிற்கு வழிவகுக்கும். ஒரே நிகழ்விற்குப் பதிலளிக்கும் வகையில் பல நிலை மாறிகளைப் புதுப்பிப்பது சிரமமாகிவிடும், மேலும் இந்த புதுப்பிப்புகளை நிர்வகிப்பதற்கான தர்க்கம் காம்போனென்ட் முழுவதும் சிதறடிக்கப்படலாம், இது புரிந்துகொள்வதற்கும் பராமரிப்பதற்கும் கடினமாக இருக்கும். இங்குதான் useReducer
பிரகாசிக்கிறது.
useReducer
ஹூக் அறிமுகம்
useReducer
ஹூக் என்பது சிக்கலான நிலை தர்க்கத்தை நிர்வகிப்பதற்கான useState
க்கு ஒரு மாற்றாகும். இது Redux பேட்டர்னின் கொள்கைகளை அடிப்படையாகக் கொண்டது, ஆனால் ரியாக்ட் காம்போனென்டிற்குள்ளேயே செயல்படுத்தப்படுகிறது, பல சந்தர்ப்பங்களில் தனி வெளிப்புற லைப்ரரியின் தேவையை நீக்குகிறது. இது உங்கள் நிலை புதுப்பிப்பு தர்க்கத்தை ஒரு ரெடியூசர் (reducer) எனப்படும் ஒற்றைச் செயல்பாட்டில் மையப்படுத்த உங்களை அனுமதிக்கிறது.
useReducer
ஹூக் இரண்டு ஆர்கியுமென்ட்களை எடுக்கும்:
- ஒரு ரெடியூசர் செயல்பாடு: இது தற்போதைய நிலையையும் ஒரு ஆக்ஷனையும் உள்ளீடாக எடுத்து புதிய நிலையைத் திருப்பி அனுப்பும் ஒரு தூய செயல்பாடு (pure function) ஆகும்.
- ஒரு ஆரம்ப நிலை: இது நிலையின் ஆரம்ப மதிப்பாகும்.
இந்த ஹூக் இரண்டு கூறுகளைக் கொண்ட ஒரு வரிசையை (array) வழங்குகிறது:
- தற்போதைய நிலை: இது நிலையின் தற்போதைய மதிப்பாகும்.
- ஒரு டிஸ்பாட்ச் செயல்பாடு: ரெடியூசருக்கு ஆக்ஷன்களை அனுப்புவதன் மூலம் நிலை புதுப்பிப்புகளைத் தூண்டுவதற்கு இந்தச் செயல்பாடு பயன்படுத்தப்படுகிறது.
ரெடியூசர் செயல்பாடு
ரெடியூசர் செயல்பாடு useReducer
பேட்டர்னின் இதயமாகும். இது ஒரு தூய செயல்பாடு, அதாவது இதற்கு எந்த பக்க விளைவுகளும் (API அழைப்புகள் செய்வது அல்லது குளோபல் மாறிகளை மாற்றுவது போன்றவை) இருக்கக்கூடாது மற்றும் ஒரே உள்ளீட்டிற்கு எப்போதும் ஒரே வெளியீட்டைத் திருப்பித் தர வேண்டும். ரெடியூசர் செயல்பாடு இரண்டு ஆர்கியுமென்ட்களை எடுக்கும்:
state
: தற்போதைய நிலை.action
: நிலைக்கு என்ன நடக்க வேண்டும் என்பதை விவரிக்கும் ஒரு ஆப்ஜெக்ட். ஆக்ஷன்கள் பொதுவாக ஆக்ஷனின் வகையைக் குறிக்கும் ஒருtype
பண்பையும், ஆக்ஷன் தொடர்பான தரவைக் கொண்டிருக்கும் ஒருpayload
பண்பையும் கொண்டிருக்கும்.
ரெடியூசர் செயல்பாட்டிற்குள், வெவ்வேறு ஆக்ஷன் வகைகளைக் கையாளவும் அதற்கேற்ப நிலையைப் புதுப்பிக்கவும் நீங்கள் ஒரு switch
ஸ்டேட்மென்ட் அல்லது if/else if
ஸ்டேட்மென்ட்களைப் பயன்படுத்துகிறீர்கள். இது உங்கள் நிலை புதுப்பிப்பு தர்க்கத்தை மையப்படுத்துகிறது மற்றும் வெவ்வேறு நிகழ்வுகளுக்குப் பதிலளிக்கும் விதமாக நிலை எவ்வாறு மாறுகிறது என்பதைப் பற்றி பகுத்தாய்வதை எளிதாக்குகிறது.
டிஸ்பாட்ச் செயல்பாடு
டிஸ்பாட்ச் செயல்பாடு என்பது நிலை புதுப்பிப்புகளைத் தூண்டுவதற்கு நீங்கள் பயன்படுத்தும் முறையாகும். நீங்கள் dispatch(action)
என அழைக்கும்போது, அந்த ஆக்ஷன் ரெடியூசர் செயல்பாட்டிற்கு அனுப்பப்படுகிறது, அது பின்னர் ஆக்ஷனின் வகை மற்றும் பேலோட் அடிப்படையில் நிலையைப் புதுப்பிக்கிறது.
ஒரு நடைமுறை எடுத்துக்காட்டு: ஒரு கவுண்டரை செயல்படுத்துதல்
ஒரு எளிய எடுத்துக்காட்டுடன் ஆரம்பிக்கலாம்: ஒரு கவுண்டர் காம்போனென்ட். இது மேலும் சிக்கலான எடுத்துக்காட்டுகளுக்குச் செல்வதற்கு முன் அடிப்படைக் கருத்துக்களை விளக்குகிறது. நாம் கூட்டவும், குறைக்கவும், மற்றும் மீட்டமைக்கவும் கூடிய ஒரு கவுண்டரை உருவாக்குவோம்:
import React, { useReducer } from 'react';
// Define action types
const INCREMENT = 'INCREMENT';
const DECREMENT = 'DECREMENT';
const RESET = 'RESET';
// Define the reducer function
function counterReducer(state, action) {
switch (action.type) {
case INCREMENT:
return { count: state.count + 1 };
case DECREMENT:
return { count: state.count - 1 };
case RESET:
return { count: 0 };
default:
return state;
}
}
function Counter() {
// Initialize useReducer
const [state, dispatch] = useReducer(counterReducer, { count: 0 });
return (
<div>
<p>எண்ணிக்கை: {state.count}</p>
<button onClick={() => dispatch({ type: INCREMENT })}>கூட்டு</button>
<button onClick={() => dispatch({ type: DECREMENT })}>குறை</button>
<button onClick={() => dispatch({ type: RESET })}>மீட்டமை</button>
</div>
);
}
export default Counter;
இந்த எடுத்துக்காட்டில்:
- சிறந்த பராமரிப்பிற்காக ஆக்ஷன் வகைகளை மாறிலிகளாக வரையறுக்கிறோம் (
INCREMENT
,DECREMENT
,RESET
). counterReducer
செயல்பாடு தற்போதைய நிலையையும் ஒரு ஆக்ஷனையும் எடுக்கிறது. இது ஆக்ஷனின் வகையின் அடிப்படையில் நிலையை எவ்வாறு புதுப்பிப்பது என்பதைத் தீர்மானிக்க ஒருswitch
ஸ்டேட்மென்ட்டைப் பயன்படுத்துகிறது.- ஆரம்ப நிலை
{ count: 0 }
ஆகும். - நிலை புதுப்பிப்புகளைத் தூண்டுவதற்கு பட்டன் கிளிக் ஹேண்ட்லர்களில்
dispatch
செயல்பாடு பயன்படுத்தப்படுகிறது. உதாரணமாக,dispatch({ type: INCREMENT })
என்பதுINCREMENT
வகை ஆக்ஷனை ரெடியூசருக்கு அனுப்புகிறது.
கவுண்டர் எடுத்துக்காட்டை விரிவுபடுத்துதல்: பேலோட் சேர்த்தல்
ஒரு குறிப்பிட்ட மதிப்பால் கூட்டுவதற்கு கவுண்டரை மாற்றுவோம். இது ஒரு ஆக்ஷனில் பேலோட் என்ற கருத்தை அறிமுகப்படுத்துகிறது:
import React, { useReducer } from 'react';
const INCREMENT = 'INCREMENT';
const DECREMENT = 'DECREMENT';
const RESET = 'RESET';
const SET_VALUE = 'SET_VALUE';
function counterReducer(state, action) {
switch (action.type) {
case INCREMENT:
return { count: state.count + action.payload };
case DECREMENT:
return { count: state.count - action.payload };
case RESET:
return { count: 0 };
case SET_VALUE:
return { count: action.payload };
default:
return state;
}
}
function Counter() {
const [state, dispatch] = useReducer(counterReducer, { count: 0 });
const [inputValue, setInputValue] = React.useState(1);
return (
<div>
<p>எண்ணிக்கை: {state.count}</p>
<button onClick={() => dispatch({ type: INCREMENT, payload: parseInt(inputValue) || 1 })}>{inputValue} ஆல் கூட்டு</button>
<button onClick={() => dispatch({ type: DECREMENT, payload: parseInt(inputValue) || 1 })}>{inputValue} ஆல் குறை</button>
<button onClick={() => dispatch({ type: RESET })}>மீட்டமை</button>
<input
type="number"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
</div>
);
}
export default Counter;
இந்த விரிவான எடுத்துக்காட்டில்:
- நாம்
SET_VALUE
ஆக்ஷன் வகையைச் சேர்த்துள்ளோம். INCREMENT
மற்றும்DECREMENT
ஆக்ஷன்கள் இப்போது ஒருpayload
-ஐ ஏற்றுக்கொள்கின்றன, இது கூட்ட அல்லது குறைக்க வேண்டிய அளவைக் குறிக்கிறது.parseInt(inputValue) || 1
மதிப்பு ஒரு முழு எண் என்பதை உறுதி செய்கிறது மற்றும் உள்ளீடு தவறாக இருந்தால் 1 ஆக இயல்புநிலையாக இருக்கும்.- கூட்ட/குறைக்க வேண்டிய மதிப்பை பயனர்கள் அமைக்க அனுமதிக்கும் ஒரு உள்ளீட்டுப் புலத்தைச் சேர்த்துள்ளோம்.
useReducer
பயன்படுத்துவதன் நன்மைகள்
சிக்கலான நிலை நிர்வாகத்திற்காக useState
-ஐ நேரடியாகப் பயன்படுத்துவதை விட useReducer
பேட்டர்ன் பல நன்மைகளை வழங்குகிறது:
- மையப்படுத்தப்பட்ட நிலை தர்க்கம்: அனைத்து நிலை புதுப்பிப்புகளும் ரெடியூசர் செயல்பாட்டிற்குள் கையாளப்படுகின்றன, இது நிலை மாற்றங்களைப் புரிந்துகொள்வதையும் பிழைதிருத்தம் செய்வதையும் எளிதாக்குகிறது.
- மேம்படுத்தப்பட்ட குறியீடு அமைப்பு: நிலை புதுப்பிப்பு தர்க்கத்தை காம்போனென்டின் ரெண்டரிங் தர்க்கத்திலிருந்து பிரிப்பதன் மூலம், உங்கள் குறியீடு மேலும் ஒழுங்கமைக்கப்பட்டதாகவும் படிக்கக்கூடியதாகவும் மாறும், இது சிறந்த குறியீடு பராமரிப்பை ஊக்குவிக்கிறது.
- கணிக்கக்கூடிய நிலை புதுப்பிப்புகள்: ரெடியூசர்கள் தூய செயல்பாடுகளாக இருப்பதால், ஒரு குறிப்பிட்ட ஆக்ஷன் மற்றும் ஆரம்ப நிலையில் நிலை எவ்வாறு மாறும் என்பதை நீங்கள் எளிதாகக் கணிக்க முடியும். இது பிழைதிருத்தம் மற்றும் சோதனையை மிகவும் எளிதாக்குகிறது.
- செயல்திறன் மேம்படுத்தல்:
useReducer
செயல்திறனை மேம்படுத்த உதவும், குறிப்பாக நிலை புதுப்பிப்புகள் கணக்கீட்டு ரீதியாக அதிக செலவு பிடிக்கும் போது. நிலை புதுப்பிப்பு தர்க்கம் ஒரு ரெடியூசரில் இருக்கும்போது ரியாக்ட் மறு-ரெண்டர்களை மிகவும் திறமையாக மேம்படுத்த முடியும். - சோதனைத்திறன்: ரெடியூசர்கள் தூய செயல்பாடுகளாகும், இது அவற்றைச் சோதிப்பதை எளிதாக்குகிறது. உங்கள் ரெடியூசர் வெவ்வேறு ஆக்ஷன்கள் மற்றும் ஆரம்ப நிலைகளைச் சரியாகக் கையாளுகிறதா என்பதை உறுதிப்படுத்த நீங்கள் யூனிட் டெஸ்ட்களை எழுதலாம்.
- Redux-க்கு மாற்றுகள்: பல பயன்பாடுகளுக்கு,
useReducer
Redux-க்கு ஒரு எளிமைப்படுத்தப்பட்ட மாற்றீட்டை வழங்குகிறது, ஒரு தனி லைப்ரரியின் தேவையையும் அதை உள்ளமைத்து நிர்வகிப்பதன் கூடுதல் சுமையையும் நீக்குகிறது. இது உங்கள் மேம்பாட்டுப் பணிப்பாய்வுகளை, குறிப்பாக சிறிய மற்றும் நடுத்தர அளவிலான திட்டங்களுக்கு நெறிப்படுத்த முடியும்.
useReducer
எப்போது பயன்படுத்த வேண்டும்
useReducer
குறிப்பிடத்தக்க நன்மைகளை வழங்கினாலும், அது எப்போதும் சரியான தேர்வாக இருக்காது. பின்வரும் சமயங்களில் useReducer
-ஐப் பயன்படுத்தக் கருதுங்கள்:
- பல நிலை மாறிகளை உள்ளடக்கிய சிக்கலான நிலை தர்க்கம் உங்களிடம் இருக்கும்போது.
- நிலை புதுப்பிப்புகள் முந்தைய நிலையைச் சார்ந்திருக்கும்போது (எ.கா., இயங்கும் மொத்தத்தைக் கணக்கிடுதல்).
- சிறந்த பராமரிப்பிற்காக உங்கள் நிலை புதுப்பிப்பு தர்க்கத்தை மையப்படுத்தி ஒழுங்கமைக்க வேண்டியிருக்கும்போது.
- உங்கள் நிலை புதுப்பிப்புகளின் சோதனைத்திறனையும் கணிக்கக்கூடிய தன்மையையும் மேம்படுத்த விரும்பும்போது.
- ஒரு தனி லைப்ரரியை அறிமுகப்படுத்தாமல் Redux-போன்ற பேட்டர்னைத் தேடும்போது.
எளிய நிலை புதுப்பிப்புகளுக்கு, useState
பெரும்பாலும் போதுமானது மற்றும் பயன்படுத்த எளிதானது. முடிவெடுக்கும்போது உங்கள் நிலையின் சிக்கலான தன்மையையும் வளர்ச்சியின் சாத்தியக்கூறுகளையும் கருத்தில் கொள்ளுங்கள்.
மேம்பட்ட கருத்துக்கள் மற்றும் நுட்பங்கள்
useReducer
-ஐ Context உடன் இணைத்தல்
குளோபல் நிலையை நிர்வகிக்க அல்லது பல காம்போனென்ட்களுக்கு இடையில் நிலையைப் பகிர, நீங்கள் useReducer
-ஐ ரியாக்ட்டின் Context API உடன் இணைக்கலாம். கூடுதல் சார்புகளை அறிமுகப்படுத்த விரும்பாத சிறிய மற்றும் நடுத்தர அளவிலான திட்டங்களுக்கு Redux-ஐ விட இந்த அணுகுமுறை பெரும்பாலும் விரும்பப்படுகிறது.
import React, { createContext, useReducer, useContext } from 'react';
// Define action types and reducer (as before)
const INCREMENT = 'INCREMENT';
// ... (other action types and the counterReducer function)
const CounterContext = createContext();
function CounterProvider({ children }) {
const [state, dispatch] = useReducer(counterReducer, { count: 0 });
return (
<CounterContext.Provider value={{ state, dispatch }}>
{children}
</CounterContext.Provider>
);
}
function useCounter() {
return useContext(CounterContext);
}
function Counter() {
const { state, dispatch } = useCounter();
return (
<div>
<p>Count: {state.count}</p>
<button onClick={() => dispatch({ type: INCREMENT })}>Increment</button>
</div>
);
}
function App() {
return (
<CounterProvider>
<Counter />
</CounterProvider>
);
}
export default App;
இந்த எடுத்துக்காட்டில்:
- நாம்
createContext
பயன்படுத்தி ஒருCounterContext
-ஐ உருவாக்குகிறோம். CounterProvider
பயன்பாட்டை (அல்லது கவுண்டர் நிலையை அணுக வேண்டிய பகுதிகளை) சூழ்ந்து,useReducer
-லிருந்துstate
மற்றும்dispatch
-ஐ வழங்குகிறது.useCounter
ஹூக் சைல்டு காம்போனென்ட்களுக்குள் கான்டெக்ஸ்டை அணுகுவதை எளிதாக்குகிறது.Counter
போன்ற காம்போனென்ட்கள் இப்போது கவுண்டர் நிலையை உலகளவில் அணுகி மாற்றியமைக்க முடியும். இது பல நிலைகளிலான காம்போனென்ட்கள் வழியாக நிலையையும் டிஸ்பாட்ச் செயல்பாட்டையும் அனுப்ப வேண்டிய தேவையை நீக்குகிறது, ப்ராப்ஸ் நிர்வாகத்தை எளிதாக்குகிறது.
useReducer
-ஐ சோதித்தல்
ரெடியூசர்கள் தூய செயல்பாடுகள் என்பதால் அவற்றைச் சோதிப்பது எளிமையானது. ஜெஸ்ட் (Jest) அல்லது மோக்கா (Mocha) போன்ற ஒரு யூனிட் டெஸ்டிங் கட்டமைப்பைப் பயன்படுத்தி ரெடியூசர் செயல்பாட்டைத் தனியாக எளிதாகச் சோதிக்கலாம். ஜெஸ்ட் பயன்படுத்தி ஒரு எடுத்துக்காட்டு இங்கே:
import { counterReducer } from './counterReducer'; // Assuming counterReducer is in a separate file
const INCREMENT = 'INCREMENT';
describe('counterReducer', () => {
it('should increment the count', () => {
const state = { count: 0 };
const action = { type: INCREMENT };
const newState = counterReducer(state, action);
expect(newState.count).toBe(1);
});
it('should return the same state for unknown action types', () => {
const state = { count: 10 };
const action = { type: 'UNKNOWN_ACTION' };
const newState = counterReducer(state, action);
expect(newState).toBe(state); // Assert that the state hasn't changed
});
});
உங்கள் ரெடியூசர்களைச் சோதிப்பது அவை எதிர்பார்த்தபடி செயல்படுவதை உறுதி செய்கிறது மற்றும் உங்கள் நிலை தர்க்கத்தை மறுசீரமைப்பதை எளிதாக்குகிறது. இது வலுவான மற்றும் பராமரிக்கக்கூடிய பயன்பாடுகளை உருவாக்குவதில் ஒரு முக்கியமான படியாகும்.
மெமோயிசேஷன் மூலம் செயல்திறனை மேம்படுத்துதல்
சிக்கலான நிலைகள் மற்றும் அடிக்கடி புதுப்பிப்புகளுடன் பணிபுரியும்போது, உங்கள் காம்போனென்ட்களின் செயல்திறனை மேம்படுத்த useMemo
-ஐப் பயன்படுத்துவதைக் கவனியுங்கள், குறிப்பாக நிலையில் இருந்து கணக்கிடப்பட்ட வழித்தோன்றல் மதிப்புகள் உங்களிடம் இருந்தால். உதாரணமாக:
import React, { useReducer, useMemo } from 'react';
function reducer(state, action) {
// ... (reducer logic)
}
function MyComponent() {
const [state, dispatch] = useReducer(reducer, initialState);
// Calculate a derived value, memoizing it with useMemo
const derivedValue = useMemo(() => {
// Expensive calculation based on state
return state.value1 + state.value2;
}, [state.value1, state.value2]); // Dependencies: recalculate only when these values change
return (
<div>
<p>வழித்தோன்றல் மதிப்பு: {derivedValue}</p>
<button onClick={() => dispatch({ type: 'UPDATE_VALUE1', payload: 10 })}>மதிப்பு 1-ஐ புதுப்பி</button>
<button onClick={() => dispatch({ type: 'UPDATE_VALUE2', payload: 20 })}>மதிப்பு 2-ஐ புதுப்பி</button>
</div>
);
}
இந்த எடுத்துக்காட்டில், derivedValue
என்பது state.value1
அல்லது state.value2
மாறும் போது மட்டுமே கணக்கிடப்படுகிறது, ஒவ்வொரு மறு-ரெண்டரிலும் தேவையற்ற கணக்கீடுகளைத் தடுக்கிறது. இந்த அணுகுமுறை உகந்த ரெண்டரிங் செயல்திறனை உறுதி செய்வதற்கான ஒரு பொதுவான நடைமுறையாகும்.
நிஜ உலக எடுத்துக்காட்டுகள் மற்றும் பயன்பாட்டு வழக்குகள்
உலகளாவிய பார்வையாளர்களுக்காக ரியாக்ட் பயன்பாடுகளை உருவாக்குவதில் useReducer
ஒரு மதிப்புமிக்க கருவியாக இருக்கும் சில நடைமுறை எடுத்துக்காட்டுகளை ஆராய்வோம். இந்த எடுத்துக்காட்டுகள் முக்கியக் கருத்துக்களை விளக்க எளிமைப்படுத்தப்பட்டுள்ளன என்பதை நினைவில் கொள்க. உண்மையான செயல்பாடுகள் மேலும் சிக்கலான தர்க்கம் மற்றும் சார்புகளை உள்ளடக்கியிருக்கலாம்.
1. மின்-வணிக தயாரிப்பு வடிகட்டிகள்
ஒரு பெரிய தயாரிப்புப் பட்டியலைக் கொண்ட ஒரு மின்-வணிக வலைத்தளத்தை (அமேசான் அல்லது அலிஎக்ஸ்பிரஸ் போன்ற உலகளவில் கிடைக்கும் பிரபலமான தளங்களை நினைத்துப் பாருங்கள்) கற்பனை செய்து பாருங்கள். பயனர்கள் பல்வேறு அளவுகோல்களின்படி (விலை வரம்பு, பிராண்ட், அளவு, நிறம், பிறந்த நாடு போன்றவை) தயாரிப்புகளை வடிகட்ட வேண்டும். வடிகட்டி நிலையை நிர்வகிக்க useReducer
மிகவும் பொருத்தமானது.
import React, { useReducer } from 'react';
const initialState = {
priceRange: { min: 0, max: 1000 },
brand: [], // Array of selected brands
color: [], // Array of selected colors
//... other filter criteria
};
function filterReducer(state, action) {
switch (action.type) {
case 'UPDATE_PRICE_RANGE':
return { ...state, priceRange: action.payload };
case 'TOGGLE_BRAND':
const brand = action.payload;
return { ...state, brand: state.brand.includes(brand) ? state.brand.filter(b => b !== brand) : [...state.brand, brand] };
case 'TOGGLE_COLOR':
// Similar logic for color filtering
return { ...state, color: state.color.includes(action.payload) ? state.color.filter(c => c !== action.payload) : [...state.color, action.payload] };
// ... other filter actions
default:
return state;
}
}
function ProductFilter() {
const [state, dispatch] = useReducer(filterReducer, initialState);
// UI components for selecting filter criteria and triggering dispatch actions
// For example: Range input for price, checkboxes for brands, etc.
return (
<div>
<!-- Filter UI elements -->
</div>
);
}
இந்த எடுத்துக்காட்டு பல வடிகட்டி அளவுகோல்களைக் கட்டுப்படுத்தப்பட்ட முறையில் எவ்வாறு கையாள்வது என்பதைக் காட்டுகிறது. ஒரு பயனர் எந்தவொரு வடிகட்டி அமைப்பையும் (விலை, பிராண்ட், முதலியன) மாற்றும்போது, ரெடியூசர் அதற்கேற்ப வடிகட்டி நிலையைப் புதுப்பிக்கிறது. தயாரிப்புகளைக் காண்பிப்பதற்கான பொறுப்புள்ள காம்போனென்ட், காட்டப்படும் தயாரிப்புகளை வடிகட்ட புதுப்பிக்கப்பட்ட நிலையைப் பயன்படுத்துகிறது. இந்த பேட்டர்ன் உலகளாவிய மின்-வணிக தளங்களில் பொதுவான சிக்கலான வடிகட்டி அமைப்புகளை உருவாக்க உதவுகிறது.
2. பல-படி படிவங்கள் (எ.கா., சர்வதேச ஷிப்பிங் படிவங்கள்)
பல பயன்பாடுகள் பல-படி படிவங்களை உள்ளடக்கியுள்ளன, சர்வதேச ஷிப்பிங்கிற்கு அல்லது சிக்கலான தேவைகளைக் கொண்ட பயனர் கணக்குகளை உருவாக்குவதற்குப் பயன்படுத்தப்படுபவை போன்றவை. அத்தகைய படிவங்களின் நிலையை நிர்வகிப்பதில் useReducer
சிறந்து விளங்குகிறது.
import React, { useReducer } from 'react';
const initialState = {
step: 1, // Current step in the form
formData: {
firstName: '',
lastName: '',
address: '',
city: '',
country: '',
// ... other form fields
},
errors: {},
};
function formReducer(state, action) {
switch (action.type) {
case 'NEXT_STEP':
return { ...state, step: state.step + 1 };
case 'PREV_STEP':
return { ...state, step: state.step - 1 };
case 'UPDATE_FIELD':
return { ...state, formData: { ...state.formData, [action.payload.field]: action.payload.value } };
case 'SET_ERRORS':
return { ...state, errors: action.payload };
case 'SUBMIT_FORM':
// Handle form submission logic here, e.g., API calls
return state;
default:
return state;
}
}
function MultiStepForm() {
const [state, dispatch] = useReducer(formReducer, initialState);
// Rendering logic for each step of the form
// Based on the current step in the state
const renderStep = () => {
switch (state.step) {
case 1:
return <Step1 formData={state.formData} dispatch={dispatch} />;
case 2:
return <Step2 formData={state.formData} dispatch={dispatch} />;
// ... other steps
default:
return <p>தவறான படி</p>;
}
};
return (
<div>
{renderStep()}
<!-- Navigation buttons (Next, Previous, Submit) based on the current step -->
</div>
);
}
இது வெவ்வேறு படிவப் புலங்கள், படிகள் மற்றும் சாத்தியமான சரிபார்ப்புப் பிழைகளை ஒரு கட்டமைக்கப்பட்ட மற்றும் பராமரிக்கக்கூடிய வழியில் எவ்வாறு நிர்வகிப்பது என்பதை விளக்குகிறது. இது பயனர் நட்பு பதிவு அல்லது செக்அவுட் செயல்முறைகளை உருவாக்குவதற்கு முக்கியமானது, குறிப்பாக பேஸ்புக் அல்லது வீசாட் போன்ற பல்வேறு தளங்களுடனான தங்கள் உள்ளூர் பழக்கவழக்கங்கள் மற்றும் அனுபவத்தின் அடிப்படையில் வெவ்வேறு எதிர்பார்ப்புகளைக் கொண்டிருக்கக்கூடிய சர்வதேச பயனர்களுக்கு.
3. நிகழ்நேர பயன்பாடுகள் (அரட்டை, கூட்டுப்பணி கருவிகள்)
கூகுள் டாக்ஸ் அல்லது மெசேஜிங் பயன்பாடுகள் போன்ற கூட்டுப்பணி கருவிகள் போன்ற நிகழ்நேர பயன்பாடுகளுக்கு useReducer
நன்மை பயக்கும். இது செய்திகளைப் பெறுதல், பயனர் சேருதல்/வெளியேறுதல் மற்றும் இணைப்பு நிலை போன்ற நிகழ்வுகளைக் கையாளுகிறது, UI தேவைக்கேற்ப புதுப்பிக்கப்படுவதை உறுதி செய்கிறது.
import React, { useReducer, useEffect } from 'react';
const initialState = {
messages: [],
users: [],
connectionStatus: 'connecting',
};
function chatReducer(state, action) {
switch (action.type) {
case 'RECEIVE_MESSAGE':
return { ...state, messages: [...state.messages, action.payload] };
case 'USER_JOINED':
return { ...state, users: [...state.users, action.payload] };
case 'USER_LEFT':
return { ...state, users: state.users.filter(user => user.id !== action.payload.id) };
case 'SET_CONNECTION_STATUS':
return { ...state, connectionStatus: action.payload };
default:
return state;
}
}
function ChatRoom() {
const [state, dispatch] = useReducer(chatReducer, initialState);
useEffect(() => {
// Establish WebSocket connection (example):
const socket = new WebSocket('wss://your-websocket-server.com');
socket.onopen = () => dispatch({ type: 'SET_CONNECTION_STATUS', payload: 'connected' });
socket.onmessage = (event) => dispatch({ type: 'RECEIVE_MESSAGE', payload: JSON.parse(event.data) });
socket.onclose = () => dispatch({ type: 'SET_CONNECTION_STATUS', payload: 'disconnected' });
return () => socket.close(); // Cleanup on unmount
}, []);
// Render messages, user list, and connection status based on the state
return (
<div>
<p>இணைப்பு நிலை: {state.connectionStatus}</p>
<!-- UI for displaying messages, user list, and sending messages -->
</div>
);
}
இந்த எடுத்துக்காட்டு ஒரு நிகழ்நேர அரட்டையை நிர்வகிப்பதற்கான அடிப்படையை வழங்குகிறது. நிலை செய்தி சேமிப்பு, தற்போது அரட்டையில் உள்ள பயனர்கள் மற்றும் இணைப்பு நிலையை கையாளுகிறது. useEffect
ஹூக் WebSocket இணைப்பை நிறுவுவதற்கும் உள்வரும் செய்திகளைக் கையாளுவதற்கும் பொறுப்பாகும். இந்த அணுகுமுறை உலகெங்கிலும் உள்ள பயனர்களுக்கு ஏற்ற ஒரு பதிலளிக்கக்கூடிய மற்றும் மாறும் பயனர் இடைமுகத்தை உருவாக்குகிறது.
useReducer
-ஐப் பயன்படுத்துவதற்கான சிறந்த நடைமுறைகள்
useReducer
-ஐ திறம்படப் பயன்படுத்தவும், பராமரிக்கக்கூடிய பயன்பாடுகளை உருவாக்கவும், இந்த சிறந்த நடைமுறைகளைக் கருத்தில் கொள்ளுங்கள்:
- ஆக்ஷன் வகைகளை வரையறுத்தல்: உங்கள் ஆக்ஷன் வகைகளுக்கு மாறிலிகளைப் பயன்படுத்தவும் (எ.கா.,
const INCREMENT = 'INCREMENT';
). இது எழுத்துப்பிழைகளைத் தவிர்ப்பதை எளிதாக்குகிறது மற்றும் குறியீட்டின் வாசிப்புத்திறனை மேம்படுத்துகிறது. - ரெடியூசர்களை தூய்மையாக வைத்திருங்கள்: ரெடியூசர்கள் தூய செயல்பாடுகளாக இருக்க வேண்டும். அவற்றுக்கு பக்க விளைவுகள் இருக்கக்கூடாது, அதாவது குளோபல் மாறிகளை மாற்றுவது அல்லது API அழைப்புகள் செய்வது போன்றவை. ரெடியூசர் தற்போதைய நிலை மற்றும் ஆக்ஷனின் அடிப்படையில் புதிய நிலையை மட்டுமே கணக்கிட்டு திருப்பித் தர வேண்டும்.
- மாறாத நிலை புதுப்பிப்புகள்: நிலையை எப்போதும் மாறாத முறையில் புதுப்பிக்கவும். நிலை ஆப்ஜெக்ட்டை நேரடியாக மாற்ற வேண்டாம். அதற்கு பதிலாக, ஸ்ப்ரெட் சிண்டாக்ஸ் (
...
) அல்லதுObject.assign()
பயன்படுத்தி விரும்பிய மாற்றங்களுடன் ஒரு புதிய ஆப்ஜெக்ட்டை உருவாக்கவும். இது எதிர்பாராத நடத்தையைத் தடுக்கிறது மற்றும் எளிதான பிழைத்திருத்தத்தை செயல்படுத்துகிறது. - பேலோட்களுடன் ஆக்ஷன்களை கட்டமைத்தல்: ரெடியூசருக்கு தரவை அனுப்ப உங்கள் ஆக்ஷன்களில்
payload
பண்பைப் பயன்படுத்தவும். இது உங்கள் ஆக்ஷன்களை மேலும் நெகிழ்வானதாக ஆக்குகிறது மற்றும் பரந்த அளவிலான நிலை புதுப்பிப்புகளைக் கையாள உங்களை அனுமதிக்கிறது. - குளோபல் நிலைக்கு Context API-ஐப் பயன்படுத்தவும்: உங்கள் நிலை பல காம்போனென்ட்களுக்கு இடையில் பகிரப்பட வேண்டுமானால்,
useReducer
-ஐ Context API உடன் இணைக்கவும். இது Redux போன்ற வெளிப்புற சார்புகளை அறிமுகப்படுத்தாமல் குளோபல் நிலையை நிர்வகிக்க ஒரு சுத்தமான மற்றும் திறமையான வழியை வழங்குகிறது. - சிக்கலான தர்க்கத்திற்காக ரெடியூசர்களைப் பிரித்தல்: சிக்கலான நிலை தர்க்கத்திற்கு, உங்கள் ரெடியூசரை சிறிய, மேலும் நிர்வகிக்கக்கூடிய செயல்பாடுகளாகப் பிரிப்பதைக் கருத்தில் கொள்ளுங்கள். இது வாசிப்புத்திறனையும் பராமரிப்பையும் மேம்படுத்துகிறது. ரெடியூசர் செயல்பாட்டின் ஒரு குறிப்பிட்ட பகுதிக்குள் தொடர்புடைய ஆக்ஷன்களையும் நீங்கள் குழுவாக்கலாம்.
- உங்கள் ரெடியூசர்களைச் சோதிக்கவும்: உங்கள் ரெடியூசர்கள் வெவ்வேறு ஆக்ஷன்கள் மற்றும் ஆரம்ப நிலைகளைச் சரியாகக் கையாளுகின்றனவா என்பதை உறுதிப்படுத்த அவற்றுக்கு யூனிட் டெஸ்ட்களை எழுதுங்கள். குறியீட்டின் தரத்தை உறுதி செய்வதற்கும் பின்னடைவுகளைத் தடுப்பதற்கும் இது முக்கியமானது. சோதனைகள் நிலை மாற்றங்களின் அனைத்து சாத்தியமான சூழ்நிலைகளையும் உள்ளடக்க வேண்டும்.
- செயல்திறன் மேம்படுத்தலைக் கருத்தில் கொள்ளுங்கள்: உங்கள் நிலை புதுப்பிப்புகள் கணக்கீட்டு ரீதியாக அதிக செலவு பிடிப்பதாகவோ அல்லது அடிக்கடி மறு-ரெண்டர்களைத் தூண்டுவதாகவோ இருந்தால், உங்கள் காம்போனென்ட்களின் செயல்திறனை மேம்படுத்த
useMemo
போன்ற மெமோயிசேஷன் நுட்பங்களைப் பயன்படுத்தவும். - ஆவணப்படுத்தல்: நிலை, ஆக்ஷன்கள் மற்றும் உங்கள் ரெடியூசரின் நோக்கம் பற்றிய தெளிவான ஆவணங்களை வழங்கவும். இது மற்ற டெவலப்பர்கள் உங்கள் குறியீட்டைப் புரிந்துகொள்ளவும் பராமரிக்கவும் உதவுகிறது.
முடிவுரை
useReducer
ஹூக் ரியாக்ட் பயன்பாடுகளில் சிக்கலான நிலையை நிர்வகிப்பதற்கான ஒரு சக்திவாய்ந்த மற்றும் பல்துறை கருவியாகும். இது மையப்படுத்தப்பட்ட நிலை தர்க்கம், மேம்படுத்தப்பட்ட குறியீடு அமைப்பு மற்றும் மேம்பட்ட சோதனைத்திறன் உள்ளிட்ட பல நன்மைகளை வழங்குகிறது. சிறந்த நடைமுறைகளைப் பின்பற்றுவதன் மூலமும் அதன் முக்கியக் கருத்துக்களைப் புரிந்துகொள்வதன் மூலமும், நீங்கள் useReducer
-ஐப் பயன்படுத்தி மேலும் வலுவான, பராமரிக்கக்கூடிய மற்றும் செயல்திறன் மிக்க ரியாக்ட் பயன்பாடுகளை உருவாக்க முடியும். இந்த பேட்டர்ன் சிக்கலான நிலை மேலாண்மை சவால்களைத் திறம்படச் சமாளிக்க உங்களுக்கு அதிகாரம் அளிக்கிறது, உலகளவில் தடையற்ற பயனர் அனுபவங்களை வழங்கும் உலகளாவிய-தயார் பயன்பாடுகளை உருவாக்க உங்களை அனுமதிக்கிறது.
நீங்கள் ரியாக்ட் மேம்பாட்டில் ஆழமாகச் செல்லும்போது, உங்கள் கருவித்தொகுப்பில் useReducer
பேட்டர்னை இணைப்பது சந்தேகத்திற்கு இடமின்றி தூய்மையான, மேலும் அளவிடக்கூடிய மற்றும் எளிதில் பராமரிக்கக்கூடிய குறியீட்டுத் தளங்களுக்கு வழிவகுக்கும். உங்கள் பயன்பாட்டின் குறிப்பிட்ட தேவைகளை எப்போதும் கருத்தில் கொண்டு, ஒவ்வொரு சூழ்நிலைக்கும் நிலை நிர்வாகத்திற்கான சிறந்த அணுகுமுறையைத் தேர்வுசெய்ய நினைவில் கொள்ளுங்கள். மகிழ்ச்சியான கோடிங்!