UseMemo veya useCallback VS useRef ile Bağımlılıkları Boşaltma


10

Bu GitHub sayısında temel olarak değiştirmeyi önerdim:

x = useCallback( ... , []);

Kime:

x = useRef( ... ).current;

İkisi aynı ama useRefReact ile bağımlılıkları karşılaştırmıyor.

Hangi soruya bir cevap geldi:

Bağımlılığı olmayan bir kullanımın, anem veya useCallback'in useRef'ten daha iyi bir seçim olacağı hiç bir durum var mı?

Birini düşünemiyorum, ancak bazı kullanım durumlarını gözden kaçırmış olabilirim.

Herkes böyle bir durumu düşünebilir mi?

Yanıtlar:


5

React Hooks API belgeleri başına:

UseRef'in içeriği değiştiğinde sizi bilgilendirmediğini unutmayın. .Current özelliğini değiştirmek yeniden oluşturmaya neden olmaz ... Geri arama ref'sinin kullanılması, bir alt bileşen ölçülen düğümü daha sonra görüntülerse bile (örneğin, bir tıklamaya yanıt olarak), yine de üst öğede bu konuda bilgilendirilmemizi sağlar. bileşen ve ölçümleri güncelleyebilirsiniz.

Burada ve burada daha fazla bilgi edinebilirsiniz .


Sanırım bu soruya cevap veriyor, ancak bunun yanlış olduğundan şüpheleniyorum. Sandbox React örneğinde, useCallback(x,[])olarak useRef(x)çalışmak aynı şekilde çalışır.
Izhaki

useRef(x).currentyani.
Izhaki

Umarım yanılıyorum, ancak belgelerin neden yanlış olduğuna dair bir dava açtım
Izhaki

Kendime useCallback(cb, [])karşı tamamen emin useRef(cb).currentdeğilim. Rağmen, bir anlamda useMemo(cb, [])farklı , "sadece bağımlılıklar biri değiştiğinde memoized değeri yeniden hesaplar." Versus ne olursa olsun değeri her zaman yeniden hesaplar. useRef(cb).currentuseMemouseRef
Rasuna Khatami

useRefasla yeniden hesaplamaz - her zaman başlangıç ​​değerini döndürür.
Izhaki

1

UseCallback veya boş bir bağımlılıkla taklit etmek için useRef'i kullanabilirsiniz, ancak bağımlılıklardan herhangi biri değiştiğinde yeniden anımsatmak için tüm olası kullanımCallback senaryoları için kullanamazsınız.

Ayrıca, useCallback with empty dependencyherhangi bir ağır karşılaştırma yapmak zorunda olmadığındanRef kullanırsanız veya kullanırsanız, performans farkı fazla olmaz.

Ayrıca, işlev uygulamasını belirli bir param değişikliğinde yeniden oluşturmanız gerekecek şekilde biraz değiştirirseniz, uygulamayı basitçe güncelleyebilir useCallbackve ekstra parametreyi bağımlılık olarak ekleyebilirsiniz. Bununla birlikte, useRef ile uygularsanız, geri dönmeniz gerekir.useCallback


1
Teşekkürler. Başlıktan da anlaşılacağı gibi, bu kesinlikle boş bir bağımlılık durumudur.
Izhaki

1
@Izhaki Sorunun kesinlikle boş bağımlılıklar olduğunu anlıyorum ve bu yüzden boş bağımlılık durumunda herhangi bir fark olmadığını belirttim. Ancak, daha fazla değişiklik eklemeye çalıştığınızda, biraz refactor gerekebilir
Shubham Khatri

0

Çünkü useRef (() => {...}) çıktısı değiştirilebilir.

Bu, kodunuzda garip yan etkilere neden olabilir. Akım değerini istediğim zaman değiştirebilirim. https://codesandbox.io/s/confident-monad-vjeuw

UseRef'i kullanmak istememek için bir kullanıcı tabanı olurdu.


1
Ama x = useRef(value).currentasla değişebilir bir örneği döndürmez - refasla döndürülmez; currentdır-dir. Bu useCallbacksürümle aynı .
Izhaki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.