Tepki useCallback
Kancası
React useCallback
Hook, not alınmış bir geri arama işlevi döndürür.
Not almayı, yeniden hesaplanmasına gerek kalmaması için bir değeri önbelleğe almak olarak düşünün.
Bu, kaynak yoğun işlevleri ayırmamıza olanak tanır, böylece her işlemede otomatik olarak çalışmazlar.
Hook , useCallback
yalnızca bağımlılıklarından biri güncellendiğinde çalışır.
Bu performansı artırabilir.
useCallback
ve Kancalar useMemo
benzerdir. Temel fark, useMemo
hafızaya alınmış bir değer ve hafızaya alınmış bir işlevuseCallback
döndürmesidir . useMemo bölümünde useMemo hakkında daha fazla bilgi edinebilirsiniz .
Sorun
Kullanmanın bir nedeni, useCallback
bileşenleri değişmedikçe bir bileşenin yeniden oluşturulmasını önlemektir.
Todos
Bu örnekte, değişiklik yapılmadıkça bileşenin yeniden oluşturulmayacağını düşünebilirsiniz todos
:
Bu, React.memo bölümündeki örnekle benzerdir.
Örnek:
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);
Bunu çalıştırmayı deneyin ve sayım artırma düğmesini tıklayın.
Bileşenin değişmediğinde Todos
bile yeniden oluşturulduğunu fark edeceksiniz .todos
Bu neden çalışmıyor? Kullanıyoruz memo
, bu nedenle , sayı artırıldığında ne durum ne de işlev değişmediğinden Todos
bileşen yeniden oluşturulmamalıdır .todos
addTodo
Bunun nedeni "referans eşitliği" denen bir şey.
Bir bileşen her yeniden oluşturulduğunda, işlevleri yeniden oluşturulur. Bu nedenle, addTodo
işlev aslında değişti.
Sertikalı olmak!
95 $ KAYIT
Çözüm
Bunu düzeltmek için, useCallback
gerekli olmadıkça işlevin yeniden oluşturulmasını önlemek için kancayı kullanabiliriz.
Bileşenin gereksiz yere yeniden oluşturulmasını useCallback
önlemek için Kancayı kullanın :Todos
Örnek:
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);
Artık Todos
bileşen yalnızca todos
pervane değiştiğinde yeniden oluşturulacak.