કોન્ટેક્સ્ટ API વડે સિલેક્ટિવ રી-રેન્ડરિંગને સમજીને અને અમલમાં મૂકીને તમારી રિએક્ટ એપ્લિકેશન્સમાં શ્રેષ્ઠ પ્રદર્શન મેળવો. વૈશ્વિક વિકાસ ટીમો માટે આવશ્યક.
રિએક્ટ કોન્ટેક્સ્ટ ઓપ્ટિમાઇઝેશન: વૈશ્વિક પ્રદર્શન માટે સિલેક્ટિવ રી-રેન્ડરિંગમાં નિપુણતા
આધુનિક વેબ ડેવલપમેન્ટના ગતિશીલ પરિદ્રશ્યમાં, કાર્યક્ષમ અને સ્કેલેબલ રિએક્ટ એપ્લિકેશન્સ બનાવવી સર્વોપરી છે. જેમ જેમ એપ્લિકેશન્સની જટિલતા વધે છે, તેમ તેમ સ્ટેટ મેનેજ કરવું અને કાર્યક્ષમ અપડેટ્સ સુનિશ્ચિત કરવા એ એક મોટો પડકાર બની જાય છે, ખાસ કરીને વૈશ્વિક વિકાસ ટીમો માટે જે વિવિધ ઇન્ફ્રાસ્ટ્રક્ચર અને વપરાશકર્તા આધાર પર કામ કરે છે. રિએક્ટ કોન્ટેક્સ્ટ API ગ્લોબલ સ્ટેટ મેનેજમેન્ટ માટે એક શક્તિશાળી ઉકેલ પૂરો પાડે છે, જે તમને પ્રોપ ડ્રિલિંગ ટાળવા અને તમારા કમ્પોનન્ટ ટ્રીમાં ડેટા શેર કરવાની મંજૂરી આપે છે. જોકે, યોગ્ય ઓપ્ટિમાઇઝેશન વિના, તે અજાણતાં બિનજરૂરી રી-રેન્ડર્સ દ્વારા પ્રદર્શનમાં અવરોધો તરફ દોરી શકે છે.
આ વ્યાપક માર્ગદર્શિકા રિએક્ટ કોન્ટેક્સ્ટ ઓપ્ટિમાઇઝેશનની જટિલતાઓમાં ઊંડાણપૂર્વક ઉતરશે, ખાસ કરીને સિલેક્ટિવ રી-રેન્ડરિંગ માટેની તકનીકો પર ધ્યાન કેન્દ્રિત કરશે. અમે કોન્ટેક્સ્ટ સંબંધિત પ્રદર્શન સમસ્યાઓને કેવી રીતે ઓળખવી, અંતર્ગત મિકેનિઝમ્સને સમજવું, અને તમારી રિએક્ટ એપ્લિકેશન્સ વિશ્વભરના વપરાશકર્તાઓ માટે ઝડપી અને પ્રતિભાવશીલ રહે તે સુનિશ્ચિત કરવા માટે શ્રેષ્ઠ પ્રથાઓનો અમલ કેવી રીતે કરવો તે શોધીશું.
પડકારને સમજવું: બિનજરૂરી રી-રેન્ડર્સની કિંમત
રિએક્ટનો ઘોષણાત્મક સ્વભાવ UI ને અસરકારક રીતે અપડેટ કરવા માટે તેના વર્ચ્યુઅલ DOM પર આધાર રાખે છે. જ્યારે કોઈ કમ્પોનન્ટની સ્ટેટ અથવા પ્રોપ્સ બદલાય છે, ત્યારે રિએક્ટ તે કમ્પોનન્ટ અને તેના ચિલ્ડ્રનને ફરીથી રેન્ડર કરે છે. જ્યારે આ મિકેનિઝમ સામાન્ય રીતે કાર્યક્ષમ હોય છે, ત્યારે અતિશય અથવા બિનજરૂરી રી-રેન્ડર્સ સુસ્ત વપરાશકર્તા અનુભવ તરફ દોરી શકે છે. આ ખાસ કરીને મોટા કમ્પોનન્ટ ટ્રીવાળી એપ્લિકેશન્સ અથવા જે વારંવાર અપડેટ થાય છે તેમના માટે સાચું છે.
કોન્ટેક્સ્ટ API, સ્ટેટ મેનેજમેન્ટ માટે વરદાન હોવા છતાં, ક્યારેક આ સમસ્યાને વધારી શકે છે. જ્યારે કોન્ટેક્સ્ટ દ્વારા પૂરી પાડવામાં આવેલી વેલ્યુ અપડેટ થાય છે, ત્યારે તે કોન્ટેક્સ્ટનો ઉપયોગ કરતા તમામ કમ્પોનન્ટ્સ સામાન્ય રીતે ફરીથી રેન્ડર થશે, ભલે તેઓ કોન્ટેક્સ્ટ વેલ્યુના માત્ર નાના, અપરિવર્તનશીલ ભાગમાં જ રસ ધરાવતા હોય. એવી વૈશ્વિક એપ્લિકેશનની કલ્પના કરો જે વપરાશકર્તાની પસંદગીઓ, થીમ સેટિંગ્સ અને સક્રિય સૂચનાઓને એક જ કોન્ટેક્સ્ટમાં મેનેજ કરે છે. જો માત્ર સૂચનાઓની સંખ્યા બદલાય છે, તો સ્થિર ફૂટર દર્શાવતું કમ્પોનન્ટ હજુ પણ બિનજરૂરી રીતે ફરીથી રેન્ડર થઈ શકે છે, જે મૂલ્યવાન પ્રોસેસિંગ પાવરનો વ્યય કરે છે.
`useContext` હૂકની ભૂમિકા
useContext
હૂક એ પ્રાથમિક રીત છે જેના દ્વારા ફંક્શનલ કમ્પોનન્ટ્સ કોન્ટેક્સ્ટ ફેરફારોને સબ્સ્ક્રાઇબ કરે છે. આંતરિક રીતે, જ્યારે કોઈ કમ્પોનન્ટ useContext(MyContext)
ને કૉલ કરે છે, ત્યારે રિએક્ટ તે કમ્પોનન્ટને ટ્રીમાં તેની ઉપરના સૌથી નજીકના MyContext.Provider
પર સબ્સ્ક્રાઇબ કરે છે. જ્યારે MyContext.Provider
દ્વારા પૂરી પાડવામાં આવેલી વેલ્યુ બદલાય છે, ત્યારે રિએક્ટ useContext
નો ઉપયોગ કરીને MyContext
નો ઉપયોગ કરનારા તમામ કમ્પોનન્ટ્સને ફરીથી રેન્ડર કરે છે.
આ ડિફોલ્ટ વર્તન, સીધુંસાદું હોવા છતાં, તેમાં સૂક્ષ્મતાનો અભાવ છે. તે કોન્ટેક્સ્ટ વેલ્યુના જુદા જુદા ભાગો વચ્ચે ભેદ પાડતું નથી. અહીં જ ઓપ્ટિમાઇઝેશનની જરૂરિયાત ઊભી થાય છે.
રિએક્ટ કોન્ટેક્સ્ટ સાથે સિલેક્ટિવ રી-રેન્ડરિંગ માટેની વ્યૂહરચનાઓ
સિલેક્ટિવ રી-રેન્ડરિંગનો ધ્યેય એ સુનિશ્ચિત કરવાનો છે કે જ્યારે કોન્ટેક્સ્ટના સ્ટેટનો કોઈ ચોક્કસ ભાગ બદલાય ત્યારે ફક્ત તે જ કમ્પોનન્ટ્સ ફરીથી રેન્ડર થાય જે *ખરેખર* તે ભાગ પર આધાર રાખે છે. આ હાંસલ કરવા માટે ઘણી વ્યૂહરચનાઓ મદદ કરી શકે છે:
1. કોન્ટેક્સ્ટ્સનું વિભાજન
બિનજરૂરી રી-રેન્ડર્સનો સામનો કરવાની સૌથી અસરકારક રીતોમાંની એક એ છે કે મોટા, એકીકૃત કોન્ટેક્સ્ટ્સને નાના, વધુ કેન્દ્રિત કોન્ટેક્સ્ટ્સમાં વિભાજીત કરવા. જો તમારી એપ્લિકેશનમાં એક જ કોન્ટેક્સ્ટ સ્ટેટના વિવિધ અસંબંધિત ટુકડાઓ (દા.ત., વપરાશકર્તા ઓથેન્ટિકેશન, થીમ અને શોપિંગ કાર્ટ ડેટા)નું સંચાલન કરે છે, તો તેને અલગ-અલગ કોન્ટેક્સ્ટ્સમાં વિભાજીત કરવાનું વિચારો.
ઉદાહરણ:
// પહેલાં: એક મોટો કોન્ટેક્સ્ટ
const AppContext = React.createContext();
// પછી: બહુવિધ કોન્ટેક્સ્ટ્સમાં વિભાજિત
const AuthContext = React.createContext();
const ThemeContext = React.createContext();
const CartContext = React.createContext();
કોન્ટેક્સ્ટ્સને વિભાજીત કરીને, જે કમ્પોનન્ટ્સને માત્ર ઓથેન્ટિકેશન વિગતોની જરૂર હોય તે ફક્ત AuthContext
પર સબ્સ્ક્રાઇબ કરશે. જો થીમ બદલાય છે, તો AuthContext
અથવા CartContext
પર સબ્સ્ક્રાઇબ થયેલા કમ્પોનન્ટ્સ ફરીથી રેન્ડર થશે નહીં. આ અભિગમ ખાસ કરીને વૈશ્વિક એપ્લિકેશન્સ માટે મૂલ્યવાન છે જ્યાં વિવિધ મોડ્યુલોમાં અલગ-અલગ સ્ટેટ નિર્ભરતાઓ હોઈ શકે છે.
2. `React.memo` સાથે મેમોઇઝેશન
React.memo
એ એક હાયર-ઓર્ડર કમ્પોનન્ટ (HOC) છે જે તમારા ફંક્શનલ કમ્પોનન્ટને મેમોઇઝ કરે છે. તે કમ્પોનન્ટના પ્રોપ્સ અને સ્ટેટની છીછરી સરખામણી કરે છે. જો પ્રોપ્સ અને સ્ટેટ બદલાયા ન હોય, તો રિએક્ટ કમ્પોનન્ટને રેન્ડર કરવાનું છોડી દે છે અને છેલ્લા રેન્ડર થયેલા પરિણામનો ફરીથી ઉપયોગ કરે છે. જ્યારે કોન્ટેક્સ્ટ સાથે જોડવામાં આવે ત્યારે આ શક્તિશાળી છે.
જ્યારે કોઈ કમ્પોનન્ટ કોન્ટેક્સ્ટ વેલ્યુનો ઉપયોગ કરે છે, ત્યારે તે વેલ્યુ કમ્પોનન્ટ માટે એક પ્રોપ બની જાય છે (કાલ્પનિક રીતે, જ્યારે મેમોઇઝ્ડ કમ્પોનન્ટની અંદર useContext
નો ઉપયોગ કરવામાં આવે છે). જો કોન્ટેક્સ્ટ વેલ્યુ પોતે બદલાતી નથી (અથવા જો કોન્ટેક્સ્ટ વેલ્યુનો જે ભાગ કમ્પોનન્ટ વાપરે છે તે બદલાતો નથી), તો React.memo
રી-રેન્ડરને રોકી શકે છે.
ઉદાહરણ:
// કોન્ટેક્સ્ટ પ્રોવાઇડર
const MyContext = React.createContext();
function MyContextProvider({ children }) {
const [value, setValue] = React.useState('initial value');
return (
<MyContext.Provider value={{ value, setValue }}>
{children}
</MyContext.Provider>
);
}
// કોન્ટેક્સ્ટનો ઉપયોગ કરતું કમ્પોનન્ટ
const DisplayComponent = React.memo(() => {
const { value } = React.useContext(MyContext);
console.log('DisplayComponent rendered');
return <div>The value is: {value}</div>;
});
// બીજું કમ્પોનન્ટ
const UpdateButton = () => {
const { setValue } = React.useContext(MyContext);
return <button onClick={() => setValue('new value')}>Update Value</button>;
};
// એપ્લિકેશન માળખું
function App() {
return (
<MyContextProvider>
<DisplayComponent />
<UpdateButton />
</MyContextProvider>
);
}
આ ઉદાહરણમાં, જો ફક્ત setValue
અપડેટ થાય છે (દા.ત., બટન પર ક્લિક કરીને), તો DisplayComponent
, ભલે તે કોન્ટેક્સ્ટનો ઉપયોગ કરતું હોય, જો તેને React.memo
માં લપેટવામાં આવ્યું હોય અને value
પોતે બદલાયું ન હોય તો તે ફરીથી રેન્ડર થશે નહીં. આ કામ કરે છે કારણ કે React.memo
પ્રોપ્સની છીછરી સરખામણી કરે છે. જ્યારે મેમોઇઝ્ડ કમ્પોનન્ટની અંદર useContext
ને કૉલ કરવામાં આવે છે, ત્યારે તેનું રિટર્ન વેલ્યુ મેમોઇઝેશનના હેતુઓ માટે અસરકારક રીતે પ્રોપ તરીકે ગણવામાં આવે છે. જો કોન્ટેક્સ્ટ વેલ્યુ રેન્ડર્સ વચ્ચે બદલાતી નથી, તો કમ્પોનન્ટ ફરીથી રેન્ડર થશે નહીં.
ચેતવણી: React.memo
છીછરી સરખામણી કરે છે. જો તમારી કોન્ટેક્સ્ટ વેલ્યુ ઓબ્જેક્ટ અથવા એરે છે, અને પ્રોવાઇડરના દરેક રેન્ડર પર નવો ઓબ્જેક્ટ/એરે બનાવવામાં આવે છે (ભલે સામગ્રી સમાન હોય), તો React.memo
રી-રેન્ડર્સને અટકાવશે નહીં. આ આપણને આગામી ઓપ્ટિમાઇઝેશન વ્યૂહરચના તરફ દોરી જાય છે.
3. કોન્ટેક્સ્ટ વેલ્યુઝનું મેમોઇઝિંગ
React.memo
અસરકારક છે તેની ખાતરી કરવા માટે, તમારે પ્રોવાઇડરના દરેક રેન્ડર પર તમારી કોન્ટેક્સ્ટ વેલ્યુ માટે નવા ઓબ્જેક્ટ અથવા એરે સંદર્ભોનું નિર્માણ અટકાવવાની જરૂર છે, સિવાય કે તેમની અંદરનો ડેટા ખરેખર બદલાયો હોય. અહીં જ useMemo
હૂક કામમાં આવે છે.
ઉદાહરણ:
// મેમોઇઝ્ડ વેલ્યુ સાથે કોન્ટેક્સ્ટ પ્રોવાઇડર
function MyContextProvider({ children }) {
const [user, setUser] = React.useState({ name: 'Alice' });
const [theme, setTheme] = React.useState('light');
// કોન્ટેક્સ્ટ વેલ્યુ ઓબ્જેક્ટને મેમોઇઝ કરો
const contextValue = React.useMemo(() => ({
user,
theme
}), [user, theme]);
return (
<MyContext.Provider value={contextValue}>
{children}
</MyContext.Provider>
);
}
// કમ્પોનન્ટ જેને માત્ર યુઝર ડેટાની જરૂર છે
const UserProfile = React.memo(() => {
const { user } = React.useContext(MyContext);
console.log('UserProfile rendered');
return <div>User: {user.name}</div>;
});
// કમ્પોનન્ટ જેને માત્ર થીમ ડેટાની જરૂર છે
const ThemeDisplay = React.memo(() => {
const { theme } = React.useContext(MyContext);
console.log('ThemeDisplay rendered');
return <div>Theme: {theme}</div>;
});
// કમ્પોનન્ટ જે યુઝરને અપડેટ કરી શકે છે
const UpdateUserButton = () => {
const { setUser } = React.useContext(MyContext);
return <button onClick={() => setUser({ name: 'Bob' })}>Update User</button>;
};
// એપ્લિકેશન માળખું
function App() {
return (
<MyContextProvider>
<UserProfile />
<ThemeDisplay />
<UpdateUserButton />
</MyContextProvider>
);
}
આ ઉન્નત ઉદાહરણમાં:
contextValue
ઓબ્જેક્ટuseMemo
નો ઉપયોગ કરીને બનાવવામાં આવ્યો છે. તે ફક્ત ત્યારે જ ફરીથી બનાવવામાં આવશે જોuser
અથવાtheme
સ્ટેટ બદલાય.UserProfile
સમગ્રcontextValue
નો ઉપયોગ કરે છે પરંતુ ફક્તuser
ને બહાર કાઢે છે. જોtheme
બદલાય પણuser
નહીં, તોcontextValue
ઓબ્જેક્ટ ફરીથી બનાવવામાં આવશે (ડિપેન્ડન્સી એરેને કારણે), અનેUserProfile
ફરીથી રેન્ડર થશે.ThemeDisplay
એ જ રીતે કોન્ટેક્સ્ટનો ઉપયોગ કરે છે અનેtheme
ને બહાર કાઢે છે. જોuser
બદલાય પણtheme
નહીં, તોUserProfile
ફરીથી રેન્ડર થશે.
આ હજી પણ કોન્ટેક્સ્ટ વેલ્યુના *ભાગો* પર આધારિત સિલેક્ટિવ રી-રેન્ડરિંગ પ્રાપ્ત કરતું નથી. આગામી વ્યૂહરચના આનો સીધો ઉકેલ લાવે છે.
4. સિલેક્ટિવ કોન્ટેક્સ્ટ કન્ઝમ્પશન માટે કસ્ટમ હુક્સનો ઉપયોગ કરવો
સિલેક્ટિવ રી-રેન્ડરિંગ હાંસલ કરવાની સૌથી શક્તિશાળી પદ્ધતિમાં કસ્ટમ હુક્સ બનાવવાનો સમાવેશ થાય છે જે useContext
કૉલને એબ્સ્ટ્રેક્ટ કરે છે અને પસંદગીપૂર્વક કોન્ટેક્સ્ટ વેલ્યુના ભાગો પરત કરે છે. આ કસ્ટમ હુક્સને પછી React.memo
સાથે જોડી શકાય છે.
મુખ્ય વિચાર એ છે કે અલગ-અલગ હુક્સ દ્વારા તમારા કોન્ટેક્સ્ટમાંથી સ્ટેટના વ્યક્તિગત ટુકડાઓ અથવા સિલેક્ટર્સને એક્સપોઝ કરવાનો છે. આ રીતે, એક કમ્પોનન્ટ ફક્ત તેને જરૂરી ડેટાના ચોક્કસ ભાગ માટે useContext
ને કૉલ કરે છે, અને મેમોઇઝેશન વધુ અસરકારક રીતે કાર્ય કરે છે.
ઉદાહરણ:
// --- કોન્ટેક્સ્ટ સેટઅપ ---
const AppStateContext = React.createContext();
function AppStateProvider({ children }) {
const [user, setUser] = React.useState({ name: 'Alice' });
const [theme, setTheme] = React.useState('light');
const [notifications, setNotifications] = React.useState([]);
// જો કંઇ ન બદલાય તો સ્થિર સંદર્ભ સુનિશ્ચિત કરવા માટે સમગ્ર કોન્ટેક્સ્ટ વેલ્યુને મેમોઇઝ કરો
const contextValue = React.useMemo(() => ({
user,
theme,
notifications,
setUser,
setTheme,
setNotifications
}), [user, theme, notifications]);
return (
<AppStateContext.Provider value={contextValue}>
{children}
</AppStateContext.Provider>
);
}
// --- સિલેક્ટિવ કન્ઝમ્પશન માટે કસ્ટમ હુક્સ ---
// વપરાશકર્તા-સંબંધિત સ્ટેટ અને ક્રિયાઓ માટે હૂક
function useUser() {
const { user, setUser } = React.useContext(AppStateContext);
// અહીં, અમે એક ઓબ્જેક્ટ પરત કરીએ છીએ. જો React.memo કન્ઝ્યુમિંગ કમ્પોનન્ટ પર લાગુ કરવામાં આવે છે,
// અને 'user' ઓબ્જેક્ટ પોતે (તેની સામગ્રી) બદલાતી નથી, તો કમ્પોનન્ટ ફરીથી રેન્ડર થશે નહીં.
// જો આપણે વધુ સૂક્ષ્મ બનવાની જરૂર હોય અને જ્યારે ફક્ત setUser બદલાય ત્યારે રી-રેન્ડર્સ ટાળવા હોય,
// તો આપણે વધુ સાવચેત રહેવાની અથવા કોન્ટેક્સ્ટને વધુ વિભાજિત કરવાની જરૂર પડશે.
return { user, setUser };
}
// થીમ-સંબંધિત સ્ટેટ અને ક્રિયાઓ માટે હૂક
function useTheme() {
const { theme, setTheme } = React.useContext(AppStateContext);
return { theme, setTheme };
}
// સૂચનાઓ-સંબંધિત સ્ટેટ અને ક્રિયાઓ માટે હૂક
function useNotifications() {
const { notifications, setNotifications } = React.useContext(AppStateContext);
return { notifications, setNotifications };
}
// --- કસ્ટમ હુક્સનો ઉપયોગ કરતા મેમોઇઝ્ડ કમ્પોનન્ટ્સ ---
const UserProfile = React.memo(() => {
const { user } = useUser(); // કસ્ટમ હૂકનો ઉપયોગ કરે છે
console.log('UserProfile rendered');
return <div>User: {user.name}</div>;
});
const ThemeDisplay = React.memo(() => {
const { theme } = useTheme(); // કસ્ટમ હૂકનો ઉપયોગ કરે છે
console.log('ThemeDisplay rendered');
return <div>Theme: {theme}</div>;
});
const NotificationCount = React.memo(() => {
const { notifications } = useNotifications(); // કસ્ટમ હૂકનો ઉપયોગ કરે છે
console.log('NotificationCount rendered');
return <div>Notifications: {notifications.length}</div>;
});
// કમ્પોનન્ટ જે થીમ અપડેટ કરે છે
const ThemeSwitcher = React.memo(() => {
const { setTheme } = useTheme();
console.log('ThemeSwitcher rendered');
return (
<button onClick={() => setTheme(prev => prev === 'light' ? 'dark' : 'light')}>
Toggle Theme
</button>
);
});
// એપ્લિકેશન માળખું
function App() {
return (
<AppStateProvider>
<UserProfile />
<ThemeDisplay />
<NotificationCount />
<ThemeSwitcher />
{/* તેની આઇસોલેશન ચકાસવા માટે સૂચનાઓ અપડેટ કરવા માટે બટન ઉમેરો */}
<button onClick={() => {
const { setNotifications } = {
// વાસ્તવિક એપ્લિકેશનમાં, આ કોન્ટેક્સ્ટમાંથી આવશે, કદાચ બીજા હૂક દ્વારા
setNotifications: (val) => console.log('સૂચનાઓ સેટ કરી રહ્યાં છીએ:', val)
};
setNotifications(prev => [...prev, 'New notification'])
}}>Add Notification</button>
</AppStateProvider>
);
}
આ સેટઅપમાં:
UserProfile
useUser
નો ઉપયોગ કરે છે. તે ફક્ત ત્યારે જ ફરીથી રેન્ડર થશે જોuser
ઓબ્જેક્ટ પોતે જ તેનો સંદર્ભ બદલે (જેમાં પ્રોવાઇડરમાંuseMemo
મદદ કરે છે).ThemeDisplay
useTheme
નો ઉપયોગ કરે છે અને ફક્ત ત્યારે જ ફરીથી રેન્ડર થશે જોtheme
વેલ્યુ બદલાય.NotificationCount
useNotifications
નો ઉપયોગ કરે છે અને ફક્ત ત્યારે જ ફરીથી રેન્ડર થશે જોnotifications
એરે બદલાય.- જ્યારે
ThemeSwitcher
setTheme
ને કૉલ કરે છે, ત્યારે ફક્તThemeDisplay
અને સંભવતઃThemeSwitcher
પોતે (જો તે તેની પોતાની સ્ટેટ અથવા પ્રોપ ફેરફારોને કારણે ફરીથી રેન્ડર થાય છે) ફરીથી રેન્ડર થશે.UserProfile
અનેNotificationCount
, જે થીમ પર આધાર રાખતા નથી, તે નહીં થાય. - તેવી જ રીતે, જો સૂચનાઓ અપડેટ કરવામાં આવી હોય, તો ફક્ત
NotificationCount
જ ફરીથી રેન્ડર થશે (એમ માનીને કેsetNotifications
યોગ્ય રીતે કૉલ કરવામાં આવે છે અનેnotifications
એરે સંદર્ભ બદલાય છે).
કોન્ટેક્સ્ટ ડેટાના દરેક ભાગ માટે દાણાદાર કસ્ટમ હુક્સ બનાવવાની આ પેટર્ન મોટા પાયે, વૈશ્વિક રિએક્ટ એપ્લિકેશન્સમાં રી-રેન્ડર્સને ઓપ્ટિમાઇઝ કરવા માટે અત્યંત અસરકારક છે.
5. `useContextSelector` નો ઉપયોગ (થર્ડ-પાર્ટી લાઇબ્રેરીઓ)
જ્યારે રિએક્ટ રી-રેન્ડર્સને ટ્રિગર કરવા માટે કોન્ટેક્સ્ટ વેલ્યુના ચોક્કસ ભાગોને પસંદ કરવા માટે બિલ્ટ-ઇન સોલ્યુશન ઓફર કરતું નથી, ત્યારે use-context-selector
જેવી થર્ડ-પાર્ટી લાઇબ્રેરીઓ આ કાર્યક્ષમતા પૂરી પાડે છે. આ લાઇબ્રેરી તમને કોન્ટેક્સ્ટના અન્ય ભાગો બદલાય તો રી-રેન્ડર કર્યા વિના કોન્ટેક્સ્ટમાં ચોક્કસ વેલ્યુઝ પર સબ્સ્ક્રાઇબ કરવાની મંજૂરી આપે છે.
use-context-selector
સાથેનું ઉદાહરણ:
// ઇન્સ્ટોલ કરો: npm install use-context-selector
import { createContext } from 'react';
import { useContextSelector } from 'use-context-selector';
const UserContext = createContext();
function UserProvider({ children }) {
const [user, setUser] = React.useState({ name: 'Alice', age: 30 });
// જો કંઇ ન બદલાય તો સ્થિરતા સુનિશ્ચિત કરવા માટે કોન્ટેક્સ્ટ વેલ્યુને મેમોઇઝ કરો
const contextValue = React.useMemo(() => ({
user,
setUser
}), [user]);
return (
<UserContext.Provider value={contextValue}>
{children}
</UserContext.Provider>
);
}
// કમ્પોનન્ટ જેને ફક્ત વપરાશકર્તાના નામની જરૂર છે
const UserNameDisplay = () => {
const userName = useContextSelector(UserContext, context => context.user.name);
console.log('UserNameDisplay rendered');
return <div>User Name: {userName}</div>;
};
// કમ્પોનન્ટ જેને ફક્ત વપરાશકર્તાની ઉંમરની જરૂર છે
const UserAgeDisplay = () => {
const userAge = useContextSelector(UserContext, context => context.user.age);
console.log('UserAgeDisplay rendered');
return <div>User Age: {userAge}</div>;
};
// વપરાશકર્તાને અપડેટ કરવા માટેનું કમ્પોનન્ટ
const UpdateUserButton = () => {
const setUser = useContextSelector(UserContext, context => context.setUser);
return (
<button onClick={() => setUser({ name: 'Bob', age: 25 })}>Update User</button>
);
};
// એપ્લિકેશન માળખું
function App() {
return (
<UserProvider>
<UserNameDisplay />
<UserAgeDisplay />
<UpdateUserButton />
</UserProvider>
);
}
use-context-selector
સાથે:
UserNameDisplay
ફક્તuser.name
પ્રોપર્ટી પર સબ્સ્ક્રાઇબ કરે છે.UserAgeDisplay
ફક્તuser.age
પ્રોપર્ટી પર સબ્સ્ક્રાઇબ કરે છે.- જ્યારે
UpdateUserButton
પર ક્લિક કરવામાં આવે છે, અનેsetUser
ને નવા વપરાશકર્તા ઓબ્જેક્ટ સાથે કૉલ કરવામાં આવે છે જેમાં અલગ નામ અને ઉંમર બંને હોય છે, ત્યારેUserNameDisplay
અનેUserAgeDisplay
બંને ફરીથી રેન્ડર થશે કારણ કે પસંદ કરેલ વેલ્યુઝ બદલાઈ ગઈ છે. - જોકે, જો તમારી પાસે થીમ માટે અલગ પ્રોવાઇડર હોત, અને ફક્ત થીમ બદલાય, તો
UserNameDisplay
કેUserAgeDisplay
બંનેમાંથી કોઈ પણ ફરીથી રેન્ડર થશે નહીં, જે સાચી સિલેક્ટિવ સબ્સ્ક્રિપ્શન દર્શાવે છે.
આ લાઇબ્રેરી કોન્ટેક્સ્ટ API માં સિલેક્ટર-આધારિત સ્ટેટ મેનેજમેન્ટ (જેમ કે Redux અથવા Zustand માં) ના ફાયદાઓ અસરકારક રીતે લાવે છે, જે અત્યંત દાણાદાર અપડેટ્સ માટે પરવાનગી આપે છે.
વૈશ્વિક રિએક્ટ કોન્ટેક્સ્ટ ઓપ્ટિમાઇઝેશન માટે શ્રેષ્ઠ પ્રથાઓ
જ્યારે વૈશ્વિક પ્રેક્ષકો માટે એપ્લિકેશન્સ બનાવતી વખતે, પ્રદર્શનની બાબતોને વધુ મહત્વ આપવામાં આવે છે. નેટવર્ક લેટન્સી, વિવિધ ઉપકરણ ક્ષમતાઓ, અને બદલાતી ઇન્ટરનેટ ગતિનો અર્થ એ છે કે દરેક બિનજરૂરી ઓપરેશન ગણાય છે.
- તમારી એપ્લિકેશનનું પ્રોફાઇલ કરો: ઓપ્ટિમાઇઝ કરતા પહેલા, કયા કમ્પોનન્ટ્સ બિનજરૂરી રીતે ફરીથી રેન્ડર થઈ રહ્યા છે તે ઓળખવા માટે રિએક્ટ ડેવલપર ટૂલ્સ પ્રોફાઇલરનો ઉપયોગ કરો. આ તમારા ઓપ્ટિમાઇઝેશન પ્રયત્નોને માર્ગદર્શન આપશે.
- કોન્ટેક્સ્ટ વેલ્યુઝને સ્થિર રાખો: નવા ઓબ્જેક્ટ/એરે સંદર્ભોને કારણે થતા અજાણતાં રી-રેન્ડર્સને રોકવા માટે હંમેશા તમારા પ્રોવાઇડરમાં
useMemo
નો ઉપયોગ કરીને કોન્ટેક્સ્ટ વેલ્યુઝને મેમોઇઝ કરો. - દાણાદાર કોન્ટેક્સ્ટ્સ: મોટા, સર્વસમાવેશક કોન્ટેક્સ્ટ્સ કરતાં નાના, વધુ કેન્દ્રિત કોન્ટેક્સ્ટ્સને પ્રાધાન્ય આપો. આ સિંગલ રિસ્પોન્સિબિલિટીના સિદ્ધાંત સાથે સુસંગત છે અને રી-રેન્ડર આઇસોલેશન સુધારે છે.
- `React.memo` નો વ્યાપક ઉપયોગ કરો: જે કમ્પોનન્ટ્સ કોન્ટેક્સ્ટનો ઉપયોગ કરે છે અને જે વારંવાર રેન્ડર થવાની સંભાવના છે તેને
React.memo
સાથે લપેટો. - કસ્ટમ હુક્સ તમારા મિત્રો છે: કસ્ટમ હુક્સની અંદર
useContext
કૉલ્સને એન્કેપ્સ્યુલેટ કરો. આ ફક્ત કોડ સંગઠનને સુધારતું નથી પરંતુ ચોક્કસ કોન્ટેક્સ્ટ ડેટાનો ઉપયોગ કરવા માટે એક સ્વચ્છ ઇન્ટરફેસ પણ પ્રદાન કરે છે. - કોન્ટેક્સ્ટ વેલ્યુઝમાં ઇનલાઇન ફંક્શન્સ ટાળો: જો તમારી કોન્ટેક્સ્ટ વેલ્યુમાં કૉલબેક ફંક્શન્સ શામેલ હોય, તો તેમને
useCallback
સાથે મેમોઇઝ કરો જેથી પ્રોવાઇડર ફરીથી રેન્ડર થાય ત્યારે તેનો ઉપયોગ કરતા કમ્પોનન્ટ્સ બિનજરૂરી રીતે ફરીથી રેન્ડર થતા અટકે. - જટિલ એપ્લિકેશન્સ માટે સ્ટેટ મેનેજમેન્ટ લાઇબ્રેરીઓનો વિચાર કરો: ખૂબ મોટી અથવા જટિલ એપ્લિકેશન્સ માટે, Zustand, Jotai, અથવા Redux Toolkit જેવી સમર્પિત સ્ટેટ મેનેજમેન્ટ લાઇબ્રેરીઓ વૈશ્વિક ટીમો માટે વધુ મજબૂત બિલ્ટ-ઇન પ્રદર્શન ઓપ્ટિમાઇઝેશન અને ડેવલપર ટૂલિંગ ઓફર કરી શકે છે. જોકે, આ લાઇબ્રેરીઓનો ઉપયોગ કરતી વખતે પણ, કોન્ટેક્સ્ટ ઓપ્ટિમાઇઝેશનને સમજવું પાયાનું છે.
- વિવિધ પરિસ્થિતિઓમાં પરીક્ષણ કરો: ધીમી નેટવર્ક પરિસ્થિતિઓનું અનુકરણ કરો અને ઓછા શક્તિશાળી ઉપકરણો પર પરીક્ષણ કરો જેથી ખાતરી થાય કે તમારા ઓપ્ટિમાઇઝેશન વૈશ્વિક સ્તરે અસરકારક છે.
કોન્ટેક્સ્ટને ક્યારે ઓપ્ટિમાઇઝ કરવું
સમય પહેલાં વધુ પડતું ઓપ્ટિમાઇઝ ન કરવું તે મહત્વનું છે. કોન્ટેક્સ્ટ ઘણી એપ્લિકેશન્સ માટે પૂરતું હોય છે. તમારે તમારા કોન્ટેક્સ્ટના ઉપયોગને ઓપ્ટિમાઇઝ કરવાનું વિચારવું જોઈએ જ્યારે:
- તમે પ્રદર્શન સમસ્યાઓ (અટકતું UI, ધીમી ક્રિયાપ્રતિક્રિયાઓ) અવલોકન કરો છો જે કોન્ટેક્સ્ટનો ઉપયોગ કરતા કમ્પોનન્ટ્સને કારણે હોય છે.
- તમારું કોન્ટેક્સ્ટ એક મોટો અથવા વારંવાર બદલાતો ડેટા ઓબ્જેક્ટ પ્રદાન કરે છે, અને ઘણા કમ્પોનન્ટ્સ તેનો ઉપયોગ કરે છે, ભલે તેમને ફક્ત નાના, સ્થિર ભાગોની જરૂર હોય.
- તમે ઘણા વિકાસકર્તાઓ સાથે મોટા પાયે એપ્લિકેશન બનાવી રહ્યા છો, જ્યાં વિવિધ વપરાશકર્તા વાતાવરણમાં સતત પ્રદર્શન નિર્ણાયક છે.
નિષ્કર્ષ
રિએક્ટ કોન્ટેક્સ્ટ API તમારી એપ્લિકેશન્સમાં વૈશ્વિક સ્ટેટનું સંચાલન કરવા માટે એક શક્તિશાળી સાધન છે. બિનજરૂરી રી-રેન્ડર્સની સંભવિતતાને સમજીને અને કોન્ટેક્સ્ટ્સનું વિભાજન, useMemo
સાથે વેલ્યુઝનું મેમોઇઝિંગ, React.memo
નો લાભ ઉઠાવીને, અને સિલેક્ટિવ કન્ઝમ્પશન માટે કસ્ટમ હુક્સ બનાવીને, તમે તમારી રિએક્ટ એપ્લિકેશન્સના પ્રદર્શનમાં નોંધપાત્ર સુધારો કરી શકો છો. વૈશ્વિક ટીમો માટે, આ ઓપ્ટિમાઇઝેશન માત્ર એક સરળ વપરાશકર્તા અનુભવ પ્રદાન કરવા માટે નથી, પરંતુ તમારી એપ્લિકેશન્સ વિશ્વભરના ઉપકરણો અને નેટવર્ક પરિસ્થિતિઓના વિશાળ સ્પેક્ટ્રમમાં સ્થિતિસ્થાપક અને કાર્યક્ષમ છે તેની ખાતરી કરવા માટે પણ છે. કોન્ટેક્સ્ટ સાથે સિલેક્ટિવ રી-રેન્ડરિંગમાં નિપુણતા મેળવવી એ ઉચ્ચ-ગુણવત્તાવાળી, કાર્યક્ષમ રિએક્ટ એપ્લિકેશન્સ બનાવવા માટે એક મુખ્ય કૌશલ્ય છે જે વિવિધ આંતરરાષ્ટ્રીય વપરાશકર્તા આધારને પૂરી પાડે છે.