రియాక్ట్ useMemo హుక్ పై సమగ్ర గైడ్. సమర్థవంతమైన గ్లోబల్ అప్లికేషన్ల కోసం దాని మెమోయిజేషన్, పెర్ఫార్మెన్స్ ప్యాట్రన్స్, మరియు ఉత్తమ పద్ధతులను వివరిస్తుంది.
రియాక్ట్ useMemo: గ్లోబల్ అప్లికేషన్ల కోసం వాల్యూ మెమోయిజేషన్ పెర్ఫార్మెన్స్ ప్యాట్రన్స్
నిరంతరం అభివృద్ధి చెందుతున్న వెబ్ డెవలప్మెంట్ ప్రపంచంలో, పెర్ఫార్మెన్స్ ఆప్టిమైజేషన్ చాలా ముఖ్యం, ప్రత్యేకంగా గ్లోబల్ ప్రేక్షకుల కోసం అప్లికేషన్లను రూపొందించేటప్పుడు. రియాక్ట్, యూజర్ ఇంటర్ఫేస్లను రూపొందించడానికి ఒక ప్రముఖ జావాస్క్రిప్ట్ లైబ్రరీ, పెర్ఫార్మెన్స్ను మెరుగుపరచడానికి అనేక సాధనాలను అందిస్తుంది. అటువంటి ఒక సాధనం useMemo హుక్. ఈ గైడ్ useMemo యొక్క సమగ్ర అన్వేషణను అందిస్తుంది, దాని వాల్యూ మెమోయిజేషన్ సామర్థ్యాలు, పెర్ఫార్మెన్స్ ఆప్టిమైజేషన్ ప్యాట్రన్స్, మరియు సమర్థవంతమైన మరియు రెస్పాన్సివ్ గ్లోబల్ అప్లికేషన్లను రూపొందించడానికి ఉత్తమ పద్ధతులను వివరిస్తుంది.
మెమోయిజేషన్ను అర్థం చేసుకోవడం
మెమోయిజేషన్ అనేది ఒక ఆప్టిమైజేషన్ టెక్నిక్, ఇది ఖరీదైన ఫంక్షన్ కాల్స్ యొక్క ఫలితాలను కాష్ చేయడం ద్వారా అప్లికేషన్లను వేగవంతం చేస్తుంది మరియు అవే ఇన్పుట్లు మళ్లీ వచ్చినప్పుడు కాష్ చేసిన ఫలితాన్ని తిరిగి ఇస్తుంది. ఇది ఒక ట్రేడ్-ఆఫ్: మీరు మెమరీ వినియోగాన్ని గణన సమయం తగ్గించుకోవడానికి మార్చుకుంటారు. మీరు ఒక సంక్లిష్ట బహుభుజి యొక్క వైశాల్యాన్ని లెక్కించే ఒక గణనపరంగా తీవ్రమైన ఫంక్షన్ను కలిగి ఉన్నారని ఊహించుకోండి. మెమోయిజేషన్ లేకుండా, ఈ ఫంక్షన్ అదే బహుభుజి డేటాతో కూడా పిలిచిన ప్రతిసారీ మళ్లీ అమలు చేయబడుతుంది. మెమోయిజేషన్తో, ఫలితం నిల్వ చేయబడుతుంది, మరియు అదే బహుభుజి డేటాతో తదుపరి కాల్స్ నిల్వ చేసిన విలువను నేరుగా తిరిగి పొందుతాయి, ఖరీదైన గణనను దాటవేస్తాయి.
రియాక్ట్ యొక్క useMemo హుక్ను పరిచయం చేయడం
రియాక్ట్ యొక్క useMemo హుక్ ఒక గణన ఫలితాన్ని మెమోయిజ్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది రెండు ఆర్గ్యుమెంట్లను అంగీకరిస్తుంది:
- మెమోయిజ్ చేయవలసిన విలువను లెక్కించే ఒక ఫంక్షన్.
- ఒక డిపెండెన్సీ అర్రే.
ఈ హుక్ మెమోయిజ్ చేసిన విలువను తిరిగి ఇస్తుంది. డిపెండెన్సీ అర్రేలోని డిపెండెన్సీలలో ఒకటి మారినప్పుడు మాత్రమే ఫంక్షన్ మళ్లీ అమలు చేయబడుతుంది. డిపెండెన్సీలు అలాగే ఉంటే, useMemo గతంలో మెమోయిజ్ చేసిన విలువను తిరిగి ఇస్తుంది, అనవసరమైన పునఃగణనలను నివారిస్తుంది.
సింటాక్స్
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
ఈ ఉదాహరణలో, computeExpensiveValue అనేది మనం ఫలితాన్ని మెమోయిజ్ చేయాలనుకుంటున్న ఫంక్షన్. [a, b] అనేది డిపెండెన్సీ అర్రే. a లేదా b మారినప్పుడు మాత్రమే మెమోయిజ్ చేసిన విలువ తిరిగి లెక్కించబడుతుంది.
useMemo ఉపయోగించడం వల్ల ప్రయోజనాలు
useMemo ఉపయోగించడం అనేక ప్రయోజనాలను అందిస్తుంది:
- పెర్ఫార్మెన్స్ ఆప్టిమైజేషన్: అనవసరమైన పునఃగణనలను నివారిస్తుంది, దీనివల్ల వేగవంతమైన రెండరింగ్ మరియు మెరుగైన యూజర్ అనుభవం లభిస్తుంది, ముఖ్యంగా సంక్లిష్ట కాంపోనెంట్స్ లేదా గణనపరంగా తీవ్రమైన ఆపరేషన్ల కోసం.
- రిఫరెన్షియల్ ఈక్వాలిటీ: సంక్లిష్ట డేటా స్ట్రక్చర్ల కోసం రిఫరెన్షియల్ ఈక్వాలిటీని నిర్వహిస్తుంది, కఠినమైన ఈక్వాలిటీ చెక్స్పై ఆధారపడే చైల్డ్ కాంపోనెంట్స్ యొక్క అనవసరమైన రీ-రెండర్లను నివారిస్తుంది.
- తగ్గిన గార్బేజ్ కలెక్షన్: అనవసరమైన పునఃగణనలను నివారించడం ద్వారా,
useMemoఉత్పత్తి అయ్యే గార్బేజ్ మొత్తాన్ని తగ్గిస్తుంది, మొత్తం అప్లికేషన్ పెర్ఫార్మెన్స్ మరియు రెస్పాన్సివ్నెస్ను మెరుగుపరుస్తుంది.
useMemo పెర్ఫార్మెన్స్ ప్యాట్రన్స్ మరియు ఉదాహరణలు
useMemo పెర్ఫార్మెన్స్ను గణనీయంగా మెరుగుపరచగల అనేక ఆచరణాత్మక దృశ్యాలను అన్వేషిద్దాం.
1. ఖరీదైన గణనలను మెమోయిజ్ చేయడం
ఒక పెద్ద డేటాసెట్ను ప్రదర్శించే మరియు సంక్లిష్టమైన ఫిల్టరింగ్ లేదా సార్టింగ్ ఆపరేషన్లను చేసే ఒక కాంపోనెంట్ను పరిగణించండి.
function ExpensiveComponent({ data, filter }) {
const filteredData = useMemo(() => {
// Simulate an expensive filtering operation
console.log('Filtering data...');
return data.filter(item => item.name.includes(filter));
}, [data, filter]);
return (
{filteredData.map(item => (
- {item.name}
))}
);
}
ఈ ఉదాహరణలో, filteredData useMemo ఉపయోగించి మెమోయిజ్ చేయబడింది. data లేదా filter ప్రాప్ మారినప్పుడు మాత్రమే ఫిల్టరింగ్ ఆపరేషన్ మళ్లీ అమలు చేయబడుతుంది. useMemo లేకుండా, data మరియు filter అలాగే ఉన్నప్పటికీ, ప్రతి రెండర్పై ఫిల్టరింగ్ ఆపరేషన్ జరుగుతుంది.
గ్లోబల్ అప్లికేషన్ ఉదాహరణ: ఉత్పత్తి జాబితాలను ప్రదర్శించే ఒక గ్లోబల్ ఇ-కామర్స్ అప్లికేషన్ను ఊహించుకోండి. ధర పరిధి, మూలం దేశం, లేదా కస్టమర్ రేటింగ్ల ద్వారా ఫిల్టరింగ్ చేయడం గణనపరంగా తీవ్రంగా ఉంటుంది, ప్రత్యేకంగా వేలాది ఉత్పత్తులతో. ఫిల్టర్ ప్రమాణాల ఆధారంగా ఫిల్టర్ చేయబడిన ఉత్పత్తి జాబితాను కాష్ చేయడానికి useMemo ఉపయోగించడం ఉత్పత్తి జాబితా పేజీ యొక్క రెస్పాన్సివ్నెస్ను నాటకీయంగా మెరుగుపరుస్తుంది. యూజర్ యొక్క స్థానానికి తగిన వివిధ కరెన్సీలు మరియు డిస్ప్లే ఫార్మాట్లను పరిగణించండి.
2. చైల్డ్ కాంపోనెంట్స్ కోసం రిఫరెన్షియల్ ఈక్వాలిటీని నిర్వహించడం
చైల్డ్ కాంపోనెంట్స్కు ప్రాప్స్గా సంక్లిష్ట డేటా స్ట్రక్చర్లను పంపేటప్పుడు, చైల్డ్ కాంపోనెంట్లు అనవసరంగా రీ-రెండర్ కాకుండా చూసుకోవడం ముఖ్యం. useMemo రిఫరెన్షియల్ ఈక్వాలిటీని నిర్వహించడంలో సహాయపడుతుంది, ఈ రీ-రెండర్లను నివారిస్తుంది.
function ParentComponent({ config }) {
const memoizedConfig = useMemo(() => config, [config]);
return ;
}
function ChildComponent({ config }) {
// ChildComponent uses React.memo for performance optimization
console.log('ChildComponent rendered');
return {JSON.stringify(config)};
}
const MemoizedChildComponent = React.memo(ChildComponent, (prevProps, nextProps) => {
// Compare props to determine if a re-render is necessary
return prevProps.config === nextProps.config; // Only re-render if config changes
});
export default ParentComponent;
ఇక్కడ, ParentComponent config ప్రాప్ను useMemo ఉపయోగించి మెమోయిజ్ చేస్తుంది. ChildComponent (React.memoలో చుట్టబడింది) memoizedConfig రిఫరెన్స్ మారినప్పుడు మాత్రమే రీ-రెండర్ అవుతుంది. ఇది config ఆబ్జెక్ట్ యొక్క ప్రాపర్టీలు మారినప్పటికీ, ఆబ్జెక్ట్ రిఫరెన్స్ అలాగే ఉన్నప్పుడు అనవసరమైన రీ-రెండర్లను నివారిస్తుంది. `useMemo` లేకుండా, `ParentComponent` యొక్క ప్రతి రెండర్పై ఒక కొత్త ఆబ్జెక్ట్ సృష్టించబడుతుంది, ఇది `ChildComponent` యొక్క అనవసరమైన రీ-రెండర్లకు దారితీస్తుంది.
గ్లోబల్ అప్లికేషన్ ఉదాహరణ: భాష, టైమ్జోన్, మరియు నోటిఫికేషన్ సెట్టింగ్ల వంటి ప్రాధాన్యతలతో యూజర్ ప్రొఫైల్లను నిర్వహించే ఒక అప్లికేషన్ను పరిగణించండి. పేరెంట్ కాంపోనెంట్ ఈ నిర్దిష్ట ప్రాధాన్యతలను మార్చకుండా ప్రొఫైల్ను అప్డేట్ చేస్తే, ఈ ప్రాధాన్యతలను ప్రదర్శించే చైల్డ్ కాంపోనెంట్ రీ-రెండర్ కాకూడదు. useMemo ఈ ప్రాధాన్యతలు మారినప్పుడు తప్ప, చైల్డ్కు పంపబడిన కాన్ఫిగరేషన్ ఆబ్జెక్ట్ రిఫరెన్షియల్గా అలాగే ఉండేలా చూస్తుంది, అనవసరమైన రీ-రెండర్లను నివారిస్తుంది.
3. ఈవెంట్ హ్యాండ్లర్లను ఆప్టిమైజ్ చేయడం
ప్రాప్స్గా ఈవెంట్ హ్యాండ్లర్లను పంపేటప్పుడు, ప్రతి రెండర్పై ఒక కొత్త ఫంక్షన్ను సృష్టించడం పెర్ఫార్మెన్స్ సమస్యలకు దారితీస్తుంది. useMemo, useCallbackతో కలిపి, దీనిని ఆప్టిమైజ్ చేయడంలో సహాయపడుతుంది.
import React, { useState, useCallback, useMemo } from 'react';
function ParentComponent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
console.log(`Button clicked! Count: ${count}`);
setCount(c => c + 1);
}, [count]); // Only recreate the function when 'count' changes
const memoizedButton = useMemo(() => (
), [handleClick]);
return (
Count: {count}
{memoizedButton}
);
}
export default ParentComponent;
ఈ ఉదాహరణలో, useCallback handleClick ఫంక్షన్ను మెమోయిజ్ చేస్తుంది, count స్టేట్ మారినప్పుడు మాత్రమే ఒక కొత్త ఫంక్షన్ సృష్టించబడుతుందని నిర్ధారిస్తుంది. ఇది పేరెంట్ కాంపోనెంట్ రీ-రెండర్ అయిన ప్రతిసారీ బటన్ రీ-రెండర్ కాకుండా చూస్తుంది, అది ఆధారపడే `handleClick` ఫంక్షన్ మారినప్పుడు మాత్రమే. `useMemo` బటన్ను మరింత మెమోయిజ్ చేస్తుంది, `handleClick` ఫంక్షన్ మారినప్పుడు మాత్రమే దానిని రీ-రెండర్ చేస్తుంది.
గ్లోబల్ అప్లికేషన్ ఉదాహరణ: బహుళ ఇన్పుట్ ఫీల్డ్లు మరియు ఒక సబ్మిట్ బటన్తో కూడిన ఒక ఫారమ్ను పరిగణించండి. సబ్మిట్ బటన్ యొక్క ఈవెంట్ హ్యాండ్లర్, ఇది సంక్లిష్టమైన వాలిడేషన్ మరియు డేటా సబ్మిషన్ లాజిక్ను ప్రేరేపించవచ్చు, బటన్ యొక్క అనవసరమైన రీ-రెండర్లను నివారించడానికి useCallback ఉపయోగించి మెమోయిజ్ చేయాలి. ఇతర కాంపోనెంట్లలో తరచుగా స్టేట్ అప్డేట్లతో కూడిన పెద్ద అప్లికేషన్లో ఫారం భాగమైనప్పుడు ఇది ముఖ్యంగా ముఖ్యం.
4. కస్టమ్ ఈక్వాలిటీ ఫంక్షన్లతో రీ-రెండర్లను నియంత్రించడం
కొన్నిసార్లు, React.memoలోని డిఫాల్ట్ రిఫరెన్షియల్ ఈక్వాలిటీ చెక్ సరిపోదు. ఒక కాంపోనెంట్ ఎప్పుడు రీ-రెండర్ అవుతుందో దానిపై మీకు మరింత సూక్ష్మమైన నియంత్రణ అవసరం కావచ్చు. useMemo ఒక సంక్లిష్ట ఆబ్జెక్ట్ యొక్క నిర్దిష్ట ప్రాపర్టీలు మారినప్పుడు మాత్రమే రీ-రెండర్ను ప్రేరేపించే మెమోయిజ్డ్ ప్రాప్ను సృష్టించడానికి ఉపయోగించవచ్చు.
import React, { useState, useMemo } from 'react';
function areEqual(prevProps, nextProps) {
// Custom equality check: only re-render if the 'data' property changes
return prevProps.data.value === nextProps.data.value;
}
function MyComponent({ data }) {
console.log('MyComponent rendered');
return Value: {data.value}
;
}
const MemoizedComponent = React.memo(MyComponent, areEqual);
function App() {
const [value, setValue] = useState(1);
const [otherValue, setOtherValue] = useState(100); // This change won't trigger re-render
const memoizedData = useMemo(() => ({ value }), [value]);
return (
);
}
export default App;
ఈ ఉదాహరణలో, MemoizedComponent ఒక కస్టమ్ ఈక్వాలిటీ ఫంక్షన్ areEqualను ఉపయోగిస్తుంది. data ఆబ్జెక్ట్ యొక్క ఇతర ప్రాపర్టీలు మార్చబడినప్పటికీ, data.value ప్రాపర్టీ మారినప్పుడు మాత్రమే కాంపోనెంట్ రీ-రెండర్ అవుతుంది. `memoizedData` `useMemo` ఉపయోగించి సృష్టించబడింది మరియు దాని విలువ స్టేట్ వేరియబుల్ `value`పై ఆధారపడి ఉంటుంది. ఈ సెటప్ `MemoizedComponent` సంబంధిత డేటా మారినప్పుడు మాత్రమే సమర్థవంతంగా రీ-రెండర్ చేయబడుతుందని నిర్ధారిస్తుంది.
గ్లోబల్ అప్లికేషన్ ఉదాహరణ: లొకేషన్ డేటాను ప్రదర్శించే ఒక మ్యాప్ కాంపోనెంట్ను పరిగణించండి. మీరు లాటిట్యూడ్ లేదా లాంగిట్యూడ్ మారినప్పుడు మాత్రమే మ్యాప్ను రీ-రెండర్ చేయాలనుకోవచ్చు, లొకేషన్తో అనుబంధించబడిన ఇతర మెటాడేటా (ఉదా., వివరణ, ఇమేజ్ URL) అప్డేట్ అయినప్పుడు కాదు. `useMemo`తో కలిపి ఒక కస్టమ్ ఈక్వాలిటీ ఫంక్షన్ ఈ సూక్ష్మ-స్థాయి నియంత్రణను అమలు చేయడానికి ఉపయోగించవచ్చు, మ్యాప్ యొక్క రెండరింగ్ పెర్ఫార్మెన్స్ను ఆప్టిమైజ్ చేస్తుంది, ప్రత్యేకంగా ప్రపంచవ్యాప్తంగా తరచుగా అప్డేట్ అయ్యే లొకేషన్ డేటాతో వ్యవహరించేటప్పుడు.
useMemo ఉపయోగించడానికి ఉత్తమ పద్ధతులు
useMemo ఒక శక్తివంతమైన సాధనం అయినప్పటికీ, దానిని తెలివిగా ఉపయోగించడం ముఖ్యం. గుర్తుంచుకోవలసిన కొన్ని ఉత్తమ పద్ధతులు ఇక్కడ ఉన్నాయి:
- అతిగా ఉపయోగించవద్దు: మెమోయిజేషన్ ఒక ఖర్చుతో వస్తుంది – మెమరీ వాడకం. మీకు ప్రదర్శించదగిన పెర్ఫార్మెన్స్ సమస్య ఉన్నప్పుడు లేదా గణనపరంగా ఖరీదైన ఆపరేషన్లతో వ్యవహరించేటప్పుడు మాత్రమే
useMemoను ఉపయోగించండి. - ఎల్లప్పుడూ ఒక డిపెండెన్సీ అర్రేను చేర్చండి: డిపెండెన్సీ అర్రేను వదిలివేయడం వలన మెమోయిజ్ చేసిన విలువ ప్రతి రెండర్పై తిరిగి లెక్కించబడుతుంది, ఏ పెర్ఫార్మెన్స్ ప్రయోజనాలను అయినా రద్దు చేస్తుంది.
- డిపెండెన్సీ అర్రేను కనిష్టంగా ఉంచండి: గణన ఫలితాన్ని వాస్తవంగా ప్రభావితం చేసే డిపెండెన్సీలను మాత్రమే చేర్చండి. అనవసరమైన డిపెండెన్సీలను చేర్చడం అనవసరమైన పునఃగణనలకు దారితీస్తుంది.
- గణన ఖర్చు vs. మెమోయిజేషన్ ఖర్చును పరిగణించండి: గణన చాలా చౌకగా ఉంటే, మెమోయిజేషన్ యొక్క ఓవర్హెడ్ ప్రయోజనాల కంటే ఎక్కువగా ఉండవచ్చు.
- మీ అప్లికేషన్ను ప్రొఫైల్ చేయండి: పెర్ఫార్మెన్స్ అడ్డంకులను గుర్తించడానికి మరియు
useMemoవాస్తవంగా పెర్ఫార్మెన్స్ను మెరుగుపరుస్తుందో లేదో నిర్ధారించడానికి రియాక్ట్ డెవ్టూల్స్ లేదా ఇతర ప్రొఫైలింగ్ సాధనాలను ఉపయోగించండి. - `React.memo`తో ఉపయోగించండి: ఉత్తమ పెర్ఫార్మెన్స్ కోసం
useMemoనుReact.memoతో జత చేయండి, ప్రత్యేకంగా మెమోయిజ్ చేసిన విలువలను చైల్డ్ కాంపోనెంట్లకు ప్రాప్స్గా పంపేటప్పుడు.React.memoప్రాప్స్ను ఉపరితలంగా పోల్చి, ప్రాప్స్ మారినప్పుడు మాత్రమే కాంపోనెంట్ను రీ-రెండర్ చేస్తుంది.
సాధారణ తప్పులు మరియు వాటిని ఎలా నివారించాలి
అనేక సాధారణ తప్పులు useMemo యొక్క ప్రభావాన్ని దెబ్బతీస్తాయి:
- డిపెండెన్సీ అర్రేను మర్చిపోవడం: ఇది అత్యంత సాధారణ తప్పు. డిపెండెన్సీ అర్రేను మర్చిపోవడం `useMemo`ను ప్రభావవంతంగా ఒక నో-ఆప్గా మారుస్తుంది, ప్రతి రెండర్పై విలువను తిరిగి లెక్కిస్తుంది. పరిష్కారం: మీరు సరైన డిపెండెన్సీ అర్రేను చేర్చారని ఎల్లప్పుడూ రెండుసార్లు తనిఖీ చేసుకోండి.
- అనవసరమైన డిపెండెన్సీలను చేర్చడం: మెమోయిజ్ చేసిన విలువను వాస్తవంగా ప్రభావితం చేయని డిపెండెన్సీలను చేర్చడం అనవసరమైన పునఃగణనలకు కారణమవుతుంది. పరిష్కారం: మీరు మెమోయిజ్ చేస్తున్న ఫంక్షన్ను జాగ్రత్తగా విశ్లేషించండి మరియు దాని అవుట్పుట్ను నేరుగా ప్రభావితం చేసే డిపెండెన్సీలను మాత్రమే చేర్చండి.
- చౌకైన గణనలను మెమోయిజ్ చేయడం: మెమోయిజేషన్కు ఓవర్హెడ్ ఉంటుంది. గణన చాలా చిన్నది అయితే, మెమోయిజేషన్ ఖర్చు ప్రయోజనాల కంటే ఎక్కువగా ఉండవచ్చు. పరిష్కారం: `useMemo` వాస్తవంగా పెర్ఫార్మెన్స్ను మెరుగుపరుస్తుందో లేదో నిర్ధారించడానికి మీ అప్లికేషన్ను ప్రొఫైల్ చేయండి.
- డిపెండెన్సీలను మార్చడం: డిపెండెన్సీలను మార్చడం ఊహించని ప్రవర్తనకు మరియు తప్పు మెమోయిజేషన్కు దారితీస్తుంది. పరిష్కారం: మీ డిపెండెన్సీలను మార్పులేనివిగా పరిగణించండి మరియు మార్పులను నివారించడానికి స్ప్రెడింగ్ లేదా కొత్త ఆబ్జెక్ట్లను సృష్టించడం వంటి టెక్నిక్లను ఉపయోగించండి.
- useMemoపై అతిగా ఆధారపడటం: ప్రతి ఫంక్షన్ లేదా విలువకు గుడ్డిగా `useMemo`ను వర్తింపజేయవద్దు. ఇది పెర్ఫార్మెన్స్పై అత్యంత ముఖ్యమైన ప్రభావాన్ని చూపే ప్రాంతాలపై దృష్టి పెట్టండి.
అధునాతన useMemo టెక్నిక్స్
1. డీప్ ఈక్వాలిటీ చెక్స్తో ఆబ్జెక్ట్లను మెమోయిజ్ చేయడం
కొన్నిసార్లు, డిపెండెన్సీ అర్రేలోని ఆబ్జెక్ట్ల యొక్క ఉపరితల పోలిక సరిపోదు. ఆబ్జెక్ట్ యొక్క ప్రాపర్టీలు మారాయో లేదో నిర్ధారించడానికి మీకు డీప్ ఈక్వాలిటీ చెక్ అవసరం కావచ్చు.
import React, { useMemo } from 'react';
import isEqual from 'lodash/isEqual'; // Requires lodash
function MyComponent({ data }) {
// ...
}
function ParentComponent({ data }) {
const memoizedData = useMemo(() => data, [data, isEqual]);
return ;
}
ఈ ఉదాహరణలో, మేము data ఆబ్జెక్ట్పై డీప్ ఈక్వాలిటీ చెక్ చేయడానికి లోడాష్ లైబ్రరీ నుండి isEqual ఫంక్షన్ను ఉపయోగిస్తాము. data ఆబ్జెక్ట్ యొక్క కంటెంట్లు మారినప్పుడు మాత్రమే memoizedData తిరిగి లెక్కించబడుతుంది, దాని రిఫరెన్స్ మాత్రమే కాదు.
ముఖ్య గమనిక: డీప్ ఈక్వాలిటీ చెక్స్ గణనపరంగా ఖరీదైనవి కావచ్చు. వాటిని అరుదుగా మరియు అవసరమైనప్పుడు మాత్రమే ఉపయోగించండి. ఈక్వాలిటీ చెక్స్ను సరళీకృతం చేయడానికి ప్రత్యామ్నాయ డేటా స్ట్రక్చర్లు లేదా నార్మలైజేషన్ టెక్నిక్లను పరిగణించండి.
2. రెఫ్స్ నుండి తీసుకోబడిన సంక్లిష్ట డిపెండెన్సీలతో useMemo
కొన్ని సందర్భాల్లో, మీరు `useMemo` కోసం డిపెండెన్సీలుగా రియాక్ట్ రెఫ్స్లో ఉన్న విలువలను ఉపయోగించాల్సి రావచ్చు. అయితే, డిపెండెన్సీ అర్రేలో నేరుగా రెఫ్స్ను చేర్చడం ఆశించిన విధంగా పనిచేయదు ఎందుకంటే రెఫ్ ఆబ్జెక్ట్ దాని `current` విలువ మారినప్పటికీ రెండర్ల మధ్య మారదు.
import React, { useRef, useMemo, useState, useEffect } from 'react';
function MyComponent() {
const inputRef = useRef(null);
const [processedValue, setProcessedValue] = useState('');
useEffect(() => {
// Simulate an external change to the input value
setTimeout(() => {
if (inputRef.current) {
inputRef.current.value = 'New Value from External Source';
}
}, 2000);
}, []);
const memoizedProcessedValue = useMemo(() => {
console.log('Processing value...');
const inputValue = inputRef.current ? inputRef.current.value : '';
const processed = inputValue.toUpperCase();
return processed;
}, [inputRef.current ? inputRef.current.value : '']); // Directly accessing ref.current.value
return (
Processed Value: {memoizedProcessedValue}
);
}
export default MyComponent;
ఈ ఉదాహరణలో, మేము డిపెండెన్సీ అర్రేలో నేరుగా inputRef.current.valueను యాక్సెస్ చేస్తాము. ఇది విరుద్ధంగా అనిపించవచ్చు, కానీ ఇది ఇన్పుట్ విలువ మారినప్పుడు `useMemo`ను తిరిగి అంచనా వేయమని బలవంతం చేస్తుంది. రెఫ్ తరచుగా అప్డేట్ అయితే ఇది ఊహించని ప్రవర్తనకు దారితీసే అవకాశం ఉన్నందున ఈ ప్యాట్రన్ను ఉపయోగిస్తున్నప్పుడు జాగ్రత్తగా ఉండండి.
ముఖ్యమైన పరిశీలన: డిపెండెన్సీ అర్రేలో నేరుగా `ref.current`ను యాక్సెస్ చేయడం మీ కోడ్ను అర్థం చేసుకోవడం కష్టతరం చేస్తుంది. డిపెండెన్సీలలో నేరుగా రెఫ్ విలువలపై ఆధారపడకుండా స్టేట్ లేదా ఉత్పన్న డేటాను నిర్వహించడానికి ప్రత్యామ్నాయ మార్గాలు ఉన్నాయో లేదో పరిగణించండి. ఒకవేళ మీ రెఫ్ విలువ ఒక కాల్బ్యాక్లో మారితే, మరియు మీరు ఆ మార్పు ఆధారంగా మెమోయిజ్ చేసిన గణనను తిరిగి అమలు చేయవలసి వస్తే, ఈ విధానం చెల్లుబాటు కావచ్చు.
ముగింపు
useMemo అనేది రియాక్ట్లో గణనపరంగా ఖరీదైన గణనలను మెమోయిజ్ చేయడం మరియు రిఫరెన్షియల్ ఈక్వాలిటీని నిర్వహించడం ద్వారా పెర్ఫార్మెన్స్ను ఆప్టిమైజ్ చేయడానికి ఒక విలువైన సాధనం. అయితే, దాని సూక్ష్మ నైపుణ్యాలను అర్థం చేసుకోవడం మరియు దానిని తెలివిగా ఉపయోగించడం చాలా ముఖ్యం. ఈ గైడ్లో వివరించిన ఉత్తమ పద్ధతులను అనుసరించడం మరియు సాధారణ తప్పులను నివారించడం ద్వారా, మీరు గ్లోబల్ ప్రేక్షకుల కోసం సమర్థవంతమైన మరియు రెస్పాన్సివ్ రియాక్ట్ అప్లికేషన్లను రూపొందించడానికి useMemoను సమర్థవంతంగా ఉపయోగించుకోవచ్చు. పెర్ఫార్మెన్స్ అడ్డంకులను గుర్తించడానికి మరియు useMemo వాస్తవంగా ఆశించిన ప్రయోజనాలను అందిస్తుందని నిర్ధారించుకోవడానికి మీ అప్లికేషన్ను ఎల్లప్పుడూ ప్రొఫైల్ చేయాలని గుర్తుంచుకోండి.
గ్లోబల్ ప్రేక్షకుల కోసం అభివృద్ధి చేసేటప్పుడు, విభిన్న నెట్వర్క్ వేగాలు మరియు పరికర సామర్థ్యాలు వంటి అంశాలను పరిగణించండి. అటువంటి దృశ్యాలలో పెర్ఫార్మెన్స్ను ఆప్టిమైజ్ చేయడం మరింత కీలకం. useMemo మరియు ఇతర పెర్ఫార్మెన్స్ ఆప్టిమైజేషన్ టెక్నిక్లలో నైపుణ్యం సాధించడం ద్వారా, మీరు ప్రపంచవ్యాప్తంగా ఉన్న యూజర్లకు సున్నితమైన మరియు ఆనందించే యూజర్ అనుభవాన్ని అందించగలరు.