⊗jsrtPmHkUCb 16 of 47 menu

Hook Pengoptimuman Prestasi useCallback dalam React

Dalam pelajaran ini, kita akan melihat hook untuk pengoptimuman prestasi seterusnya useCallback.

Hook useCallback adalah serupa dengan API useMemo, perbezaannya ialah yang pertama meng-cache nilai antara saat-saat penyusunan semula skrin, manakala yang kedua - callback. Ini membolehkan kita tidak menjalankan semula fungsi yang menggunakan banyak sumber apabila tidak diperlukan dan boleh digunakan semasa menghantar fungsi kepada komponen anak.

Mari kita fahami dengan lebih terperinci melalui contoh. Pertama, mari kita cipta komponen App dan wujudkan state num di dalamnya:

const [num, setNum] = useState(0);

Mari kita ada butang, yang apabila diklik num akan meningkat sebanyak 1, dan perenggan di mana kita akan memaparkan nilai num:

return ( <div> <button onClick={() => setNum(num + 1)}>klik</button> <p>klik: {num}</p> </div> );

Dan sekarang, andaikan dalam App juga dipaparkan beberapa senarai dengan elemen, yang akan kita tambah dengan menekan butang lain. Untuk menyimpan elemen senarai ini, kami akan wujudkan state items:

const [items, setItems] = useState([]);

Dan kemudian kami akan menulis fungsi addItem untuk menambahkannya:

function addItem() { setItems([...items, 'item baru']); }

Sekarang mari kita tulis kod untuk memaparkan elemen senarai dan pindahkannya ke komponen anak Items, yang akan menerima array elemen dan fungsi untuk menambahkannya dalam bentuk props. Jangan lupa untuk menambah output ke konsol untuk melihat bila Items kami akan disusun semula:

function Items({ items, addItem }) { const result = items.map((item, index) => { return <p key={index}>{item}</p>; }); console.log('Items render'); return ( <div> <h3>Item kami</h3> {result} <button onClick={addItem}>tambah item</button> </div> ); } export default Items;

Mari letakkan Items di hujung komponen App dan hantarkan kepadanya array items dan fungsi untuk menambah elemen addItem:

return ( <> <div> <button onClick={() => setNum(num + 1)}>klik</button> <p>klik: {num}</p> <br /> </div> <Items items={items} addItem={addItem} /> </> );

Dan sekarang mari kita klik butang dan pastikan bahawa num bertambah dan elemen baru ditambah ke dalam senarai. Dengan membuka konsol, kita akan melihat bahawa senarai kami disusun semula setiap kali, walaupun kami mengklik butang, yang meningkatkan num.

Jika kami mempunyai senarai kecil, maka semuanya baik, tetapi bagaimana jika diandaikan bahawa ia akan menjadi besar dan terdapat banyak lagi di sana? Tidak mengapa - anda akan katakan, kerana dalam pelajaran lepas kami telah melihat API memo, untuk mengelakkan penyusunan semula komponen yang tidak perlu.

Jadi mari kita balut komponen kami Items dalam memo dan selesai. Ini boleh dilakukan secara terus semasa mengeksport Items:

export default memo(Items);

Jangan lupa untuk mengimport memo:

import { memo } from 'react';

Dan sekarang mari buka konsol dan klik pada butang. Semua usaha sia-sia! Kami telah memoisasi komponen, tetapi apabila ditekan pada butang 'klik' komponen Items masih disusun semula setiap kali.

Masalahnya ialah apabila komponen induk disusun semula, fungsinya dicipta semula - ini termasuk fungsi kami addItem, yang kami hantar ke Items.

Tepat pada saat ini hook useCallback akan membantu kami. Mari kita gunakannya. Pertama, importnya ke dalam App:

import { useCallback } from 'react';

Kemudian ubahkan pengisytiharan fungsi biasa addItem kepada Function Expression, tentukan sebagai parameter pertama untuk useCallback fungsi kami dalam bentuk callback. Parameter kedua dalam kurungan segi empat sama tentukan kebergantungan - semua pemboleh ubah reaktif, yang terlibat dalam fungsi, dalam kes kami ini ialah array items:

const addItem = useCallback(() => { setItems(() => [...items, 'Item baru']); }, [items]);

Selesai! Dengan cara ini kami telah meng-cache fungsi tersebut. Klik sekali lagi pada butang dan lihat bahawa sekarang apabila butang 'klik' ditekan, komponen anak kami tidak disusun semula.

Buat komponen App, letakkan perenggan dengan teks di dalamnya. Wujudkan state dengan nilai awal 'teks' dan paparkannya dalam perenggan. Biarkan apabila diklik pada perenggan, tanda seru ditambahkan pada akhir teksnya.

Buat komponen anak Products, di mana anda akan mempunyai butang untuk menambah produk baru. Letakkannya dalam App. Dalam komponen induk, buat state dengan array produk dan fungsi penambahan produk baru. Hantarkan mereka ke komponen anak sebagai props, paparkan di dalamnya array yang dihantar dalam bentuk senarai ul.

Dalam Products, paparkan teks 'products render' dalam konsol. Balut Products dalam memo. Klik pada perenggan dan butang. Pastikan, bahawa apabila mengklik pada perenggan, komponen anak masih disusun semula.

Cache fungsi untuk menambah produk, dengan membalutnya dalam hook useCallback. Klik pada perenggan dan butang. Pastikan, bahawa apabila mengklik pada perenggan, komponen anak tidak lagi disusun semula.

Melayu
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Kami menggunakan kuki untuk operasi laman web, analisis dan personalisasi. Pemprosesan data dijalankan mengikut Polisi Kerahsiaan.
terima semua tataletak tolak