Dalam masalah GitHub ini saya pada dasarnya mengusulkan perubahan:
x = useCallback( ... , []);
Untuk:
x = useRef( ... ).current;
Keduanya sama tetapi dengan useRef
Bereaksi tidak membandingkan dependensi.
Untuk itu balasan datang dengan pertanyaan:
Apakah pernah ada situasi di mana ketergantungan-kurang useMemo atau useCallback akan menjadi pilihan yang lebih baik daripada useRef?
Saya tidak bisa memikirkan satu, tetapi saya mungkin telah mengabaikan beberapa kasus penggunaan.
Jadi, adakah yang bisa memikirkan situasi seperti itu?
useCallback(x,[])
untukuseRef(x)
bekerja sama.useRef(x).current
itu adalah.useCallback(cb, [])
vsuseRef(cb).current
saya sendiri. Meskipun,useMemo(cb, [])
berbedauseRef(cb).current
dalam arti bahwauseMemo
, "hanya akan menghitung ulang nilai memoized ketika salah satu dependensi telah berubah." VersususeRef
yang selalu menghitung ulang nilai apa pun yang terjadi.useRef
tidak pernah menghitung ulang - selalu mengembalikan nilai awal.Meskipun Anda dapat menggunakan useRef untuk meniru useCallback atau dengan dependensi kosong, Anda tidak dapat menggunakannya untuk semua skenario yang mungkin dari useCallback yang digunakan untuk melakukan rememoisasi ketika salah satu dari dependensi berubah.
Juga tidak akan membuat banyak perbedaan kinerja jika Anda menggunakan
useCallback with empty dependency
atau menggunakanRef karena tidak harus melakukan perbandingan berat.Juga jika Anda mengubah implementasi fungsi sedikit sehingga Anda harus membuatnya kembali pada perubahan param tertentu, Anda dapat memperbarui implementasi dengan
useCallback
dan menambahkan param tambahan sebagai ketergantungan. Namun jika Anda menerapkannya dengan useRef, Anda harus kembali keuseCallback
sumber
Karena output dari useRef (() => {...}). Current dapat berubah.
Yang dapat menyebabkan Efek samping yang aneh dalam kode Anda. Saya dapat mengubah nilai arus setiap saat. https://codesandbox.io/s/confident-monad-vjeuw
Itu akan menjadi usecase karena tidak ingin menggunakan useRef
sumber
x = useRef(value).current
tidak pernah mengembalikan contoh yang bisa berubah -ref
tidak pernah dikembalikan;current
adalah. Itu sama denganuseCallback
versi.