(React) Hook Nedir, Temel Hooklar ve Kendi Hookunuzu Yapma #15
barbarbar338
announced in
Posts
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
(React) Hook Nedir, Temel Hooklar ve Kendi Hookunuzu Yapma
Hooklar React'ın 16.8.0 sürümü ile bizlere tanıtılan birkaç fonksiyondan ibarettir. Amacı ise en kaba tabirle class componentleri ile yapılan her şeyi fonksiyonel componentler ile yaptırabilmeyi sağlamak.
Hookların amacı class componentleri tamamen ortadan kaldırmak değildir ancak günümüz dünyasında class componentler zaten pek de ilgi çeken bir yapı değil. Ancak hook olmazsa da fonksiyonel componentlerde state yönetimi gibi birçok React nimeti çok sıkıntı yaşatır. Sonuç olarak elmizde artık hook API'si bulunmakta!
Hooklar genel olarak React özelliklerini fonksiyonel komponentlerde kullanmanızı sağlayan özel fonksiyonlardır. Örneğin useState hooku, React state'ini bir fonksiyonel componente eklemenizi sağlayan bir hooktur.
Örnek Bir Hook Kullanımı
Burada örnek olması adına bir state hooku kullanacağız. İlk olarak eskiden yapmanız gereken componenti ve ardından bu makaleden sonra nasıl yapmanız gerektiğini örneklendiren birkaç kod bloğu göreceğiz.
Klasik class component yapısıyla yapılmış bir kod alalım elimize
Gördüğünüz gibi componentimiz hem çok uzun hem de göz korkutucu. Basit bir state için oldukça fazla satır yazmamız gerekiyor. Şimdi bir de bu state'i güncellemeye çalışalım:
Gördüğünüz gibi kod karışmaya başladı bile. Artık hook örneğine geçebiliriz.
Gördüğünüz gibi hem hızımızı arttırdık hem de düzenimizi. Ayrıca artık daha rahat bir state yönetimine sahibiz.
Şimdi bir de bu state'i güncellemeye çalışalım:
Gördüğünüz üzere kodumuzda inanılmaz bir kısalma var ve artık daha rahat okunabilir halde.
Hookların Temel Kuralları
Hooklar her ne kadar JavaScript fonksiyonları olsa da bu fonksiyonları şu iki temel kurala uyarak kullanmanız gerekmektedir:
Temel Hooklar
1 - useState
useState hooku klasik class componentlerindeki state özelliğini fonksiyonel componentimize eklememizi sağlayan bir hooktur.
Componentimizde bir değişiklik olduğunda tekrar renderlanmasını istiyorsak kesinlikle kullanmamız gereken bir hooktur. Basitçe hooku anlamak istersek hooku çağırırken girdiğimiz argüman state'imizin başlangıç değeri olacaktır. Yukarıdaki örnekte
count
state'inin varsayılan değeri olarak0
ayarladık. Yani componentimiz ilk renderlandığındacount
değeri0
olacaktır.Hookumuzu çağırdıktan sonra bize 2 elementten oluşan bir array verecektir.
Bu arrayın ilk elementi bizim state'imizi, ikincisi ise bu state'i güncellememizi sağlayacak fonksiyonu barındırır. State'imizi güncellemek istediğimizde bu fonksiyonu çağırmamız lazım.
Eğer
const
,let
veyavar
kullanarak bir değer oluşturursak bu değerleri ne kadar güncellersek güncelleyelim componentimiz yeniden renderlanmaz ve güncel veriyi göremeyiz.2 - useEffect
useEffect hookunun 4 temel işlevi vardır. Bu hooku genel olarak klasik class componentlerinde bulunan
componentDidMount
,componentDidUpdate
vecomponentWillUnMount
metotlarının yerini tutması için kullanırız. 4. işlevi ise spesifik bir state güncellenmesini takip etmektir.componentDidUpdate
Componentimiz her renderlandığında bir kod çalıştırmamızı sağlayan bir metottur.
Bu özelliği fonksiyonel componentler ile şu şekilde yapıyoruz:
useEffect hooku gördüğünüz gibi herhangi bir veri returnlamıyor. Yani sadece componentimizin renderlanması sonucu yapmamız gereken değişimleri yönettiğimiz bir hooktur.
componentDidMount
Componentimiz ilk kez renderlandığında sadece 1 kez çalışmasını istediğimiz bir metottur. Örneğin bir websocket bağlantısı yapacaksınız veya bir interval oluşturacaksınız. Bunları component her renderlandığında tekrar tekrar yaparsanız veriler birbirine karışır. Sonuç olarak sadece 1 kere yapmak istediğimiz için bu işlemleri
componentDidMount
içinde yaparız.Bu özelliği fonksiyonel componentler ile şu şekilde yapıyoruz:
Gördüğünüz üzere useEffect hookumda boş bir array belirttim. Burayı şimdilik kafanıza takmayın, birazdan onun amacını tam anlamıyla anlatacağım.
Böylece fonksiyonel componentimizde de
componentDidMount
metodunu çağırmış olduk.componentWillUnMount
Componentimiz görüş alanımızdan çıkacağında (yani renderlanmayacağında, dokümanımızdan kaldırılacağında) çağırılan bir metottur. Bu metot sayesinde son temizlikleri yapabilir ve performansı arttırabiliriz. Bu metodu daha iyi anlatabilmek için yukarıdaki
componentDidMount
örneğini biraz geliştireceğim.Bu özelliği fonksiyonel componentler ile şu şekilde yapıyoruz:
useEffect
hooku içerisinde bir fonksiyon returnlarsak bu fonksiyon, componentimiz dokümandan kaldırılırken çağırılacaktır.Spesifik state takibi
useEffect
hookundaki favorim. Bu özellik sayesinde sadece belirttiğimiz state'te bir değişim olduğu zaman bir işlem yapabiliyoruz.Örneğin yukarıda 2 adet state verimiz bulunmakta ancak bir sadece
name
state'i değiştiği zaman bir işlem yapmak istiyoruz. O zaman işin içinedependency array
dediğimiz bir olay giriyor. YukarıdauseEffect
'incomponentDidMount
karşılığını anlatırken boş bir array belirtmiştim. Burası tam da onunla ilgili.useEffect
hookunu çağırırken ilk parametre olarak effect fonksiyonunu belirtiyoruz, bunu geçtiğimiz birkaç örnekte anladık. AncakuseEffect
hookuna 2 adet parametre tanımlayabiliriz. İkinci parametre isedependency array
olarak geçiyor. Bu parametre bir array ([]
) olmak zorunda. Bu array içine koyduğumuz veriler hookumuzun dependency'si oluyor. Yani bu verilerde bir güncellenme olduğu zaman hookumuz tekrar çalıştırılıyor.Yani dependency array'i boş bırakmak demek bu hooku yalnızca 1 kere (ilk renderdan sonra) çalışmak üzere ayarlamak demek oluyor.
Kendi Hookumuzu Oluşturma
Hooklar bu yazının başında da bahsettiğim gibi birer özel JavaScript fonksiyonlarıdır. Bir fonksiyon içinde başka fonksiyonlar da çağırabilir veya aynı kodu birden çok yerde kullanıyorsak bunu fonksiyon haline getirip işimizi kolaylaştırabiliriz. Yani bu demek oluyor ki fonksiyonlar için geçerli olan her şey hooklar için de geçerlidir. Bir hook içinde başka hooklar da çağırabilir ve aynı hooku birden çok yerde kullanabiliriz.
Şimdi basit bir hook yapmaya çalışalım. Bu yapacağımız hookun amacı belirttiğimiz URL'ye bir request atması ve bu requestin sonucunu vermesi olsun.
İlk olarak temel bir hook yapısı oluşturalım:
Gördüğünüz gibi hookumuzun içerisinde de
useState
hookunu kullandık. Böylece bir veri güncellemesi yaptığımızda componentimiz tekrar renderlanacaktır. Şimdi request özelliğini entegre edelim:Ve hookumuz tamamlandı! Fetcher fonksiyonu ile bir fetch yapıyoruz ve hata varsa
setError
ile hata state'ini güncelliyoruz, yoksasetBody
ile body state'ini güncelliyoruz. Bu hooku artık şu şekilde kullanabiliriz:Son Sözler
Yazıyı buraya kadar okuduysanız artık hookların ne demek olduğunu, nasıl çalıştıklarını ve kendi hookunuzu nasıl yapabileceğinizi anlamışsınızdır demektir. Zaman ayırdığınız için teşekkürler, başka bir yazıda görüşmek üzere.
Beta Was this translation helpful? Give feedback.
All reactions