React useCallback
Hook
React useCallback
Hook သည် အလွတ်ရအောင် ပြန်ခေါ်သည့် လုပ်ဆောင်ချက်ကို ပြန်ပေးသည်။
ပြန်လည်တွက်ချက်ရန် မလိုအပ်စေရန် အလွတ်ကျက်မှတ်ခြင်းကို တန်ဖိုးတစ်ခုအဖြစ် သိမ်းဆည်းခြင်းဟု ယူဆပါ။
၎င်းသည် ကျွန်ုပ်တို့အား အရင်းအမြစ်ဆိုင်ရာ အထူးကြပ်မတ်လုပ်ဆောင်မှုများကို သီးခြားခွဲထုတ်နိုင်စေခြင်းဖြင့် ၎င်းတို့သည် တင်ဆက်မှုတိုင်းတွင် အလိုအလျောက်လုပ်ဆောင်နိုင်မည်မဟုတ်ပေ။
Hook သည် useCallback
၎င်း၏မှီခိုမှုတစ်ခုအား အပ်ဒိတ်လုပ်သောအခါမှသာ အလုပ်လုပ်ပါသည်။
ဒါက စွမ်းဆောင်ရည်ကို မြှင့်တင်ပေးနိုင်ပါတယ်။
useCallback
Hook နှင့် Hook သည် useMemo
ဆင်တူသည်။ အဓိကကွာခြားချက်မှာ အ useMemo
လွတ်ကျက်မှတ်ထားသော တန်ဖိုးကို ပြန်ပေး ကာ အလွတ်ကျက်ထားသော လုပ်ဆောင်ချက်ကိုuseCallback
ပြန်ပေးခြင်းဖြစ်သည် ။ useMemo အခန်း တွင် useMemo အကြောင်း ပိုမိုလေ့လာနိုင်ပါသည် ။
ပြဿနာ
အသုံးပြုရသည့်အကြောင်းရင်းတစ်ခုမှာ useCallback
၎င်း၏ props များမပြောင်းလဲပါက အစိတ်အပိုင်းတစ်ခုကို ပြန်လည်တင်ဆက်ခြင်းမှ တားဆီးရန်ဖြစ်သည်။
ဤဥပမာတွင်၊ ပြောင်းလဲမှု 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
function သည် အမှန်တကယ် ပြောင်းလဲသွားပါသည်။
လက်မှတ်ရယူပါ။
$95 စာရင်းသွင်းပါ။
ဖြေရှင်းချက်
၎င်းကိုဖြေရှင်းရန် useCallback
မလိုအပ်ပါက လုပ်ဆောင်ချက်ကို ပြန်လည်ဖန်တီးခြင်းမှ ကာကွယ်ရန် ချိတ်ကို အသုံးပြုနိုင်ပါသည်။
အစိတ်အပိုင်းကို မလိုအပ်ဘဲ ပြန်လည်တင်ဆက်ခြင်းမှ useCallback
ကာကွယ်ရန် Hook ကို အသုံးပြု ပါ-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);
ယခု အစိတ်အပိုင်းသည် prop ပြောင်းလဲ Todos
သည့်အခါမှသာ ပြန်လည်ဖော်ပြပါမည် ။todos