React Hooks, React uygulamalarında state ve lifecycle yönetimini kolaylaştıran bir API'dir Hooks, component'lerin içinde, component'e özel bir state veya lifecycle yönetmek için kullanılır useState Hook, fonksiyon component'ında state yönetmek için kullanılırken, useEffect Hook, bir component'in lifecycle yönetiminde kullanılır useContext Hook, bir component'ler arası state yönetimi sağlarken useReducer Hook da state yönetimi için kullanılır useMemo Hook, hesaplama maliyeti yüksek olan işlemler için optimize edilmiş hafızayı kullanır useCallback Hook, bir fonksiyonun tekrar oluşturulmasını önleyerek performansı arttırır Son olarak, useRef Hook'a bir ref atanarak bir DOM elementine erişilebilir React Hooks, kullanıcı deneyimini daha iyi hale getirmek için tasarlanmıştır ve kod yazmayı kolaylaştırırken aynı zamanda daha okunaklı ve yalın bir kod yazılmasına da yardımcı olur
React Hooks’lar React uygulamalarındaki state ve lifecycle yönetimini kolaylaştıran bir API’dir. React sınıflı component’larının yerine kullanılan fonksiyon component’larında, React Hooks’lar component’in içinde, component’e özel bir state veya lifecycle yönetmek için kullanılır.
Bu sayede aynı işlevi gören class component’lara göre daha az kod yazılarak, daha okunaklı ve kolay bir şekilde uygulama yazılabilir. Hooks, JavaScript en yeni sürümleriyle birlikte kullanılabilir.
useState Hook, fonksiyon component’ında state yönetmek için kullanılırken, useEffect Hook, bir component’in lifecycle yönetiminde kullanılır. Aynı zamanda, useContext Hook, bir component’ler arası state yönetimi sağlar. useReducer Hook, useState Hook'a benzer bir şekilde, state yönetimi için kullanılır. useMemo Hook, hesaplama maliyeti yüksek olan işlemler için optimize edilmiş hafızayı kullanır. useCallback Hook, bir fonksiyonun tekrar oluşturulmasını önleyerek performansı arttırır. Son olarak, useRef Hook'a bir ref atanarak bir DOM elementine erişilebilir.
React Hooks, React’te kullanıcı deneyimini daha iyi hale getirmek için tasarlanmıştır. Hooks, kod yazmayı kolaylaştırırken aynı zamanda daha okunaklı ve yalın bir kod yazılmasına da yardımcı olur. Hooks'ları kullanarak, React uygulamalarının performansı arttırılarak daha hızlı hale getirilebilir ve daha az kaynak tüketimi ile daha fazla işlem yapılabilir.
useState Hooks Kullanımı
React Hooks, React'taki birçok işlevi daha basit ve verimli hale getiren bir özelliktir. Bu nedenle, birçok geliştirici tarafından tercih edilir. useState Hooks, React'ta durum yönetiminde kullanılan en temel Hooks'tan biridir.
useState Hooks'un kullanımı oldukça basittir. İlk önce, useState Hooks'u uygulayacağımız fonksiyonda bu Hooks'u çağırmalıyız. Bunun için, öncelikle 'import {useState} from 'react';' satırını ekliyoruz.
Örnek olarak, bir form içerisindeki bir input alanındaki kullanıcının girdiği değeri depolamak istediğimizi varsayalım. Kullanıcının girdiği değeri, useState Hooks'u kullanarak depolayabiliriz. Örneğin:
```import React, {useState} from 'react';
function Form() { const [name, setName] = useState(''); const handleSubmit = (event) => { event.preventDefault(); alert(`Merhaba ${name}!`); setName(''); }; const handleChange = (event) => { setName(event.target.value); }; return (
)};```Yukarıdaki örnekte, useState function'unun bir dizi argümanı vardır. İlk olarak, değişkenin başlangıç değerini belirtmek için bir argüman sağlarız. İkincisi, değişkeni güncellemek için bir fonksiyon sağlarız. Bu fonksiyon, setName adı verilen setter fonksiyonudur.
Yukarıdaki örnekte, setState fonksiyonu setName ile 'name' adlı bir değişken oluşturduk. Bu değişken, input alanındaki kullanıcının girdiği ismi depolar. handleChange fonksiyonu, değişkeni güncellemek için kullanılır. handleSubmit fonksiyonu, formun gönderilmesiyle tetiklenir ve alert fonksiyonu kullanılarak, kullanıcının adı görüntülenir.
Sonuç olarak, useState Hooks'un kullanımı oldukça basittir ve React'taki durum yönetiminde oldukça faydalıdır.
useEffect Hooks Kullanımı
useEffect Hooks, component'in mount, update ve unmount anlarında otomatik olarak çalışan bir JavaScript fonksiyonudur. State yönetimi için kullanılan useState Hooks ile birlikte kullanılarak, component'in yeniden render edilmesi sırasında atılan gereksiz API çağrıları, DOM manipülasyonları gibi işlemlerden kaçınarak performans açısından optimize edilebilir.
useState Hooks ile birlikte kullanılması, useEffect Hook'un parametreleriyle sağlanır. İlk parametre olarak fonksiyon alır. Bu fonksiyon, component mount olduğunda, yani rendering işlemi tamamlandığında çalıştırılır. İkinci parametre olarak da bir bağımlılık listesi (dependencies list) alır. Bu liste, useEffect Hook'un hangi state ya da props değişikliklerini takip etmesi gerektiğini belirtir.
Örneğin, useEffect Hook'unun sadece bir API'nin sonuçları değiştiğinde çalışması gerekiyorsa, bağımlılık listesi olarak sadece o API'nin sonucunu kullanan bir state alınarak bu amaç sağlanabilir. Bu sayede, state değişmediği sürece, unnecessary rendering (gereksiz yeniden render işlemi) engellenir.
Ayrıca, useEffect Hook'unun clean-up fonksiyonlarını çalıştırmak için kullanımı da oldukça önemlidir. Örneğin, bir event listener eklemek istiyorsak ve component unmount olduğunda listener'ı kaldırmak istiyorsak, useEffect Hook'una clean-up fonksiyonları eklenerek istenilen sonuçlar elde edilebilir.
Son olarak, React uygulamalarımızdaki unnecessary rendering problemlerini minimize etmek için useEffect Hook'unu optimize etme yöntemlerinden de bahsetmek gerekmektedir. Bu yöntemler arasında useCallback, useMemo ve React.memo kullanımı olabilir. useCallback ve useMemo kullanarak, gereksiz işlemlerin tekrar tekrar yapılmaması ve bellek kullanımının minimize edilmesi sağlanabilir. React.memo kullanımı ise, function component'lerin gereksiz re-render işlemlerinin önüne geçmek için kullanılabilir. Bu optimizasyon yöntemleri, React uygulamalarının performansını önemli ölçüde arttırabilir.
Clean-Up Fonksiyonlarının Kullanımı
React'taki useEffect Hooks, React uygulamamızda component'lerin yaşam döngüsü yönetimi için kullanılır. useEffect Hooks'u kullanarak, component'imizin mount, update ve unmount zamanlarını yönetebiliriz. Bunun yanı sıra, useEffect Hooks'un kullanımı performans açısından da oldukça önemlidir.
useEffect Hooks kullanırken, zaman zaman component'lerimizi unmount ederken ya da yeniden render ederken temizlik yapmamız gerekebilir. Örneğin, bir API isteği yaptık ve sonuçlar için bir state kullandık. Sonuçları aldık, state'imizi güncelledik ve component'imizi yeniden render ettik. Ancak, component'imiz unmount edildiğinde ya da farklı bir state'e geçildiğinde, istek hala devam ettiği için hafızada yer tutar. Burada clean-up fonksiyonu devreye girer.
useEffect Hooks ile clean-up fonksiyonu kullanmak oldukça kolaydır. useEffect fonksiyonu, ikinci parametre olarak bir dizi alır. Bu dizi, useEffect fonksiyonunun takip edeceği state veya props'ları içerir. Eğer bu state veya props'lar değiştiyse, useEffect fonksiyonu tekrar çalışır. useEffect fonksiyonunun döndürdüğü bir clean-up fonksiyonu da vardır. Bu clean-up fonksiyonu, component'imiz unmount edildiğinde çağrılır.
Örneğin, bir component'teki bir state değiştiğinde çalıştırılmak üzere useEffect fonksiyonu kullanıyorsak, clean-up fonksiyonumuzu bu useEffect fonksiyonunda tanımlayabiliriz. Böylece component'imiz unmount edildiğinde ya da yeni bir state'e geçildiğinde clean-up fonksiyonumuz çağrılır ve gereksiz yer kaplamamış olur.
Ayrıca, bir component'teki state değiştiğinde çalışan bir useEffect fonksiyonumuz varsa, bu useEffect fonksiyonunu tekrar tekrar çalıştırmak performans açısından dezavantajlıdır. Bu durumda, clean-up fonksiyonunu kullanarak tekrar render edilmeden önce isteği iptal edebilir ya da state'i sıfırlayabiliriz. Böylece gereksiz render işlemlerinden kaçınmış oluruz.
Kısacası, useEffect Hooks' ile clean-up fonksiyonlarını kullanarak, React uygulamamızın performansının artmasına ve gereksiz hafıza kullanımından kaçınmasına yardımcı oluruz.
useEffect Hooks Optimizasyonu
React uygulamaları, kullanıcının etkileşimlerine bağlı olarak sürekli olarak yeniden render edilirler. Bu nedenle, kullanıcı etkileşimleri devam ederken React uygulamalarının performansı önem kazanır. useEffect Hooks, herhangi bir state değişikliği veya prop güncellemesi durumunda bile çalışır. Ancak bazen bu sürekli çalışma gereksiz render işlemlerine neden olabilir.
Bu durumda, useEffect Hooks optimizasyonu uygulamak gerekir. Optimizasyon yapmak için, useEffect Hooks'a eklenen dependency list kullanılabilir. Dependency list, useEffect Hooks'un çalışmasını etkileyen dependency'leri tanımlar. Bu sayede React, dependency'lerdeki değişimler meydana geldiğinde useEffect Hooks çalıştırabilir.
Bununla birlikte, dependency list'in doğru bir şekilde kullanılması önemlidir. İhtiyaç duyulan dependency'lerin belirlenmesi gerekir. Belirlenen dependency'ler, useEffect Hooks'un gereksiz render işlemlerine sebep olan durumların izole edilmesine yardımcı olacaktır.
Optimizasyon için bir diğer yöntem de useCallback Hooks kullanmaktır. useCallback Hooks, memoized bir callback fonksiyonu döndürür ve dependency'lerde değişiklik olmadığı sürece aynı fonksiyonu döndürür. useCallback Hooks, özellikle child component'lerin yeniden render edilmesinde performans artışı sağlar.
Bu optimizasyon teknikleri ile React uygulamaları gereksiz render işlemlerinden kaçınılabilir ve uygulamanın performansı arttırılabilir.
useReducer Hooks Kullanımı
React pulu ile beraber gelen bir diğer önemli hooks ise useReducer’dır. useReducer, useState’de olduğu gibi state yönetimi için kullanılmaktadır fakat biraz daha geliştirilmiş bir yapıdadır. useReducer ile beraber daha komplike state yapıları da yönetilebilir. Bu özellik özellikle büyük ve karmaşık uygulamalarda oldukça avantajlıdır.
useReducer Hooks'u kullanmanın en temel yapısı:
const [state, dispatch] = useReducer(reducer, initialState); |
reducer fonksiyonu ise, state içinde tutacağımız yapıyı belirler ve o yapıda yapılacak değişiklikleri belirler. Burada dikkat edilmesi gereken nokta reducer içinde state'imizin yapısına uygun değişikliklerin yapılması gerektiğidir. Aksi durumda hatalar meydana gelebilir ve uygulamanın performansı düşebilir.
Örnek olarak, kullanıcıların sepetindeki ürünlerin sayısını, fiyatını ve toplam tutarını tutan bir state yapımız olsun. Bu yapımız aşağıdaki kadar olabilir:
const initialState = { |
itemCount: 0, |
totalPrice: 0, |
} |
Bu state'imiz için bir reducer fonksiyonumuzu aşağıdaki gibi yazabiliriz:
function reducer(state, action) { |
switch (action.type) { |
case 'ADD_ITEM': |
return { |
itemCount: state.itemCount + 1, |
totalPrice: state.totalPrice + action.payload.price, |
} |
default: |
throw new Error(); |
} |
} |
Bu reducer fonksiyonumuzda ADD_ITEM tipinde bir aksiyon aldığımızda, state içindeki itemCount değerini bir arttırıyor ve totalPrice değerine ekliyoruz. Burada action içindeki payload değeri ise eklenen ürünün bilgilerini içerir.
useReducer Hooks'u ile bu state'imizi şöyle kullanabiliriz:
const [state, dispatch] = useReducer(reducer, initialState); |
<p>Sepetinizde {state.itemCount} adet ürün bulunmaktadır. Toplam tutar: {state.totalPrice}</p> |
Bu şekilde kullanarak, sepete eklenen her üründe sepetteki ürün sayısı ve toplam tutar anlık olarak güncellenir.
React.memo Kullanımı
React, web uygulaması oluşturmak için kullanılan en popüler JavaScript kütüphanelerinden biridir. React uygulamalarının performansı; verimli kod yazma, düzenli bellek yönetimi ve gereksiz işlemlerden kaçınarak optimize etme yöntemleri ile arttırılabilir. Function component'ler, React uygulamasında yaygın bir şekilde kullanılır ve bu nedenle function component'lerin performansı, uygulamanın performansını doğrudan etkiler.
React.memo, React uygulamasındaki function component'lerin (stateless) performansını arttırmak için kullanılan bir yöntemdir. React.memo, component'in sonraki bir değişiklikten sonra yeniden render edilmesi gerekip gerekmediğini belirleyen bir önbellekleme süreci başlatır. Bu, değişmeyen component'lerin tekrar render edilmesine gerek kalmadan önbellekte bulunabileceği anlamına gelir. React.memo kullanarak, zaman içinde artan ve uygulamanın performansını düşüren işlemleri azaltabilirsiniz.
Bir function component'i React.memo ile optimize etmek için, sadece component'i React.memo() fonksiyonuyla sarmalamanız yeterlidir. Örneğin:
const OptimizedComponent = React.memo(MyComponent);
Bu şekilde, MyComponent, bir değişiklik olduğunda sadece değişen kısımların render edilmesini sağlamak üzere optimize edilir.
React.memo kullanarak uygulamanızı optimize etmek, özellikle büyük ölçekli uygulamalarda bellek yönetimini ve performansı arttırmak için önemlidir. Ancak, unutmayın ki React.memo, tüm component'leri optimize etmek için kullanmamalısınız. Bunun yerine, yalnızca uygulamanızda değişmeyen ve tekrar tekrar render edilmesi gerekmeyen component'leri optimize etmek için kullanın.