হতে পারে আমি কিছু ভুল বুঝেছি, তবে রি-রেন্ডার হওয়ার পরে ইউজক্যালব্যাক হুক প্রতিবার চলে।
আমি ইনপুটগুলি পাস করলাম - কলব্যাক ব্যবহারের দ্বিতীয় যুক্তি হিসাবে - অ-সর্বদা-পরিবর্তনযোগ্য ধ্রুবক - তবে ফিরে আসা মেমোজাইজড কলব্যাক এখনও প্রতিটি রেন্ডারে আমার ব্যয়বহুল গণনা চালায় (আমি বেশ নিশ্চিত - আপনি নীচের স্নিপেটে নিজের দ্বারা পরীক্ষা করতে পারেন)।
আমি মেমো ব্যবহারের জন্য কলব্যাকটি পরিবর্তন করেছি - এবং ব্যবহারমেমো প্রত্যাশা অনুযায়ী কাজ করে - পাসের ইনপুট পরিবর্তনের পরে চলে। এবং সত্যিই ব্যয়বহুল গণনা স্মরণ করে।
সরাসরি উদাহরণ:
'use strict';
const { useState, useCallback, useMemo } = React;
const neverChange = 'I never change';
const oneSecond = 1000;
function App() {
const [second, setSecond] = useState(0);
// This 👇 expensive function executes everytime when render happens:
const calcCallback = useCallback(() => expensiveCalc('useCallback'), [neverChange]);
const computedCallback = calcCallback();
// This 👇 executes once
const computedMemo = useMemo(() => expensiveCalc('useMemo'), [neverChange]);
setTimeout(() => setSecond(second + 1), oneSecond);
return `
useCallback: ${computedCallback} times |
useMemo: ${computedMemo} |
App lifetime: ${second}sec.
`;
}
const tenThousand = 10 * 1000;
let expensiveCalcExecutedTimes = { 'useCallback': 0, 'useMemo': 0 };
function expensiveCalc(hook) {
let i = 0;
while (i < tenThousand) i++;
return ++expensiveCalcExecutedTimes[hook];
}
ReactDOM.render(
React.createElement(App),
document.querySelector('#app')
);
<h1>useCallback vs useMemo:</h1>
<div id="app">Loading...</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
computedCallback = calcCallback();।computedCallbackশুধু = ক্যালক্যালব্যাক, it will update the callback onceকখনই পরিবর্তন হওয়া উচিত ।