useState ಬಳಸಿ ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಆಪ್ಟಿಮೈಜ್ ಮಾಡಿ. ಸಮರ್ಥ ಸ್ಟೇಟ್ ನಿರ್ವಹಣೆ ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆ ಸುಧಾರಣೆಗೆ ಸುಧಾರಿತ ತಂತ್ರಗಳನ್ನು ಕಲಿಯಿರಿ.
ರಿಯಾಕ್ಟ್ useState: ಸ್ಟೇಟ್ ಹುಕ್ ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರಗಳಲ್ಲಿ ಪ್ರಾವೀಣ್ಯತೆ
useState ಹುಕ್ ರಿಯಾಕ್ಟ್ನಲ್ಲಿ ಕಾಂಪೊನೆಂಟ್ ಸ್ಟೇಟ್ ಅನ್ನು ನಿರ್ವಹಿಸಲು ಒಂದು ಮೂಲಭೂತ ಬಿಲ್ಡಿಂಗ್ ಬ್ಲಾಕ್ ಆಗಿದೆ. ಇದು ಅತ್ಯಂತ ಬಹುಮುಖ ಮತ್ತು ಬಳಸಲು ಸುಲಭವಾಗಿದ್ದರೂ, ಅದರ ತಪ್ಪು ಬಳಕೆಯು ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಡಚಣೆಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು, ವಿಶೇಷವಾಗಿ ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ. ಈ ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ನಿರ್ವಹಣೆಗೆ ಯೋಗ್ಯವಾಗಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು useState ಅನ್ನು ಆಪ್ಟಿಮೈಜ್ ಮಾಡಲು ಸುಧಾರಿತ ತಂತ್ರಗಳನ್ನು ವಿವರಿಸುತ್ತದೆ.
useState ಮತ್ತು ಅದರ ಪರಿಣಾಮಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರಗಳನ್ನು ತಿಳಿಯುವ ಮೊದಲು, useState ನ ಮೂಲಭೂತ ಅಂಶಗಳನ್ನು ಪುನರಾವಲೋಕಿಸೋಣ. useState ಹುಕ್ ಫಂಕ್ಷನಲ್ ಕಾಂಪೊನೆಂಟ್ಗಳಿಗೆ ಸ್ಟೇಟ್ ಹೊಂದಲು ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಒಂದು ಸ್ಟೇಟ್ ವೇರಿಯಬಲ್ ಮತ್ತು ಆ ವೇರಿಯಬಲ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಒಂದು ಫಂಕ್ಷನ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಪ್ರತಿ ಬಾರಿ ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ ಆದಾಗ, ಕಾಂಪೊನೆಂಟ್ ರೀ-ರೆಂಡರ್ ಆಗುತ್ತದೆ.
ಮೂಲ ಉದಾಹರಣೆ:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
Count: {count}
);
}
export default Counter;
ಈ ಸರಳ ಉದಾಹರಣೆಯಲ್ಲಿ, "Increment" ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡುವುದರಿಂದ count ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ ಆಗುತ್ತದೆ, ಇದು Counter ಕಾಂಪೊನೆಂಟ್ನ ರೀ-ರೆಂಡರ್ಗೆ ಕಾರಣವಾಗುತ್ತದೆ. ಇದು ಸಣ್ಣ ಕಾಂಪೊನೆಂಟ್ಗಳಿಗೆ ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಿದರೂ, ದೊಡ್ಡ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಅನಿಯಂತ್ರಿತ ರೀ-ರೆಂಡರ್ಗಳು ಕಾರ್ಯಕ್ಷಮತೆಯ ಮೇಲೆ ತೀವ್ರ ಪರಿಣಾಮ ಬೀರಬಹುದು.
useState ಅನ್ನು ಏಕೆ ಆಪ್ಟಿಮೈಜ್ ಮಾಡಬೇಕು?
ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಕಾರ್ಯಕ್ಷಮತೆಯ ಸಮಸ್ಯೆಗಳಿಗೆ ಅನಗತ್ಯ ರೀ-ರೆಂಡರ್ಗಳೇ ಮುಖ್ಯ ಕಾರಣ. ಪ್ರತಿ ರೀ-ರೆಂಡರ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ನಿಧಾನಗೊಳಿಸಬಹುದು. useState ಅನ್ನು ಆಪ್ಟಿಮೈಜ್ ಮಾಡುವುದರಿಂದ ಈ ಕೆಳಗಿನವುಗಳಿಗೆ ಸಹಾಯವಾಗುತ್ತದೆ:
- ಅನಗತ್ಯ ರೀ-ರೆಂಡರ್ಗಳನ್ನು ಕಡಿಮೆ ಮಾಡಿ: ಕಾಂಪೊನೆಂಟ್ಗಳ ಸ್ಟೇಟ್ ನಿಜವಾಗಿಯೂ ಬದಲಾಗದಿದ್ದಾಗ ಅವು ರೀ-ರೆಂಡರ್ ಆಗುವುದನ್ನು ತಡೆಯಿರಿ.
- ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸಿ: ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ವೇಗವಾಗಿ ಮತ್ತು ಹೆಚ್ಚು ಸ್ಪಂದಿಸುವಂತೆ ಮಾಡಿ.
- ನಿರ್ವಹಣೆಯನ್ನು ಹೆಚ್ಚಿಸಿ: ಸ್ವಚ್ಛ ಮತ್ತು ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿ ಕೋಡ್ ಬರೆಯಿರಿ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 1: ಫಂಕ್ಷನಲ್ ಅಪ್ಡೇಟ್ಗಳು
ಹಿಂದಿನ ಸ್ಟೇಟ್ ಆಧಾರದ ಮೇಲೆ ಸ್ಟೇಟ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡುವಾಗ, ಯಾವಾಗಲೂ setCount ನ ಫಂಕ್ಷನಲ್ ಫಾರ್ಮ್ ಅನ್ನು ಬಳಸಿ. ಇದು ಹಳೆಯ ಕ್ಲೋಶರ್ಗಳ (stale closures) ಸಮಸ್ಯೆಗಳನ್ನು ತಡೆಯುತ್ತದೆ ಮತ್ತು ನೀವು ಅತೀ ಇತ್ತೀಚಿನ ಸ್ಟೇಟ್ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ತಪ್ಪು (ಸಮಸ್ಯೆಯಾಗಬಹುದು):
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setTimeout(() => {
setCount(count + 1); // ಹಳೆಯ 'count' ಮೌಲ್ಯ ಇರಬಹುದು
}, 1000);
};
return (
Count: {count}
);
}
ಸರಿ (ಫಂಕ್ಷನಲ್ ಅಪ್ಡೇಟ್):
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setTimeout(() => {
setCount(prevCount => prevCount + 1); // ಸರಿಯಾದ 'count' ಮೌಲ್ಯವನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ
}, 1000);
};
return (
Count: {count}
);
}
setCount(prevCount => prevCount + 1) ಬಳಸುವ ಮೂಲಕ, ನೀವು setCount ಗೆ ಒಂದು ಫಂಕ್ಷನ್ ಅನ್ನು ಪಾಸ್ ಮಾಡುತ್ತಿದ್ದೀರಿ. ರಿಯಾಕ್ಟ್ ಆಗ ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ ಅನ್ನು ಕ್ಯೂನಲ್ಲಿ ಇಟ್ಟು, ಅತೀ ಇತ್ತೀಚಿನ ಸ್ಟೇಟ್ ಮೌಲ್ಯದೊಂದಿಗೆ ಆ ಫಂಕ್ಷನ್ ಅನ್ನು ಎಕ್ಸಿಕ್ಯೂಟ್ ಮಾಡುತ್ತದೆ, ಇದರಿಂದ ಹಳೆಯ ಕ್ಲೋಶರ್ ಸಮಸ್ಯೆಯನ್ನು ತಪ್ಪಿಸಬಹುದು.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 2: ಇಮ್ಮ್ಯೂಟಬಲ್ ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ಗಳು
ನಿಮ್ಮ ಸ್ಟೇಟ್ನಲ್ಲಿ ಆಬ್ಜೆಕ್ಟ್ಗಳು ಅಥವಾ ಅರೇಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ, ಯಾವಾಗಲೂ ಅವುಗಳನ್ನು ಇಮ್ಮ್ಯೂಟಬಲ್ ಆಗಿ ಅಪ್ಡೇಟ್ ಮಾಡಿ. ಸ್ಟೇಟ್ ಅನ್ನು ನೇರವಾಗಿ ಬದಲಾಯಿಸುವುದರಿಂದ (mutating) ರೀ-ರೆಂಡರ್ ಆಗುವುದಿಲ್ಲ, ಏಕೆಂದರೆ ರಿಯಾಕ್ಟ್ ಬದಲಾವಣೆಗಳನ್ನು ಪತ್ತೆಹಚ್ಚಲು ರೆಫರೆನ್ಷಿಯಲ್ ಈಕ್ವಾಲಿಟಿಯನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ. ಬದಲಾಗಿ, ಬೇಕಾದ ಬದಲಾವಣೆಗಳೊಂದಿಗೆ ಆಬ್ಜೆಕ್ಟ್ ಅಥವಾ ಅರೇಯ ಹೊಸ ಪ್ರತಿಯನ್ನು ರಚಿಸಿ.
ತಪ್ಪು (ಸ್ಟೇಟ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದು):
function ShoppingCart() {
const [items, setItems] = useState([{ id: 1, name: 'Apple', quantity: 2 }]);
const updateQuantity = (id, newQuantity) => {
const item = items.find(item => item.id === id);
if (item) {
item.quantity = newQuantity; // ನೇರ ಬದಲಾವಣೆ! ರೀ-ರೆಂಡರ್ ಆಗುವುದಿಲ್ಲ.
setItems(items); // ರಿಯಾಕ್ಟ್ ಬದಲಾವಣೆಯನ್ನು ಪತ್ತೆಹಚ್ಚದ ಕಾರಣ ಇದು ಸಮಸ್ಯೆಗಳನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ.
}
};
return (
{items.map(item => (
{item.name} - Quantity: {item.quantity}
))}
);
}
ಸರಿ (ಇಮ್ಮ್ಯೂಟಬಲ್ ಅಪ್ಡೇಟ್):
function ShoppingCart() {
const [items, setItems] = useState([{ id: 1, name: 'Apple', quantity: 2 }]);
const updateQuantity = (id, newQuantity) => {
setItems(prevItems =>
prevItems.map(item =>
item.id === id ? { ...item, quantity: newQuantity } : item
)
);
};
return (
{items.map(item => (
{item.name} - Quantity: {item.quantity}
))}
);
}
ಸರಿಪಡಿಸಿದ ಆವೃತ್ತಿಯಲ್ಲಿ, ನಾವು ಅಪ್ಡೇಟ್ ಮಾಡಿದ ಐಟಂನೊಂದಿಗೆ ಹೊಸ ಅರೇಯನ್ನು ರಚಿಸಲು .map() ಅನ್ನು ಬಳಸುತ್ತೇವೆ. ಸ್ಪ್ರೆಡ್ ಆಪರೇಟರ್ (...item) ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ರಾಪರ್ಟಿಗಳೊಂದಿಗೆ ಹೊಸ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ರಚಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ, ಮತ್ತು ನಂತರ ನಾವು quantity ಪ್ರಾಪರ್ಟಿಯನ್ನು ಹೊಸ ಮೌಲ್ಯದೊಂದಿಗೆ ಓವರ್ರೈಟ್ ಮಾಡುತ್ತೇವೆ. ಇದು setItems ಹೊಸ ಅರೇಯನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ, ರೀ-ರೆಂಡರ್ ಅನ್ನು ಪ್ರಚೋದಿಸುತ್ತದೆ ಮತ್ತು UI ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡುತ್ತದೆ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 3: ಅನಗತ್ಯ ರೀ-ರೆಂಡರ್ಗಳನ್ನು ತಪ್ಪಿಸಲು `useMemo` ಬಳಸುವುದು
useMemo ಹುಕ್ ಅನ್ನು ಒಂದು ಲೆಕ್ಕಾಚಾರದ ಫಲಿತಾಂಶವನ್ನು ಮೆಮೊಯಿಜ್ (memoize) ಮಾಡಲು ಬಳಸಬಹುದು. ಲೆಕ್ಕಾಚಾರವು ದುಬಾರಿಯಾಗಿದ್ದಾಗ ಮತ್ತು ಕೆಲವು ಸ್ಟೇಟ್ ವೇರಿಯಬಲ್ಗಳ ಮೇಲೆ ಮಾತ್ರ ಅವಲಂಬಿತವಾಗಿದ್ದಾಗ ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ. ಆ ಸ್ಟೇಟ್ ವೇರಿಯಬಲ್ಗಳು ಬದಲಾಗದಿದ್ದರೆ, useMemo ಕ್ಯಾಶ್ ಮಾಡಿದ ಫಲಿತಾಂಶವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ, ಲೆಕ್ಕಾಚಾರವನ್ನು ಮತ್ತೆ ಮಾಡುವುದನ್ನು ತಡೆಯುತ್ತದೆ ಮತ್ತು ಅನಗತ್ಯ ರೀ-ರೆಂಡರ್ಗಳನ್ನು ತಪ್ಪಿಸುತ್ತದೆ.
ಉದಾಹರಣೆ:
import React, { useState, useMemo } from 'react';
function ExpensiveComponent({ data }) {
const [multiplier, setMultiplier] = useState(2);
// 'data' ಮೇಲೆ ಮಾತ್ರ ಅವಲಂಬಿತವಾಗಿರುವ ದುಬಾರಿ ಲೆಕ್ಕಾಚಾರ
const processedData = useMemo(() => {
console.log('Processing data...');
// ದುಬಾರಿ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನುಕರಿಸಿ
let result = data.map(item => item * multiplier);
return result;
}, [data, multiplier]);
return (
Processed Data: {processedData.join(', ')}
);
}
function App() {
const [data, setData] = useState([1, 2, 3, 4, 5]);
return (
);
}
export default App;
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, processedData ಅನ್ನು data ಅಥವಾ multiplier ಬದಲಾದಾಗ ಮಾತ್ರ ಮರುಲೆಕ್ಕಾಚಾರ ಮಾಡಲಾಗುತ್ತದೆ. ExpensiveComponent ನ ಇತರ ಸ್ಟೇಟ್ ಭಾಗಗಳು ಬದಲಾದರೆ, ಕಾಂಪೊನೆಂಟ್ ರೀ-ರೆಂಡರ್ ಆಗುತ್ತದೆ, ಆದರೆ processedData ಮರುಲೆಕ್ಕಾಚಾರ ಮಾಡಲಾಗುವುದಿಲ್ಲ, ಇದರಿಂದ ಸಂಸ್ಕರಣಾ ಸಮಯ ಉಳಿಯುತ್ತದೆ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 4: ಫಂಕ್ಷನ್ಗಳನ್ನು ಮೆಮೊಯಿಜ್ ಮಾಡಲು `useCallback` ಬಳಸುವುದು
useMemo ನಂತೆಯೇ, useCallback ಫಂಕ್ಷನ್ಗಳನ್ನು ಮೆಮೊಯಿಜ್ ಮಾಡುತ್ತದೆ. ಚೈಲ್ಡ್ ಕಾಂಪೊನೆಂಟ್ಗಳಿಗೆ ಫಂಕ್ಷನ್ಗಳನ್ನು ಪ್ರಾಪ್ಸ್ ಆಗಿ ಪಾಸ್ ಮಾಡುವಾಗ ಇದು ವಿಶೇಷವಾಗಿ ಉಪಯುಕ್ತವಾಗಿದೆ. useCallback ಇಲ್ಲದೆ, ಪ್ರತಿ ರೆಂಡರ್ನಲ್ಲಿ ಹೊಸ ಫಂಕ್ಷನ್ ಇನ್ಸ್ಟನ್ಸ್ ಅನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ, ಇದರಿಂದಾಗಿ ಚೈಲ್ಡ್ ಕಾಂಪೊನೆಂಟ್ ಅದರ ಪ್ರಾಪ್ಸ್ ನಿಜವಾಗಿಯೂ ಬದಲಾಗದಿದ್ದರೂ ಸಹ ರೀ-ರೆಂಡರ್ ಆಗುತ್ತದೆ. ಏಕೆಂದರೆ ರಿಯಾಕ್ಟ್ ಪ್ರಾಪ್ಸ್ ಭಿನ್ನವಾಗಿದೆಯೇ ಎಂದು ಕಟ್ಟುನಿಟ್ಟಾದ ಸಮಾನತೆ (===) ಬಳಸಿ ಪರಿಶೀಲಿಸುತ್ತದೆ, ಮತ್ತು ಹೊಸ ಫಂಕ್ಷನ್ ಯಾವಾಗಲೂ ಹಿಂದಿನದಕ್ಕಿಂತ ಭಿನ್ನವಾಗಿರುತ್ತದೆ.
ಉದಾಹರಣೆ:
import React, { useState, useCallback } from 'react';
const Button = React.memo(({ onClick, children }) => {
console.log('Button rendered');
return ;
});
function ParentComponent() {
const [count, setCount] = useState(0);
// increment ಫಂಕ್ಷನ್ ಅನ್ನು ಮೆಮೊಯಿಜ್ ಮಾಡಿ
const increment = useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []); // ಖಾಲಿ ಡಿಪೆಂಡೆನ್ಸಿ ಅರೇ ಎಂದರೆ ಈ ಫಂಕ್ಷನ್ ಒಮ್ಮೆ ಮಾತ್ರ ರಚನೆಯಾಗುತ್ತದೆ
return (
Count: {count}
);
}
export default ParentComponent;
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, increment ಫಂಕ್ಷನ್ ಅನ್ನು ಖಾಲಿ ಡಿಪೆಂಡೆನ್ಸಿ ಅರೇಯೊಂದಿಗೆ useCallback ಬಳಸಿ ಮೆಮೊಯಿಜ್ ಮಾಡಲಾಗಿದೆ. ಇದರರ್ಥ ಕಾಂಪೊನೆಂಟ್ ಮೌಂಟ್ ಆದಾಗ ಫಂಕ್ಷನ್ ಒಮ್ಮೆ ಮಾತ್ರ ರಚನೆಯಾಗುತ್ತದೆ. Button ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು React.memo ನಲ್ಲಿ ಸುತ್ತಿರುವುದರಿಂದ, ಅದರ ಪ್ರಾಪ್ಸ್ ಬದಲಾದರೆ ಮಾತ್ರ ಅದು ರೀ-ರೆಂಡರ್ ಆಗುತ್ತದೆ. increment ಫಂಕ್ಷನ್ ಪ್ರತಿ ರೆಂಡರ್ನಲ್ಲಿ ಒಂದೇ ಆಗಿರುವುದರಿಂದ, Button ಕಾಂಪೊನೆಂಟ್ ಅನಗತ್ಯವಾಗಿ ರೀ-ರೆಂಡರ್ ಆಗುವುದಿಲ್ಲ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 5: ಫಂಕ್ಷನಲ್ ಕಾಂಪೊನೆಂಟ್ಗಳಿಗಾಗಿ `React.memo` ಬಳಸುವುದು
React.memo ಒಂದು ಹೈಯರ್-ಆರ್ಡರ್ ಕಾಂಪೊನೆಂಟ್ ಆಗಿದ್ದು, ಇದು ಫಂಕ್ಷನಲ್ ಕಾಂಪೊನೆಂಟ್ಗಳನ್ನು ಮೆಮೊಯಿಜ್ ಮಾಡುತ್ತದೆ. ಇದು ಒಂದು ಕಾಂಪೊನೆಂಟ್ನ ಪ್ರಾಪ್ಸ್ ಬದಲಾಗದಿದ್ದರೆ ಅದನ್ನು ರೀ-ರೆಂಡರ್ ಮಾಡುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ತಮ್ಮ ಪ್ರಾಪ್ಸ್ಗಳ ಮೇಲೆ ಮಾತ್ರ ಅವಲಂಬಿತವಾಗಿರುವ ಪ್ಯೂರ್ ಕಾಂಪೊನೆಂಟ್ಗಳಿಗೆ ಇದು ವಿಶೇಷವಾಗಿ ಉಪಯುಕ್ತವಾಗಿದೆ.
ಉದಾಹರಣೆ:
import React from 'react';
const MyComponent = React.memo(({ name }) => {
console.log('MyComponent rendered');
return Hello, {name}!
;
});
export default MyComponent;
React.memo ಅನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಬಳಸಲು, ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್ ಪ್ಯೂರ್ ಆಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ, ಅಂದರೆ ಅದು ಒಂದೇ ಇನ್ಪುಟ್ ಪ್ರಾಪ್ಸ್ಗಳಿಗೆ ಯಾವಾಗಲೂ ಒಂದೇ ಔಟ್ಪುಟ್ ಅನ್ನು ರೆಂಡರ್ ಮಾಡುತ್ತದೆ. ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್ ಸೈಡ್ ಎಫೆಕ್ಟ್ಗಳನ್ನು ಹೊಂದಿದ್ದರೆ ಅಥವಾ ಬದಲಾಗಬಹುದಾದ ಕಾಂಟೆಕ್ಸ್ಟ್ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿದ್ದರೆ, React.memo ಉತ್ತಮ ಪರಿಹಾರವಾಗಿರದಿರಬಹುದು.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 6: ದೊಡ್ಡ ಕಾಂಪೊನೆಂಟ್ಗಳನ್ನು ವಿಭಜಿಸುವುದು
ಸಂಕೀರ್ಣ ಸ್ಟೇಟ್ ಹೊಂದಿರುವ ದೊಡ್ಡ ಕಾಂಪೊನೆಂಟ್ಗಳು ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಡಚಣೆಗಳಾಗಬಹುದು. ಈ ಕಾಂಪೊನೆಂಟ್ಗಳನ್ನು ಚಿಕ್ಕ, ಹೆಚ್ಚು ನಿರ್ವಹಿಸಬಲ್ಲ ತುಣುಕುಗಳಾಗಿ ವಿಭಜಿಸುವುದರಿಂದ ರೀ-ರೆಂಡರ್ಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸುವ ಮೂಲಕ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸಬಹುದು. ಅಪ್ಲಿಕೇಶನ್ ಸ್ಟೇಟ್ನ ಒಂದು ಭಾಗ ಬದಲಾದಾಗ, ಇಡೀ ದೊಡ್ಡ ಕಾಂಪೊನೆಂಟ್ ಬದಲಿಗೆ ಸಂಬಂಧಿತ ಸಬ್-ಕಾಂಪೊನೆಂಟ್ ಮಾತ್ರ ರೀ-ರೆಂಡರ್ ಆಗಬೇಕಾಗುತ್ತದೆ.
ಉದಾಹರಣೆ (ಕಾನ್ಸೆಪ್ಟ್):
ಬಳಕೆದಾರರ ಮಾಹಿತಿ ಮತ್ತು ಆಕ್ಟಿವಿಟಿ ಫೀಡ್ ಎರಡನ್ನೂ ನಿರ್ವಹಿಸುವ ಒಂದು ದೊಡ್ಡ UserProfile ಕಾಂಪೊನೆಂಟ್ ಹೊಂದುವ ಬದಲು, ಅದನ್ನು UserInfo ಮತ್ತು ActivityFeed ಎಂಬ ಎರಡು ಕಾಂಪೊನೆಂಟ್ಗಳಾಗಿ ವಿಭಜಿಸಿ. ಪ್ರತಿ ಕಾಂಪೊನೆಂಟ್ ತನ್ನದೇ ಆದ ಸ್ಟೇಟ್ ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ಅದರ ನಿರ್ದಿಷ್ಟ ಡೇಟಾ ಬದಲಾದಾಗ ಮಾತ್ರ ರೀ-ರೆಂಡರ್ ಆಗುತ್ತದೆ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 7: ಸಂಕೀರ್ಣ ಸ್ಟೇಟ್ ಲಾಜಿಕ್ಗಾಗಿ `useReducer` ಜೊತೆಗೆ ರಿಡ್ಯೂಸರ್ಗಳನ್ನು ಬಳಸುವುದು
ಸಂಕೀರ್ಣ ಸ್ಟೇಟ್ ಪರಿವರ್ತನೆಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ, useReducer, useState ಗೆ ಒಂದು ಶಕ್ತಿಯುತ ಪರ್ಯಾಯವಾಗಬಹುದು. ಇದು ಸ್ಟೇಟ್ ಅನ್ನು ನಿರ್ವಹಿಸಲು ಹೆಚ್ಚು ರಚನಾತ್ಮಕ ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತದೆ ಮತ್ತು ಆಗಾಗ್ಗೆ ಉತ್ತಮ ಕಾರ್ಯಕ್ಷಮತೆಗೆ ಕಾರಣವಾಗಬಹುದು. useReducer ಹುಕ್ ಸಂಕೀರ್ಣ ಸ್ಟೇಟ್ ಲಾಜಿಕ್ ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ, ಸಾಮಾನ್ಯವಾಗಿ ಬಹು ಸಬ್-ವ್ಯಾಲ್ಯೂಗಳೊಂದಿಗೆ, ಇದಕ್ಕೆ ಆಕ್ಷನ್ಗಳ ಆಧಾರದ ಮೇಲೆ ಗ್ರ್ಯಾನ್ಯುಲರ್ ಅಪ್ಡೇಟ್ಗಳು ಬೇಕಾಗುತ್ತವೆ.
ಉದಾಹರಣೆ:
import React, { useReducer } from 'react';
const initialState = { count: 0, theme: 'light' };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { ...state, count: state.count + 1 };
case 'decrement':
return { ...state, count: state.count - 1 };
case 'toggleTheme':
return { ...state, theme: state.theme === 'light' ? 'dark' : 'light' };
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
Count: {state.count}
Theme: {state.theme}
);
}
export default Counter;
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, reducer ಫಂಕ್ಷನ್ ಸ್ಟೇಟ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡುವ ವಿವಿಧ ಆಕ್ಷನ್ಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. useReducer ರೆಂಡರಿಂಗ್ ಅನ್ನು ಆಪ್ಟಿಮೈಜ್ ಮಾಡಲು ಸಹ ಸಹಾಯ ಮಾಡುತ್ತದೆ, ಏಕೆಂದರೆ ನೀವು ಮೆಮೊಯಿಜೇಶನ್ನೊಂದಿಗೆ ಸ್ಟೇಟ್ನ ಯಾವ ಭಾಗಗಳು ಕಾಂಪೊನೆಂಟ್ಗಳನ್ನು ರೆಂಡರ್ ಮಾಡಲು ಕಾರಣವಾಗುತ್ತವೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು, ಅನೇಕ `useState` ಹುಕ್ಗಳಿಂದ ಉಂಟಾಗುವ ಹೆಚ್ಚು ವ್ಯಾಪಕವಾದ ರೀ-ರೆಂಡರ್ಗಳಿಗೆ ಹೋಲಿಸಿದರೆ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 8: ಆಯ್ದ ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ಗಳು
ಕೆಲವೊಮ್ಮೆ, ನೀವು ಬಹು ಸ್ಟೇಟ್ ವೇರಿಯಬಲ್ಗಳನ್ನು ಹೊಂದಿರುವ ಕಾಂಪೊನೆಂಟ್ ಹೊಂದಿರಬಹುದು, ಆದರೆ ಅವುಗಳಲ್ಲಿ ಕೆಲವು ಮಾತ್ರ ಬದಲಾದಾಗ ರೀ-ರೆಂಡರ್ ಅನ್ನು ಪ್ರಚೋದಿಸುತ್ತವೆ. ಈ ಸಂದರ್ಭಗಳಲ್ಲಿ, ನೀವು ಬಹು useState ಹುಕ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಆಯ್ದವಾಗಿ ಸ್ಟೇಟ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು. ಇದು ರೀ-ರೆಂಡರ್ಗಳನ್ನು ಕಾಂಪೊನೆಂಟ್ನ ನಿಜವಾಗಿಯೂ ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕಾದ ಭಾಗಗಳಿಗೆ ಮಾತ್ರ ಸೀಮಿತಗೊಳಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.
ಉದಾಹರಣೆ:
import React, { useState } from 'react';
function MyComponent() {
const [name, setName] = useState('John');
const [age, setAge] = useState(30);
const [location, setLocation] = useState('New York');
// ಸ್ಥಳ ಬದಲಾದಾಗ ಮಾತ್ರ ಸ್ಥಳವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ
const handleLocationChange = (newLocation) => {
setLocation(newLocation);
};
return (
Name: {name}
Age: {age}
Location: {location}
);
}
export default MyComponent;
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, location ಅನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ ಕಾಂಪೊನೆಂಟ್ನ location ಅನ್ನು ಪ್ರದರ್ಶಿಸುವ ಭಾಗ ಮಾತ್ರ ರೀ-ರೆಂಡರ್ ಆಗುತ್ತದೆ. name ಮತ್ತು age ಸ್ಟೇಟ್ ವೇರಿಯಬಲ್ಗಳನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ಅಪ್ಡೇಟ್ ಮಾಡದ ಹೊರತು ಅವು ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು ರೀ-ರೆಂಡರ್ ಮಾಡಲು ಕಾರಣವಾಗುವುದಿಲ್ಲ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 9: ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಡಿಬೌನ್ಸಿಂಗ್ ಮತ್ತು ಥ್ರಾಟ್ಲಿಂಗ್ ಮಾಡುವುದು
ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ಗಳು ಆಗಾಗ್ಗೆ ಪ್ರಚೋದಿಸಲ್ಪಡುವ ಸನ್ನಿವೇಶಗಳಲ್ಲಿ (ಉದಾಹರಣೆಗೆ, ಬಳಕೆದಾರರ ಇನ್ಪುಟ್ ಸಮಯದಲ್ಲಿ), ಡಿಬೌನ್ಸಿಂಗ್ ಮತ್ತು ಥ್ರಾಟ್ಲಿಂಗ್ ರೀ-ರೆಂಡರ್ಗಳ ಸಂಖ್ಯೆಯನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಡಿಬೌನ್ಸಿಂಗ್ ಒಂದು ಫಂಕ್ಷನ್ ಕರೆಯನ್ನು, ಆ ಫಂಕ್ಷನ್ ಅನ್ನು ಕೊನೆಯ ಬಾರಿ ಕರೆದ ನಂತರ ನಿರ್ದಿಷ್ಟ ಸಮಯ ಕಳೆದ ಮೇಲೆ ವಿಳಂಬಗೊಳಿಸುತ್ತದೆ. ಥ್ರಾಟ್ಲಿಂಗ್ ಒಂದು ನಿರ್ದಿಷ್ಟ ಸಮಯದ ಅವಧಿಯಲ್ಲಿ ಫಂಕ್ಷನ್ ಅನ್ನು ಎಷ್ಟು ಬಾರಿ ಕರೆಯಬಹುದು ಎಂಬುದನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ.
ಉದಾಹರಣೆ (ಡಿಬೌನ್ಸಿಂಗ್):
import React, { useState, useCallback } from 'react';
import debounce from 'lodash.debounce'; // lodash ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ: npm install lodash
function SearchComponent() {
const [searchTerm, setSearchTerm] = useState('');
const debouncedSetSearchTerm = useCallback(
debounce((text) => {
setSearchTerm(text);
console.log('Search term updated:', text);
}, 300),
[]
);
const handleInputChange = (event) => {
debouncedSetSearchTerm(event.target.value);
};
return (
Searching for: {searchTerm}
);
}
export default SearchComponent;
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, Lodash ನಿಂದ debounce ಫಂಕ್ಷನ್ ಅನ್ನು setSearchTerm ಫಂಕ್ಷನ್ ಕರೆಯನ್ನು 300 ಮಿಲಿಸೆಕೆಂಡ್ಗಳಷ್ಟು ವಿಳಂಬಗೊಳಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. ಇದು ಪ್ರತಿ ಕೀಸ್ಟ್ರೋಕ್ನಲ್ಲಿ ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ ಆಗುವುದನ್ನು ತಡೆಯುತ್ತದೆ, ರೀ-ರೆಂಡರ್ಗಳ ಸಂಖ್ಯೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ.
ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರ 10: ನಾನ್-ಬ್ಲಾಕಿಂಗ್ UI ಅಪ್ಡೇಟ್ಗಳಿಗಾಗಿ `useTransition` ಬಳಸುವುದು
ಮುಖ್ಯ ಥ್ರೆಡ್ ಅನ್ನು ಬ್ಲಾಕ್ ಮಾಡಿ UI ಫ್ರೀಜ್ಗೆ ಕಾರಣವಾಗಬಹುದಾದ ಕಾರ್ಯಗಳಿಗಾಗಿ, useTransition ಹುಕ್ ಅನ್ನು ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ಗಳನ್ನು ತುರ್ತು-ಅಲ್ಲದ (non-urgent) ಎಂದು ಗುರುತಿಸಲು ಬಳಸಬಹುದು. ರಿಯಾಕ್ಟ್ ಆಗ ಬಳಕೆದಾರರ ಸಂವಹನಗಳಂತಹ ಇತರ ಕಾರ್ಯಗಳಿಗೆ ಆದ್ಯತೆ ನೀಡುತ್ತದೆ, ತುರ್ತು-ಅಲ್ಲದ ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಮೊದಲು. ಇದು ಕಂಪ್ಯೂಟೇಶನಲಿ ಇಂಟೆನ್ಸಿವ್ ಕಾರ್ಯಾಚರಣೆಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗಲೂ ಸಹ ಸುಗಮ ಬಳಕೆದಾರರ ಅನುಭವಕ್ಕೆ ಕಾರಣವಾಗುತ್ತದೆ.
ಉದಾಹರಣೆ:
import React, { useState, useTransition } from 'react';
function MyComponent() {
const [isPending, startTransition] = useTransition();
const [data, setData] = useState([]);
const loadData = () => {
startTransition(() => {
// API ನಿಂದ ಡೇಟಾ ಲೋಡ್ ಮಾಡುವುದನ್ನು ಅನುಕರಿಸಿ
setTimeout(() => {
setData([1, 2, 3, 4, 5]);
}, 1000);
});
};
return (
{isPending && Loading data...
}
{data.length > 0 && Data: {data.join(', ')}
}
);
}
export default MyComponent;
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, startTransition ಫಂಕ್ಷನ್ ಅನ್ನು setData ಕರೆಯನ್ನು ತುರ್ತು-ಅಲ್ಲದ ಎಂದು ಗುರುತಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. ರಿಯಾಕ್ಟ್ ಆಗ ಲೋಡಿಂಗ್ ಸ್ಥಿತಿಯನ್ನು ಪ್ರತಿಬಿಂಬಿಸಲು UI ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡುವಂತಹ ಇತರ ಕಾರ್ಯಗಳಿಗೆ ಆದ್ಯತೆ ನೀಡುತ್ತದೆ, ಸ್ಟೇಟ್ ಅಪ್ಡೇಟ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಮೊದಲು. isPending ಫ್ಲ್ಯಾಗ್ ಟ್ರಾನ್ಸಿಶನ್ ಪ್ರಗತಿಯಲ್ಲಿದೆಯೇ ಎಂದು ಸೂಚಿಸುತ್ತದೆ.
ಸುಧಾರಿತ ಪರಿಗಣನೆಗಳು: ಕಾಂಟೆಕ್ಸ್ಟ್ ಮತ್ತು ಗ್ಲೋಬಲ್ ಸ್ಟೇಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್
ಹಂಚಿಕೆಯ ಸ್ಟೇಟ್ ಹೊಂದಿರುವ ಸಂಕೀರ್ಣ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ, ರಿಯಾಕ್ಟ್ ಕಾಂಟೆಕ್ಸ್ಟ್ ಅಥವಾ Redux, Zustand, ಅಥವಾ Jotai ನಂತಹ ಗ್ಲೋಬಲ್ ಸ್ಟೇಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಲೈಬ್ರರಿಯನ್ನು ಬಳಸುವುದನ್ನು ಪರಿಗಣಿಸಿ. ಈ ಪರಿಹಾರಗಳು ಸ್ಟೇಟ್ ಅನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಅನಗತ್ಯ ರೀ-ರೆಂಡರ್ಗಳನ್ನು ತಡೆಯಲು ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿ ಮಾರ್ಗಗಳನ್ನು ಒದಗಿಸಬಹುದು, ಕಾಂಪೊನೆಂಟ್ಗಳಿಗೆ ತಮಗೆ ಬೇಕಾದ ಸ್ಟೇಟ್ನ ನಿರ್ದಿಷ್ಟ ಭಾಗಗಳಿಗೆ ಮಾತ್ರ ಸಬ್ಸ್ಕ್ರೈಬ್ ಮಾಡಲು ಅನುವು ಮಾಡಿಕೊಡುವ ಮೂಲಕ.
ತೀರ್ಮಾನ
ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ನಿರ್ವಹಣೆಗೆ ಯೋಗ್ಯವಾದ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನಿರ್ಮಿಸಲು useState ಅನ್ನು ಆಪ್ಟಿಮೈಜ್ ಮಾಡುವುದು ನಿರ್ಣಾಯಕವಾಗಿದೆ. ಸ್ಟೇಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ನ ಸೂಕ್ಷ್ಮ ವ್ಯತ್ಯಾಸಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಂಡು ಮತ್ತು ಈ ಮಾರ್ಗದರ್ಶಿಯಲ್ಲಿ ವಿವರಿಸಿದ ತಂತ್ರಗಳನ್ನು ಅನ್ವಯಿಸುವ ಮೂಲಕ, ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಸ್ಪಂದಿಸುವಿಕೆಯನ್ನು ನೀವು ಗಮನಾರ್ಹವಾಗಿ ಸುಧಾರಿಸಬಹುದು. ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಡಚಣೆಗಳನ್ನು ಗುರುತಿಸಲು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಪ್ರೊಫೈಲ್ ಮಾಡಲು ಮರೆಯದಿರಿ ಮತ್ತು ನಿಮ್ಮ ನಿರ್ದಿಷ್ಟ ಅಗತ್ಯಗಳಿಗೆ ಅತ್ಯಂತ ಸೂಕ್ತವಾದ ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರಗಳನ್ನು ಆರಿಸಿ. ನಿಜವಾದ ಕಾರ್ಯಕ್ಷಮತೆಯ ಸಮಸ್ಯೆಗಳನ್ನು ಗುರುತಿಸದೆ ಅಕಾಲಿಕವಾಗಿ ಆಪ್ಟಿಮೈಜ್ ಮಾಡಬೇಡಿ. ಮೊದಲು ಸ್ವಚ್ಛ, ನಿರ್ವಹಿಸಬಲ್ಲ ಕೋಡ್ ಬರೆಯುವುದರ ಮೇಲೆ ಗಮನಹರಿಸಿ, ಮತ್ತು ನಂತರ ಅಗತ್ಯವಿದ್ದಂತೆ ಆಪ್ಟಿಮೈಜ್ ಮಾಡಿ. ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಕೋಡ್ ಓದುವಿಕೆಯ ನಡುವೆ ಸಮತೋಲನವನ್ನು ಸಾಧಿಸುವುದು ಮುಖ್ಯವಾಗಿದೆ.