प्रतिक्रिया useCallback
हुक
रिएक्ट useCallback
हुक एक मेमोइज्ड कॉलबैक फ़ंक्शन देता है।
संस्मरण को एक मूल्य के रूप में कैशिंग के रूप में सोचें ताकि इसे पुनर्गणना करने की आवश्यकता न हो।
यह हमें संसाधन गहन कार्यों को अलग करने की अनुमति देता है ताकि वे प्रत्येक रेंडर पर स्वचालित रूप से नहीं चलेंगे।
हुक केवल तभी चलता है जब उसकी कोई useCallback
एक निर्भरता अद्यतन होती है।
इससे प्रदर्शन में सुधार हो सकता है।
और हुक समान हैं useCallback
। useMemo
मुख्य अंतर यह है कि useMemo
एक मेमोइज्ड वैल्यू लौटाता है और useCallback
एक मेमोइज्ड फंक्शन देता है । यूज़मेमो चैप्टर में आप यूज़मेमो के बारे में अधिक जान सकते हैं ।
मुसीबत
उपयोग करने का एक कारण useCallback
एक घटक को फिर से प्रस्तुत करने से रोकना है जब तक कि उसके प्रॉप्स में बदलाव न हो।
इस उदाहरण में, आप सोच सकते हैं कि Todos
घटक तब तक पुन: प्रस्तुत नहीं करेगा जब तक कि todos
परिवर्तन न हो:
यह React.memo सेक्शन में दिए गए उदाहरण के समान है।
उदाहरण:
index.js
import { useState } from "react";
import ReactDOM from "react-dom";
import Todos from "./Todos";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
return (
<>
<Todos todos={todos} addTodo={addTodo} />
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
</div>
</>
);
};
ReactDOM.render(<App />, document.getElementById('root'));
Todos.js
import { memo } from "react";
const Todos = ({ todos, addTodo }) => {
console.log("child render");
return (
<>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</>
);
};
export default memo(Todos);
इसे चलाने का प्रयास करें और काउंट इंक्रीमेंट बटन पर क्लिक करें।
आप देखेंगे कि Todos
घटक परिवर्तन न होने पर भी पुन: प्रस्तुत करता todos
है।
यह काम क्यों नहीं करता? हम उपयोग कर रहे हैं memo
, इसलिए Todos
घटक को फिर से प्रस्तुत नहीं करना चाहिए क्योंकि गिनती बढ़ने पर न तो todos
राज्य और न ही फ़ंक्शन बदल रहे हैं।addTodo
यह "संदर्भात्मक समानता" नामक किसी चीज़ के कारण है।
हर बार जब कोई घटक पुन: प्रस्तुत करता है, तो उसके कार्य पुन: निर्मित हो जाते हैं। इस वजह से, addTodo
फ़ंक्शन वास्तव में बदल गया है।
प्रमाणन हासिल करें!
$95 नामांकन
समाधान
इसे ठीक करने के useCallback
लिए, जब तक आवश्यक न हो, फ़ंक्शन को फिर से बनाने से रोकने के लिए हम हुक का उपयोग कर सकते हैं।
घटक को अनावश्यक रूप से पुन: प्रस्तुत useCallback
करने से रोकने के लिए हुक का उपयोग करें :Todos
उदाहरण:
index.js
import { useState, useCallback } from "react";
import ReactDOM from "react-dom";
import Todos from "./Todos";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = useCallback(() => {
setTodos((t) => [...t, "New Todo"]);
}, [todos]);
return (
<>
<Todos todos={todos} addTodo={addTodo} />
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
</div>
</>
);
};
ReactDOM.render(<App />, document.getElementById('root'));
Todos.js
import { memo } from "react";
const Todos = ({ todos, addTodo }) => {
console.log("child render");
return (
<>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</>
);
};
export default memo(Todos);
अब Todos
घटक केवल तभी फिर से प्रस्तुत होगा जब todos
प्रोप बदल जाएगा।