{"id":31532,"date":"2025-10-11T00:41:07","date_gmt":"2025-10-10T21:41:07","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31532"},"modified":"2025-10-11T00:41:07","modified_gmt":"2025-10-10T21:41:07","slug":"reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/","title":{"rendered":"React&#8217;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#8217;u ile De\u011fi\u015ftirmek"},"content":{"rendered":"<p><body><\/p>\n<h2>React&#8217;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#8217;u ile De\u011fi\u015ftirmek<\/h2>\n<p>React, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in deklaratif bir yakla\u015f\u0131m sunan g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. Geli\u015fiminin ilk y\u0131llar\u0131ndan itibaren, bile\u015fenlerin davran\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in s\u0131n\u0131f tabanl\u0131 bile\u015fenler ve bunlarla ili\u015fkili ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131 temel bir yap\u0131 ta\u015f\u0131 olmu\u015ftur. Ancak, React Hooks&#8217;un tan\u0131t\u0131lmas\u0131yla birlikte, fonksiyonel bile\u015fenler, s\u0131n\u0131f bile\u015fenlerinin sundu\u011fu yeteneklerin \u00e7o\u011funu, hatta daha fazlas\u0131n\u0131, daha temiz ve daha mod\u00fcler bir \u015fekilde sa\u011flamaya ba\u015flam\u0131\u015ft\u0131r. Bu devrimin merkezinde yer alan <code>useEffect<\/code> hook&#8217;u, yan etkileri (side effects) y\u00f6netmek ve b\u00f6ylece s\u0131n\u0131f bile\u015fenlerinin ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131n\u0131 etkili bir \u015fekilde de\u011fi\u015ftirmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu makalede, <code>useEffect<\/code> hook&#8217;unun ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve <code>componentDidMount<\/code>, <code>componentDidUpdate<\/code> ve <code>componentWillUnmount<\/code> gibi geleneksel ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131n\u0131n yerini nas\u0131l ald\u0131\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ayr\u0131ca, <code>useEffect<\/code>&#8216;in geli\u015fmi\u015f kullan\u0131m senaryolar\u0131n\u0131, s\u0131k\u00e7a yap\u0131lan hatalar\u0131 ve genel olarak fonksiyonel bile\u015fenlere ge\u00e7i\u015fin getirdi\u011fi avantajlar\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>S\u0131n\u0131f Bile\u015fenlerinde Ya\u015fam D\u00f6ng\u00fcs\u00fc Metodlar\u0131na Genel Bak\u0131\u015f<\/h3>\n<p>React s\u0131n\u0131f bile\u015fenleri, bir bile\u015fenin \u00f6mr\u00fc boyunca belirli anlarda otomatik olarak \u00e7a\u011fr\u0131lan \u00f6zel metodlar arac\u0131l\u0131\u011f\u0131yla yan etkileri (veri getirme, olay dinleyicileri ayarlama, DOM&#8217;u do\u011frudan manip\u00fcle etme vb.) y\u00f6netir. Bu metodlar, bile\u015fenin &#8220;do\u011fdu\u011fu&#8221;, &#8220;g\u00fcncellendi\u011fi&#8221; ve &#8220;\u00f6ld\u00fc\u011f\u00fc&#8221; anlar\u0131 temsil eder. En yayg\u0131n kullan\u0131lan ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong><code>componentDidMount()<\/code>:<\/strong> Bile\u015fen DOM&#8217;a ilk kez render edildikten sonra \u00e7a\u011fr\u0131l\u0131r. Genellikle ilk veri getirme i\u015flemleri, olay dinleyicileri ayarlama veya DOM \u00fczerinde do\u011frudan i\u015flem yapma gibi tek seferlik kurulum i\u015flemleri i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>componentDidUpdate(prevProps, prevState)<\/code>:<\/strong> Bile\u015fenin prop&#8217;lar\u0131 veya state&#8217;i g\u00fcncellendi\u011finde, ilk render hari\u00e7, her yeniden render i\u015fleminden sonra \u00e7a\u011fr\u0131l\u0131r. Bu metod, g\u00fcncellenen prop&#8217;lara veya state&#8217;e g\u00f6re yan etkileri (\u00f6rne\u011fin, yeni veriler getirme) ger\u00e7ekle\u015ftirmek i\u00e7in idealdir.<br \/>\n*   <strong><code>componentWillUnmount()<\/code>:<\/strong> Bile\u015fen DOM&#8217;dan kald\u0131r\u0131lmadan hemen \u00f6nce \u00e7a\u011fr\u0131l\u0131r. Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in <code>componentDidMount<\/code> i\u00e7inde ayarlanan olay dinleyicilerini, zamanlay\u0131c\u0131lar\u0131 veya abonelikleri temizlemek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>shouldComponentUpdate(nextProps, nextState)<\/code>:<\/strong> Performans optimizasyonu i\u00e7in kullan\u0131l\u0131r. Bile\u015fenin yeniden render edilip edilmeyece\u011fini kontrol eder. <code>true<\/code> d\u00f6nd\u00fcr\u00fcrse render edilir, <code>false<\/code> d\u00f6nd\u00fcr\u00fcrse edilmez.<br \/>\n*   <strong><code>getDerivedStateFromProps(nextProps, prevState)<\/code>:<\/strong> Nadiren kullan\u0131l\u0131r ve state&#8217;in prop&#8217;lardan t\u00fcretilmesi gerekti\u011finde \u00e7a\u011fr\u0131l\u0131r. Bu metod, yan etkileri tetiklemek i\u00e7in de\u011fil, state&#8217;i senkronize etmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>S\u0131n\u0131f bile\u015fenlerindeki bu ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131, yan etkileri y\u00f6netmek i\u00e7in i\u015flevsel bir yol sunsa da, baz\u0131 dezavantajlar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Mant\u0131k Da\u011f\u0131n\u0131kl\u0131\u011f\u0131:<\/strong> Ayn\u0131 mant\u0131\u011fa ait kod par\u00e7alar\u0131 (\u00f6rne\u011fin, bir abonelik kurma ve temizleme) farkl\u0131 ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131na da\u011f\u0131labilir. Bu durum, kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Tekrar Kullan\u0131m Zorlu\u011fu:<\/strong> Yan etki mant\u0131\u011f\u0131n\u0131 bile\u015fenler aras\u0131nda yeniden kullanmak zordur. Genellikle HOC&#8217;ler (Higher-Order Components) veya Render Props gibi daha karma\u015f\u0131k desenler gerektirir.<br \/>\n*   <strong><code>this<\/code> Ba\u011flama Sorunlar\u0131:<\/strong> JavaScript&#8217;teki <code>this<\/code> anahtar kelimesinin davran\u0131\u015f\u0131, \u00f6zellikle olay i\u015fleyicileriyle birlikte kullan\u0131ld\u0131\u011f\u0131nda, kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olabilir ve ek ba\u011flama i\u015flemleri gerektirebilir.<\/p>\n<p>React Hooks, \u00f6zellikle <code>useEffect<\/code>, bu sorunlara zarif bir \u00e7\u00f6z\u00fcm sunarak fonksiyonel bile\u015fenlerin g\u00fcc\u00fcn\u00fc art\u0131rm\u0131\u015ft\u0131r.<\/p>\n<h3>useEffect Hook&#8217;unun Temelleri<\/h3>\n<p><code>useEffect<\/code> hook&#8217;u, fonksiyonel bile\u015fenlerde yan etkileri ger\u00e7ekle\u015ftirmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. &#8220;Yan etki&#8221; terimi, bir fonksiyonun kendi kapsam\u0131 d\u0131\u015f\u0131ndaki bir \u015feyi de\u011fi\u015ftirmesi veya etkilemesi anlam\u0131na gelir. React ba\u011flam\u0131nda bu, API \u00e7a\u011fr\u0131lar\u0131, DOM manip\u00fclasyonlar\u0131, abonelikler, zamanlay\u0131c\u0131lar, olay dinleyicileri gibi i\u015flemleri i\u00e7erir. <code>useEffect<\/code>, bir bile\u015fenin render i\u015fleminden sonra, DOM g\u00fcncellendikten sonra \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gereken kodu tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<p><code>useEffect<\/code>&#8216;in temel yap\u0131s\u0131 \u015f\u00f6yledir:<\/p>\n<pre><code class=\"language-javascript\">import React, { useEffect } from 'react';\n\nfunction MyComponent() {\n  useEffect(() => {\n    \/\/ Yan etki kodu buraya yaz\u0131l\u0131r\n\n    return () => {\n      \/\/ Temizleme kodu buraya yaz\u0131l\u0131r (iste\u011fe ba\u011fl\u0131)\n    };\n  }, [ba\u011f\u0131ml\u0131l\u0131klar]); \/\/ Ba\u011f\u0131ml\u0131l\u0131k dizisi (iste\u011fe ba\u011fl\u0131)\n\n  \/\/ ... bile\u015fen render mant\u0131\u011f\u0131\n}<\/code><\/pre>\n<p><code>useEffect<\/code> iki ana arg\u00fcman al\u0131r:<\/p>\n<p>1.  <strong><code>setup<\/code> Fonksiyonu (Geri \u00c7a\u011f\u0131rma Fonksiyonu):<\/strong> Bu fonksiyon, yan etki mant\u0131\u011f\u0131n\u0131 i\u00e7erir. React, bile\u015fen render edildikten sonra (ve DOM g\u00fcncellendikten sonra) bu fonksiyonu \u00e7a\u011f\u0131r\u0131r.<br \/>\n2.  <strong><code>dependencies<\/code> Dizisi (Ba\u011f\u0131ml\u0131l\u0131k Dizisi):<\/strong> Bu iste\u011fe ba\u011fl\u0131 bir dizidir ve <code>useEffect<\/code>&#8216;in ne zaman yeniden \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 kontrol eder.<\/p>\n<p>    *   <strong>Bo\u015f dizi <code>[]<\/code>:<\/strong> Efekt sadece bile\u015fen ilk kez DOM&#8217;a ba\u011fland\u0131\u011f\u0131nda (mount) \u00e7al\u0131\u015f\u0131r ve bir daha \u00e7al\u0131\u015fmaz. Bu, <code>componentDidMount<\/code>&#8216;a benzer bir davran\u0131\u015f sa\u011flar.<br \/>\n    *   <strong>Dizi belirtilmezse:<\/strong> Efekt, bile\u015fenin her render i\u015fleminden sonra \u00e7al\u0131\u015f\u0131r. Bu genellikle istenmeyen bir durumdur ve sonsuz d\u00f6ng\u00fclere yol a\u00e7abilir.<br \/>\n    *   <strong>De\u011ferler i\u00e7eren bir dizi <code>[dep1, dep2]<\/code>:<\/strong> Efekt, bile\u015fen ilk kez ba\u011fland\u0131\u011f\u0131nda ve dizideki ba\u011f\u0131ml\u0131l\u0131klardan herhangi biri bir \u00f6nceki render&#8217;a g\u00f6re de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r. Bu, <code>componentDidUpdate<\/code>&#8216;e benzer bir davran\u0131\u015f sa\u011flar.<\/p>\n<p><code>setup<\/code> fonksiyonu iste\u011fe ba\u011fl\u0131 olarak bir <strong>temizleme fonksiyonu<\/strong> d\u00f6nd\u00fcrebilir. Bu temizleme fonksiyonu, bir sonraki efekt \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce (e\u011fer ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015firse) ve bile\u015fen DOM&#8217;dan kald\u0131r\u0131lmadan \u00f6nce (unmount) \u00e7a\u011fr\u0131l\u0131r. Bu, <code>componentWillUnmount<\/code>&#8216;a benzer bir davran\u0131\u015f sa\u011flar.<\/p>\n<p><code>useEffect<\/code>&#8216;i d\u00fc\u015f\u00fcn\u00fcrken, onu sadece ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131n\u0131n bir yede\u011fi olarak g\u00f6rmek yerine, &#8220;bir bile\u015fenin harici bir sistemle senkronize olmas\u0131n\u0131 sa\u011flayan bir mekanizma&#8221; olarak d\u00fc\u015f\u00fcnmek daha faydal\u0131d\u0131r.<\/p>\n<h3>useEffect ile Ya\u015fam D\u00f6ng\u00fcs\u00fc Metodlar\u0131n\u0131n Yerine Ge\u00e7me<\/h3>\n<p>\u015eimdi, <code>useEffect<\/code>&#8216;in s\u0131n\u0131f bile\u015fenlerindeki yayg\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131n\u0131 nas\u0131l de\u011fi\u015ftirdi\u011fini \u00f6rneklerle inceleyelim.<\/p>\n<h4>componentDidMount&#8217;u Sim\u00fcle Etmek<\/h4>\n<p><code>componentDidMount<\/code>, bile\u015fen ilk kez DOM&#8217;a ba\u011fland\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gereken tek seferlik kurulum mant\u0131\u011f\u0131 i\u00e7in kullan\u0131l\u0131r. <code>useEffect<\/code> ile bunu ba\u015farmak i\u00e7in bo\u015f bir ba\u011f\u0131ml\u0131l\u0131k dizisi kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect } from 'react';\n\nfunction DataFetcher() {\n  const [data, setData] = useState(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n\n  useEffect(() => {\n    \/\/ Bu fonksiyon sadece bile\u015fen ilk kez mount edildi\u011finde \u00e7al\u0131\u015f\u0131r\n    console.log('Bile\u015fen mount edildi, veri \u00e7ekiliyor...');\n    const fetchData = async () => {\n      try {\n        const response = await fetch('https:\/\/api.example.com\/data');\n        if (!response.ok) {\n          throw new Error(<code>HTTP error! status: ${response.status}<\/code>);\n        }\n        const result = await response.json();\n        setData(result);\n      } catch (err) {\n        setError(err);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchData();\n\n    \/\/ Bu durumda bir temizleme i\u015flemi gerekmiyor\n    \/\/ return () => { \/<em> cleanup code <\/em>\/ };\n  }, []); \/\/ Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi: sadece mount'ta \u00e7al\u0131\u015f\u0131r\n\n  if (loading) return <div>Y\u00fckleniyor...<\/div>;\n  if (error) return <div>Hata: {error.message}<\/div>;\n\n  return (\n    <div>\n      <h3>Veri:<\/h3>\n      <pre>{JSON.stringify(data, null, 2)}<\/pre>\n<\/p><\/div>\n<p>  );<br \/>\n}<\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>useEffect<\/code> i\u00e7indeki <code>fetchData<\/code> fonksiyonu sadece bile\u015fen ilk kez y\u00fcklendi\u011finde \u00e7al\u0131\u015f\u0131r. <code>[]<\/code> bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi, React&#8217;e bu efektin herhangi bir prop veya state de\u011fi\u015fikli\u011finde yeniden \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131na gerek olmad\u0131\u011f\u0131n\u0131 s\u00f6yler.<\/p>\n<h4>componentDidUpdate&#8217;i Sim\u00fcle Etmek<\/h4>\n<p><code>componentDidUpdate<\/code>, bile\u015fenin prop&#8217;lar\u0131 veya state&#8217;i de\u011fi\u015fti\u011finde belirli yan etkileri tetiklemek i\u00e7in kullan\u0131l\u0131r. <code>useEffect<\/code> ile bu davran\u0131\u015f\u0131 elde etmek i\u00e7in, ba\u011f\u0131ml\u0131l\u0131k dizisine izlemek istedi\u011fimiz prop veya state de\u011fi\u015fkenlerini ekleriz.<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect } from 'react';\n\nfunction UserProfile({ userId }) {\n  const [user, setUser] = useState(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n\n  useEffect(() => {\n    \/\/ userId de\u011fi\u015fti\u011finde veya bile\u015fen ilk mount edildi\u011finde \u00e7al\u0131\u015f\u0131r\n    console.log(<code>userId de\u011fi\u015fti veya mount edildi: ${userId}, kullan\u0131c\u0131 verisi \u00e7ekiliyor...<\/code>);\n    setLoading(true);\n    setError(null); \/\/ \u00d6nceki hatalar\u0131 temizle\n\n    const fetchUser = async () => {\n      try {\n        const response = await fetch(<code>https:\/\/api.example.com\/users\/${userId}<\/code>);\n        if (!response.ok) {\n          throw new Error(<code>HTTP error! status: ${response.status}<\/code>);\n        }\n        const result = await response.json();\n        setUser(result);\n      } catch (err) {\n        setError(err);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    if (userId) { \/\/ userId null veya undefined de\u011filse fetch yap\n      fetchUser();\n    } else {\n      setUser(null);\n      setLoading(false);\n    }\n\n  }, [userId]); \/\/ userId ba\u011f\u0131ml\u0131l\u0131\u011f\u0131: userId de\u011fi\u015fti\u011finde yeniden \u00e7al\u0131\u015f\u0131r\n\n  if (loading) return <div>Kullan\u0131c\u0131 bilgileri y\u00fckleniyor...<\/div>;\n  if (error) return <div>Hata: {error.message}<\/div>;\n  if (!user) return <div>Kullan\u0131c\u0131 se\u00e7ilmedi veya bulunamad\u0131.<\/div>;\n\n  return (\n    <div>\n      <h3>Kullan\u0131c\u0131 Profili: {user.name}<\/h3>\n      <p>Email: {user.email}<\/p>\n      <p>\u015eehir: {user.address?.city}<\/p>\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>userId<\/code> prop&#8217;u de\u011fi\u015fti\u011finde (veya bile\u015fen ilk kez mount edildi\u011finde) <code>useEffect<\/code> i\u00e7indeki veri getirme i\u015flemi yeniden tetiklenir. <code>[userId]<\/code> ba\u011f\u0131ml\u0131l\u0131k dizisi, React&#8217;e <code>userId<\/code>&#8216;nin bir \u00f6nceki render&#8217;a g\u00f6re farkl\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmesini s\u00f6yler. E\u011fer farkl\u0131ysa, efekt yeniden \u00e7al\u0131\u015f\u0131r.<\/p>\n<p><strong>Sadece G\u00fcncellemede \u00c7al\u0131\u015ft\u0131rmak (\u0130lk Mount&#8217;ta De\u011fil):<\/strong><br \/>\nBaz\u0131 durumlarda, bir efekti sadece g\u00fcncellemelerde \u00e7al\u0131\u015ft\u0131rmak, ilk mount&#8217;ta \u00e7al\u0131\u015ft\u0131rmamak isteyebilirsiniz. <code>useEffect<\/code> do\u011frudan bu yetene\u011fi sa\u011flamaz \u00e7\u00fcnk\u00fc ba\u011f\u0131ml\u0131l\u0131k dizisi, ilk mount&#8217;ta da \u00e7al\u0131\u015fmay\u0131 garanti eder. Ancak, bir <code>ref<\/code> kullanarak bu davran\u0131\u015f\u0131 sim\u00fcle edebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect, useRef } from 'react';\n\nfunction MyComponentWithUpdateEffect() {\n  const [count, setCount] = useState(0);\n  const isInitialMount = useRef(true);\n\n  useEffect(() => {\n    if (isInitialMount.current) {\n      isInitialMount.current = false;\n    } else {\n      \/\/ Bu kod sadece g\u00fcncellemelerde \u00e7al\u0131\u015f\u0131r, ilk mount'ta de\u011fil\n      console.log('count g\u00fcncellendi:', count);\n      document.title = <code>Say\u0131m: ${count}<\/code>;\n    }\n  }, [count]); \/\/ count de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r\n\n  return (\n    <div>\n      <p>Say\u0131m: {count}<\/p>\n      <button onClick={() => setCount(count + 1)}>Artt\u0131r<\/button>\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Ancak, React ekibi genellikle <code>useEffect<\/code>&#8216;i bu \u015fekilde kullanmaktan ka\u00e7\u0131nmay\u0131 ve efektlerin hem mount hem de update&#8217;te \u00e7al\u0131\u015facak \u015fekilde tasarlanmas\u0131n\u0131 \u00f6nerir. \u00c7o\u011fu durumda, bir efektin hem mount hem de ilgili ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fti\u011finde \u00e7al\u0131\u015fmas\u0131 do\u011fru davran\u0131\u015ft\u0131r.<\/p>\n<h4>componentWillUnmount&#8217;u Sim\u00fcle Etmek<\/h4>\n<p><code>componentWillUnmount<\/code>, bile\u015fen DOM&#8217;dan kald\u0131r\u0131lmadan \u00f6nce temizleme i\u015flemleri (abonelikleri iptal etme, zamanlay\u0131c\u0131lar\u0131 durdurma, olay dinleyicilerini kald\u0131rma) i\u00e7in kullan\u0131l\u0131r. <code>useEffect<\/code>&#8216;te, bu temizleme mant\u0131\u011f\u0131n\u0131 efekt fonksiyonundan d\u00f6nd\u00fcr\u00fclen bir fonksiyona yerle\u015ftiririz.<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect } from 'react';\n\nfunction TimerComponent() {\n  const [seconds, setSeconds] = useState(0);\n\n  useEffect(() => {\n    console.log('TimerComponent mount edildi, zamanlay\u0131c\u0131 ba\u015flat\u0131l\u0131yor.');\n    const intervalId = setInterval(() => {\n      setSeconds(prevSeconds => prevSeconds + 1);\n    }, 1000);\n\n    \/\/ Temizleme fonksiyonu\n    return () => {\n      console.log('TimerComponent unmount ediliyor veya efekt yeniden \u00e7al\u0131\u015f\u0131yor, zamanlay\u0131c\u0131 temizleniyor.');\n      clearInterval(intervalId); \/\/ Zamanlay\u0131c\u0131y\u0131 durdur\n    };\n  }, []); \/\/ Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi: sadece mount'ta \u00e7al\u0131\u015f\u0131r ve unmount'ta temizlenir\n\n  return (\n    <div>\n      <p>Ge\u00e7en s\u00fcre: {seconds} saniye<\/p>\n    <\/div>\n  );\n}\n\nfunction App() {\n  const [showTimer, setShowTimer] = useState(true);\n\n  return (\n    <div>\n      <button onClick={() => setShowTimer(!showTimer)}>\n        {showTimer ? 'Zamanlay\u0131c\u0131y\u0131 Gizle' : 'Zamanlay\u0131c\u0131y\u0131 G\u00f6ster'}\n      <\/button>\n      {showTimer && <TimerComponent \/>}\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>TimerComponent<\/code> mount edildi\u011finde bir <code>setInterval<\/code> ba\u015flat\u0131l\u0131r. <code>useEffect<\/code>&#8216;ten d\u00f6nd\u00fcr\u00fclen temizleme fonksiyonu, bile\u015fen unmount edildi\u011finde (yani <code>App<\/code> bile\u015fenindeki <code>showTimer<\/code> <code>false<\/code> oldu\u011funda) <code>clearInterval<\/code> \u00e7a\u011f\u0131rarak zamanlay\u0131c\u0131n\u0131n durdurulmas\u0131n\u0131 sa\u011flar. Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve istenmeyen davran\u0131\u015flar\u0131 \u00f6nler. Temizleme fonksiyonu ayr\u0131ca, ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fti\u011finde ve efekt yeniden \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce de \u00e7a\u011fr\u0131l\u0131r.<\/p>\n<h4>componentDidMount ve componentDidUpdate Birlikte<\/h4>\n<p>\u00c7o\u011fu zaman, bir efektin hem ilk render&#8217;da hem de belirli ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fti\u011finde \u00e7al\u0131\u015fmas\u0131n\u0131 isteriz. Bu, <code>useEffect<\/code>&#8216;in en yayg\u0131n kullan\u0131m \u015feklidir ve <code>componentDidMount<\/code> ile <code>componentDidUpdate<\/code>&#8216;in birle\u015fimini temsil eder.<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect } from 'react';\n\nfunction DocumentTitleUpdater({ titleSuffix }) {\n  const [count, setCount] = useState(0);\n\n  useEffect(() => {\n    \/\/ Hem mount'ta hem de count veya titleSuffix de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r\n    document.title = <code>Say\u0131m: ${count} | ${titleSuffix}<\/code>;\n    console.log(<code>Belge ba\u015fl\u0131\u011f\u0131 g\u00fcncellendi: Say\u0131m: ${count} | ${titleSuffix}<\/code>);\n\n    \/\/ Bu durumda temizleme fonksiyonu gerekmiyor\n  }, [count, titleSuffix]); \/\/ count veya titleSuffix de\u011fi\u015fti\u011finde yeniden \u00e7al\u0131\u015f\u0131r\n\n  return (\n    <div>\n      <p>Say\u0131m: {count}<\/p>\n      <button onClick={() => setCount(count + 1)}>Artt\u0131r<\/button>\n    <\/div>\n  );\n}\n\nfunction App() {\n  const [appTitle, setAppTitle] = useState('React Uygulamas\u0131');\n\n  return (\n    <div>\n      <input\n        type=\"text\"\n        value={appTitle}\n        onChange={(e) => setAppTitle(e.target.value)}\n        placeholder=\"Uygulama Ba\u015fl\u0131\u011f\u0131n\u0131 Girin\"\n      \/>\n      <DocumentTitleUpdater titleSuffix={appTitle} \/>\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Burada, <code>DocumentTitleUpdater<\/code> bile\u015feni mount edildi\u011finde ve <code>count<\/code> state&#8217;i veya <code>titleSuffix<\/code> prop&#8217;u de\u011fi\u015fti\u011finde <code>document.title<\/code> g\u00fcncellenir. Bu tek <code>useEffect<\/code> \u00e7a\u011fr\u0131s\u0131, s\u0131n\u0131f bile\u015fenlerinde <code>componentDidMount<\/code> ve <code>componentDidUpdate<\/code>&#8216;i ayr\u0131 ayr\u0131 ele almak yerine, ilgili mant\u0131\u011f\u0131 tek bir yerde toplar.<\/p>\n<h3>useEffect&#8217;in Geli\u015fmi\u015f Kullan\u0131mlar\u0131 ve \u0130pu\u00e7lar\u0131<\/h3>\n<p><code>useEffect<\/code> hook&#8217;u, temel ya\u015fam d\u00f6ng\u00fcs\u00fc sim\u00fclasyonlar\u0131n\u0131n \u00f6tesinde bir\u00e7ok g\u00fc\u00e7l\u00fc \u00f6zelli\u011fe sahiptir.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k Dizisi (Dependency Array) ve Dikkat Edilmesi Gerekenler<\/h4>\n<p>Ba\u011f\u0131ml\u0131l\u0131k dizisi, <code>useEffect<\/code>&#8216;in en \u00f6nemli ve bazen en kafa kar\u0131\u015ft\u0131r\u0131c\u0131 par\u00e7as\u0131d\u0131r. Do\u011fru kullan\u0131m\u0131, performans sorunlar\u0131n\u0131, sonsuz d\u00f6ng\u00fcleri ve beklenmedik davran\u0131\u015flar\u0131 \u00f6nlemek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>*   <strong>Eksik Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> E\u011fer bir efekt i\u00e7inde kullan\u0131lan bir de\u011fi\u015fken (prop, state, fonksiyon) ba\u011f\u0131ml\u0131l\u0131k dizisine dahil edilmezse, efekt eski (stale) bir de\u011fere sahip bir closure yakalayabilir. Bu, &#8220;stale closure&#8221; problemi olarak bilinir. React&#8217;in ESLint eklentisi (<code>eslint-plugin-react-hooks<\/code>), eksik ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak alg\u0131layarak sizi uyar\u0131r. Bu uyar\u0131lar\u0131 ciddiye almak \u00f6nemlidir.<br \/>\n*   <strong>Fonksiyonlar\u0131 Ba\u011f\u0131ml\u0131l\u0131k Olarak Ekleme:<\/strong> Bir efekt i\u00e7inde tan\u0131mlanan veya d\u0131\u015far\u0131dan gelen bir fonksiyon kullan\u0131l\u0131yorsa, bu fonksiyon genellikle ba\u011f\u0131ml\u0131l\u0131k dizisine eklenmelidir. Ancak, fonksiyon her render&#8217;da yeniden olu\u015fturuluyorsa, bu durum efektin gereksiz yere s\u0131k s\u0131k \u00e7al\u0131\u015fmas\u0131na neden olabilir. Bu t\u00fcr durumlar i\u00e7in <code>useCallback<\/code> hook&#8217;u kullan\u0131l\u0131r. <code>useCallback<\/code>, bir fonksiyonu ba\u011f\u0131ml\u0131l\u0131klar\u0131 de\u011fi\u015fmedi\u011fi s\u00fcrece haf\u0131zaya al\u0131r (memoize eder).<br \/>\n*   <strong>Nesneleri Ba\u011f\u0131ml\u0131l\u0131k Olarak Ekleme:<\/strong> Benzer \u015fekilde, bir nesne veya dizi her render&#8217;da yeniden olu\u015fturuluyorsa (\u00f6rne\u011fin, <code>{ id: 1 }<\/code> veya <code>[1, 2]<\/code>), bu nesneyi ba\u011f\u0131ml\u0131l\u0131k olarak eklemek her render&#8217;da efektin \u00e7al\u0131\u015fmas\u0131na neden olur. Bu durumda <code>useMemo<\/code> hook&#8217;u kullan\u0131larak nesne haf\u0131zaya al\u0131nabilir.<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect, useCallback, useMemo } from 'react';\n\nfunction MyOptimizedComponent({ onSave }) {\n  const [text, setText] = useState('');\n\n  \/\/ onSave fonksiyonunu haf\u0131zaya al, sadece ba\u011f\u0131ml\u0131l\u0131klar\u0131 de\u011fi\u015fti\u011finde yeniden olu\u015ftur\n  const memoizedOnSave = useCallback(() => {\n    onSave(text);\n  }, [onSave, text]); \/\/ onSave veya text de\u011fi\u015fti\u011finde yeniden olu\u015ftur\n\n  \/\/ Bir nesneyi haf\u0131zaya al\n  const config = useMemo(() => ({\n    apiUrl: '\/api\/data',\n    timeout: 5000\n  }), []); \/\/ Sadece ilk render'da olu\u015ftur\n\n  useEffect(() => {\n    console.log('Text veya onSave de\u011fi\u015fti, bir i\u015flem yap\u0131l\u0131yor...');\n    \/\/ memoizedOnSave'i kullan\n    \/\/ config'i kullan\n  }, [text, memoizedOnSave, config]); \/\/ Ba\u011f\u0131ml\u0131l\u0131klar\n\n  return (\n    <div>\n      <input type=\"text\" value={text} onChange={(e) => setText(e.target.value)} \/>\n      <button onClick={memoizedOnSave}>Kaydet<\/button>\n    <\/div>\n  );\n}<\/code><\/pre>\n<h4>Temizleme Fonksiyonu (Cleanup Function) Detaylar\u0131<\/h4>\n<p>Temizleme fonksiyonu, <code>useEffect<\/code>&#8216;in kritik bir par\u00e7as\u0131d\u0131r ve bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131, hatalar\u0131 ve istenmeyen yan etkileri \u00f6nlemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>*   <strong>Ne Zaman \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n    *   Bile\u015fen unmount edildi\u011finde.<br \/>\n    *   Efekt yeniden \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce (yani, ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fti\u011finde ve yeni bir efekt kurulumu yap\u0131lmadan \u00f6nce).<br \/>\n*   <strong>Neden \u00d6nemli?<\/strong><br \/>\n    *   <strong>Bellek S\u0131z\u0131nt\u0131lar\u0131:<\/strong> Abonelikler, zamanlay\u0131c\u0131lar veya olay dinleyicileri gibi kaynaklar temizlenmezse, bile\u015fen DOM&#8217;dan kald\u0131r\u0131lsa bile arka planda \u00e7al\u0131\u015fmaya devam edebilir ve bellek t\u00fcketebilir.<br \/>\n    *   <strong>Tutars\u0131z Durum:<\/strong> Eski aboneliklerin veya zamanlay\u0131c\u0131lar\u0131n yanl\u0131\u015fl\u0131kla g\u00fcncel bile\u015fen durumuyla etkile\u015fime girmesi tutars\u0131z durumlara yol a\u00e7abilir.<br \/>\n    *   <strong>Race Conditions:<\/strong> \u00d6zellikle veri getirme i\u015flemlerinde, kullan\u0131c\u0131 bir iste\u011fi iptal edip yenisini tetikledi\u011finde, eski iste\u011fin cevab\u0131 yeni bir state&#8217;i yanl\u0131\u015fl\u0131kla g\u00fcncelleyebilir. Temizleme fonksiyonu, bekleyen istekleri iptal ederek bu durumu \u00f6nleyebilir.<\/p>\n<h4>Birden Fazla useEffect Kullan\u0131m\u0131<\/h4>\n<p>S\u0131n\u0131f bile\u015fenlerinde t\u00fcm <code>componentDidMount<\/code> mant\u0131\u011f\u0131 tek bir yerde toplan\u0131rken, <code>useEffect<\/code> ile yan etkileri mant\u0131ksal olarak ilgili par\u00e7alara ay\u0131rabiliriz. Bu, kodun daha d\u00fczenli, okunabilir ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect } from 'react';\n\nfunction UserDashboard({ userId }) {\n  const [userData, setUserData] = useState(null);\n  const [posts, setPosts] = useState([]);\n  const [loadingUser, setLoadingUser] = useState(true);\n  const [loadingPosts, setLoadingPosts] = useState(true);\n\n  \/\/ Kullan\u0131c\u0131 verilerini getirme efekti\n  useEffect(() => {\n    if (!userId) return;\n    setLoadingUser(true);\n    fetch(<code>\/api\/users\/${userId}<\/code>)\n      .then(res => res.json())\n      .then(data => setUserData(data))\n      .catch(error => console.error(\"Kullan\u0131c\u0131 verisi hatas\u0131:\", error))\n      .finally(() => setLoadingUser(false));\n  }, [userId]); \/\/ userId de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r\n\n  \/\/ Kullan\u0131c\u0131n\u0131n g\u00f6nderilerini getirme efekti\n  useEffect(() => {\n    if (!userId) return;\n    setLoadingPosts(true);\n    fetch(<code>\/api\/users\/${userId}\/posts<\/code>)\n      .then(res => res.json())\n      .then(data => setPosts(data))\n      .catch(error => console.error(\"G\u00f6nderi verisi hatas\u0131:\", error))\n      .finally(() => setLoadingPosts(false));\n  }, [userId]); \/\/ userId de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r\n\n  \/\/ Belge ba\u015fl\u0131\u011f\u0131n\u0131 g\u00fcncelleme efekti\n  useEffect(() => {\n    document.title = userData ? <code>${userData.name} Paneli<\/code> : 'Kullan\u0131c\u0131 Paneli';\n  }, [userData]); \/\/ userData de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r\n\n  if (loadingUser || loadingPosts) return <div>Y\u00fckleniyor...<\/div>;\n\n  return (\n    <div>\n      <h3>{userData?.name} Paneli<\/h3>\n      <p>Email: {userData?.email}<\/p>\n      <h4>G\u00f6nderiler:<\/h4>\n      <ul>\n        {posts.map(post => (\n          <li key={post.id}>{post.title}<\/li>\n        ))}\n      <\/ul>\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, \u00fc\u00e7 farkl\u0131 <code>useEffect<\/code> \u00e7a\u011fr\u0131s\u0131, her biri kendi mant\u0131ksal yan etkisini y\u00f6netir: kullan\u0131c\u0131 verilerini getirme, g\u00f6nderileri getirme ve belge ba\u015fl\u0131\u011f\u0131n\u0131 g\u00fcncelleme. Her biri kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131na sahiptir ve bu, kodun daha anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Sonsuz D\u00f6ng\u00fcleri \u00d6nleme<\/h4>\n<p><code>useEffect<\/code> i\u00e7inde state&#8217;i g\u00fcncellerken dikkatli olunmal\u0131d\u0131r, aksi takdirde sonsuz d\u00f6ng\u00fclere yol a\u00e7abilir. E\u011fer bir <code>useEffect<\/code> i\u00e7inde <code>useState<\/code> ile bir state g\u00fcncelleniyor ve bu state ba\u011f\u0131ml\u0131l\u0131k dizisinde yer al\u0131yorsa, efekt her \u00e7al\u0131\u015ft\u0131\u011f\u0131nda state&#8217;i g\u00fcncelleyecek, bu da efektin tekrar \u00e7al\u0131\u015fmas\u0131na neden olacak ve sonsuz bir d\u00f6ng\u00fc olu\u015facakt\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Yanl\u0131\u015f kullan\u0131m - Sonsuz d\u00f6ng\u00fc!\nfunction BadCounter() {\n  const [count, setCount] = useState(0);\n\n  useEffect(() => {\n    \/\/ count de\u011fi\u015fti\u011finde bu efekt \u00e7al\u0131\u015f\u0131r\n    \/\/ setCount(count + 1) \u00e7a\u011fr\u0131l\u0131r, bu da count'\u0131 g\u00fcnceller\n    \/\/ count g\u00fcncellendi\u011fi i\u00e7in efekt tekrar \u00e7al\u0131\u015f\u0131r... sonsuz d\u00f6ng\u00fc!\n    setCount(count + 1);\n  }, [count]);\n\n  return <p>Say\u0131m: {count}<\/p>;\n}<\/code><\/pre>\n<p>Bu t\u00fcr d\u00f6ng\u00fcleri \u00f6nlemek i\u00e7in:<br \/>\n*   State g\u00fcncellemelerini ba\u011f\u0131ml\u0131l\u0131k dizisine dahil etmeniz gerekiyorsa, genellikle <code>setCount(prevCount => prevCount + 1)<\/code> gibi bir fonksiyonel g\u00fcncelleme kullanmak veya <code>useReducer<\/code> gibi daha karma\u015f\u0131k state y\u00f6netim \u00e7\u00f6z\u00fcmlerine y\u00f6nelmek daha g\u00fcvenlidir.<br \/>\n*   En \u00f6nemlisi, <code>useEffect<\/code>&#8216;in ne zaman \u00e7al\u0131\u015fmas\u0131 gerekti\u011fini dikkatlice d\u00fc\u015f\u00fcn\u00fcn ve ba\u011f\u0131ml\u0131l\u0131k dizisini do\u011fru ayarlay\u0131n. E\u011fer bir state g\u00fcncellenmesi efektin kendisi taraf\u0131ndan tetikleniyorsa ve bu g\u00fcncellemenin efektin yeniden \u00e7al\u0131\u015fmas\u0131na neden olmas\u0131n\u0131 istemiyorsan\u0131z, o state&#8217;i ba\u011f\u0131ml\u0131l\u0131k dizisinden \u00e7\u0131karmaya \u00e7al\u0131\u015f\u0131n (ancak bu genellikle <code>eslint-plugin-react-hooks<\/code> uyar\u0131s\u0131 alman\u0131za neden olur ve <code>useRef<\/code> veya <code>useCallback<\/code> gibi \u00e7\u00f6z\u00fcmler gerektirebilir).<\/p>\n<h4>Veri Getirme (Data Fetching) ile useEffect<\/h4>\n<p><code>useEffect<\/code> ile veri getirme, React uygulamalar\u0131nda \u00e7ok yayg\u0131n bir senaryodur. <code>async\/await<\/code> kullan\u0131m\u0131, <code>useEffect<\/code> i\u00e7inde do\u011frudan yap\u0131lamaz \u00e7\u00fcnk\u00fc <code>useEffect<\/code>&#8216;in geri \u00e7a\u011f\u0131rma fonksiyonu <code>async<\/code> olamaz (\u00e7\u00fcnk\u00fc bir promise d\u00f6nd\u00fcr\u00fcr ve React&#8217;in bekledi\u011fi temizleme fonksiyonunu d\u00f6nd\u00fcrmez). Bunun yerine, <code>async<\/code> fonksiyonu efekt i\u00e7inde tan\u0131mlay\u0131p hemen \u00e7a\u011f\u0131rmak (IIFE &#8211; Immediately Invoked Function Expression) veya ayr\u0131 bir <code>async<\/code> yard\u0131mc\u0131 fonksiyonu tan\u0131mlamak gerekir:<\/p>\n<pre><code class=\"language-javascript\">import React, { useState, useEffect } from 'react';\n\nfunction UserList() {\n  const [users, setUsers] = useState([]);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n\n  useEffect(() => {\n    let isMounted = true; \/\/ Temizleme i\u00e7in bayrak\n    const fetchUsers = async () => {\n      try {\n        setLoading(true);\n        const response = await fetch('https:\/\/jsonplaceholder.typicode.com\/users');\n        if (!response.ok) {\n          throw new Error(<code>HTTP error! status: ${response.status}<\/code>);\n        }\n        const data = await response.json();\n        if (isMounted) { \/\/ Bile\u015fen hala mount edilmi\u015fse state'i g\u00fcncelle\n          setUsers(data);\n        }\n      } catch (err) {\n        if (isMounted) {\n          setError(err);\n        }\n      } finally {\n        if (isMounted) {\n          setLoading(false);\n        }\n      }\n    };\n\n    fetchUsers();\n\n    return () => {\n      isMounted = false; \/\/ Bile\u015fen unmount edildi\u011finde veya efekt yeniden \u00e7al\u0131\u015fmadan \u00f6nce bayra\u011f\u0131 false yap\n    };\n  }, []); \/\/ Sadece mount'ta \u00e7al\u0131\u015f\u0131r\n\n  if (loading) return <div>Kullan\u0131c\u0131lar y\u00fckleniyor...<\/div>;\n  if (error) return <div>Hata: {error.message}<\/div>;\n\n  return (\n    <div>\n      <h3>Kullan\u0131c\u0131lar:<\/h3>\n      <ul>\n        {users.map(user => (\n          <li key={user.id}>{user.name} ({user.email})<\/li>\n        ))}\n      <\/ul>\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte <code>isMounted<\/code> bayra\u011f\u0131, bile\u015fen unmount edilmi\u015fse state g\u00fcncellemelerini \u00f6nleyerek &#8220;Cannot update a component (<code>${componentName}<\/code>) while rendering a different component (<code>${otherComponentName}<\/code>).&#8221; gibi uyar\u0131lar\u0131 veya bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 engeller. Modern React&#8217;te, <code>useEffect<\/code>&#8216;in temizleme fonksiyonu bu t\u00fcr race condition&#8217;lar\u0131 y\u00f6netmek i\u00e7in daha sofistike yollar sunar, \u00f6rne\u011fin <code>AbortController<\/code> kullanarak bekleyen fetch isteklerini iptal etmek.<\/p>\n<pre><code class=\"language-javascript\">\/\/ AbortController ile veri getirme temizli\u011fi\nuseEffect(() => {\n  const abortController = new AbortController();\n  const signal = abortController.signal;\n\n  const fetchUsers = async () => {\n    try {\n      setLoading(true);\n      const response = await fetch('https:\/\/jsonplaceholder.typicode.com\/users', { signal });\n      if (!response.ok) {\n        throw new Error(<code>HTTP error! status: ${response.status}<\/code>);\n      }\n      const data = await response.json();\n      setUsers(data);\n    } catch (err) {\n      if (err.name === 'AbortError') {\n        console.log('Fetch iste\u011fi iptal edildi.');\n      } else {\n        setError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  fetchUsers();\n\n  return () => {\n    abortController.abort(); \/\/ Bile\u015fen unmount edildi\u011finde veya efekt yeniden \u00e7al\u0131\u015fmadan \u00f6nce iste\u011fi iptal et\n  };\n}, []);<\/code><\/pre>\n<p>Bu y\u00f6ntem, \u00f6zellikle birden fazla API \u00e7a\u011fr\u0131s\u0131n\u0131n arka arkaya tetiklendi\u011fi durumlarda (\u00f6rne\u011fin bir arama \u00e7ubu\u011funa yazarken) race condition&#8217;lar\u0131 \u00f6nlemek i\u00e7in \u00e7ok daha sa\u011flamd\u0131r.<\/p>\n<h4>Custom Hooks ve useEffect<\/h4>\n<p><code>useEffect<\/code>&#8216;in belki de en b\u00fcy\u00fck g\u00fcc\u00fc, yan etki mant\u0131\u011f\u0131n\u0131 \u00f6zel hook&#8217;lar (custom hooks) arac\u0131l\u0131\u011f\u0131yla soyutlama ve yeniden kullanma yetene\u011fidir. Bu, bile\u015fenler aras\u0131nda durumsuz mant\u0131\u011f\u0131 payla\u015fman\u0131n ve karma\u015f\u0131k yan etkileri basitle\u015ftirmenin m\u00fckemmel bir yoludur.<\/p>\n<pre><code class=\"language-javascript\">\/\/ useDocumentTitle.js\nimport { useEffect } from 'react';\n\nfunction useDocumentTitle(title) {\n  useEffect(() => {\n    const originalTitle = document.title;\n    document.title = title;\n\n    return () => {\n      document.title = originalTitle; \/\/ Temizleme: orijinal ba\u015fl\u0131\u011f\u0131 geri y\u00fckle\n    };\n  }, [title]); \/\/ title de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r\n}\n\n\/\/ MyComponent.js\nimport React, { useState } from 'react';\nimport useDocumentTitle from '.\/useDocumentTitle';\n\nfunction MyComponent() {\n  const [name, setName] = useState('');\n\n  useDocumentTitle(name ? <code>Merhaba ${name}<\/code> : '\u0130simsiz');\n\n  return (\n    <div>\n      <input\n        type=\"text\"\n        value={name}\n        onChange={(e) => setName(e.target.value)}\n        placeholder=\"Ad\u0131n\u0131z\u0131 Girin\"\n      \/>\n      <p>Merhaba, {name || 'misafir'}!<\/p>\n    <\/div>\n  );\n}<\/code><\/pre>\n<p><code>useDocumentTitle<\/code> gibi \u00f6zel hook&#8217;lar, karma\u015f\u0131k <code>useEffect<\/code> mant\u0131\u011f\u0131n\u0131 kaps\u00fcller ve birden fazla bile\u015fen taraf\u0131ndan kolayca kullan\u0131labilir hale getirir. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve bile\u015fenlerin daha temiz ve odaklanm\u0131\u015f olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>S\u0131n\u0131f Bile\u015fenlerinden Fonksiyonel Bile\u015fenlere Ge\u00e7i\u015fin Avantajlar\u0131<\/h3>\n<p><code>useEffect<\/code> ve di\u011fer hook&#8217;lar\u0131n benimsenmesiyle birlikte, fonksiyonel bile\u015fenler React geli\u015ftirmesinde bask\u0131n paradigm haline gelmi\u015ftir. Bu ge\u00e7i\u015fin bir\u00e7ok \u00f6nemli avantaj\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Daha Temiz ve Okunabilir Kod:<\/strong> <code>useEffect<\/code>, ilgili yan etki mant\u0131\u011f\u0131n\u0131 tek bir yerde toplar, bu da kodun okunabilirli\u011fini art\u0131r\u0131r. S\u0131n\u0131f bile\u015fenlerinde ayn\u0131 mant\u0131\u011f\u0131n farkl\u0131 ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131na da\u011f\u0131lmas\u0131 sorunu ortadan kalkar.<br \/>\n*   <strong>Daha Kolay Yeniden Kullan\u0131m:<\/strong> \u00d6zel hook&#8217;lar arac\u0131l\u0131\u011f\u0131yla, durum bilgisi olan mant\u0131\u011f\u0131 (stateful logic) bile\u015fenler aras\u0131nda kolayca yeniden kullanabiliriz. Bu, HOC&#8217;ler ve Render Props gibi daha karma\u015f\u0131k desenlere olan ihtiyac\u0131 azalt\u0131r.<br \/>\n*   <strong>Daha Az Boilerplate:<\/strong> <code>this<\/code> anahtar kelimesinin ba\u011flama sorunlar\u0131, constructor&#8217;lar, <code>super()<\/code> \u00e7a\u011fr\u0131lar\u0131 gibi s\u0131n\u0131f bile\u015fenlerinin getirdi\u011fi boilerplate kod ortadan kalkar.<br \/>\n*   <strong>Daha \u0130yi Performans Optimizasyonu:<\/strong> <code>React.memo<\/code>, <code>useCallback<\/code> ve <code>useMemo<\/code> gibi hook&#8217;lar, fonksiyonel bile\u015fenlerde performans optimizasyonunu daha gran\u00fcler ve kontrol edilebilir bir \u015fekilde yapma imkan\u0131 sunar.<br \/>\n*   <strong>Daha Kolay Test Edilebilirlik:<\/strong> Fonksiyonel bile\u015fenler ve hook&#8217;lar, saf fonksiyonlara daha yak\u0131n oldu\u011fu i\u00e7in test edilmesi genellikle daha kolayd\u0131r.<br \/>\n*   <strong>Geli\u015fmi\u015f Geli\u015ftirici Deneyimi:<\/strong> Hooks, React&#8217;in gelece\u011fidir ve topluluk taraf\u0131ndan yo\u011fun bir \u015fekilde desteklenmektedir. Yeni \u00f6zellikler ve iyile\u015ftirmeler genellikle \u00f6nce hook&#8217;lar i\u00e7in geli\u015ftirilir.<\/p>\n<h3>S\u0131k\u00e7a Yap\u0131lan Hatalar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p><code>useEffect<\/code> g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, yanl\u0131\u015f kullan\u0131m\u0131 yayg\u0131n hatalara yol a\u00e7abilir:<\/p>\n<p>1.  <strong>Yanl\u0131\u015f Ba\u011f\u0131ml\u0131l\u0131k Dizisi:<\/strong><br \/>\n    *   <strong>Eksik Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> Efekt i\u00e7inde kullan\u0131lan bir de\u011fi\u015fkeni ba\u011f\u0131ml\u0131l\u0131k dizisine eklememek, eski de\u011ferlerle \u00e7al\u0131\u015fmaya (stale closures) neden olabilir. \u00c7\u00f6z\u00fcm: ESLint uyar\u0131lar\u0131n\u0131 dinleyin ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekleyin. Gerekirse <code>useCallback<\/code> veya <code>useMemo<\/code> kullan\u0131n.<br \/>\n    *   <strong>Gereksiz Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> Efektin gereksiz yere s\u0131k \u00e7al\u0131\u015fmas\u0131na neden olabilir. \u00c7\u00f6z\u00fcm: Sadece efektin \u00e7al\u0131\u015fmas\u0131n\u0131 tetiklemesi gereken de\u011fi\u015fkenleri ekleyin.<br \/>\n2.  <strong>Temizleme Fonksiyonunu Unutmak:<\/strong> \u00d6zellikle abonelikler, zamanlay\u0131c\u0131lar veya olay dinleyicileri gibi kaynaklar temizlenmezse bellek s\u0131z\u0131nt\u0131lar\u0131na yol a\u00e7ar. \u00c7\u00f6z\u00fcm: Her zaman bir yan etki kurdu\u011funuzda, onu nas\u0131l temizleyece\u011finizi d\u00fc\u015f\u00fcn\u00fcn ve uygun bir temizleme fonksiyonu d\u00f6nd\u00fcr\u00fcn.<br \/>\n3.  <strong>Asenkron \u0130\u015flemlerin Yanl\u0131\u015f Y\u00f6netimi:<\/strong> \u00d6zellikle veri getirme i\u015flemlerinde, bile\u015fen unmount edildikten sonra state&#8217;i g\u00fcncellemeye \u00e7al\u0131\u015fmak hatalara yol a\u00e7abilir (race conditions). \u00c7\u00f6z\u00fcm: <code>AbortController<\/code> veya <code>isMounted<\/code> bayra\u011f\u0131 gibi mekanizmalarla bekleyen asenkron i\u015flemleri temizleyin.<br \/>\n4.  <strong><code>useEffect<\/code>&#8216;i Yanl\u0131\u015f Anlamak:<\/strong> <code>useEffect<\/code>&#8216;i sadece <code>componentDidMount<\/code> veya <code>componentDidUpdate<\/code> olarak d\u00fc\u015f\u00fcnmek yerine, &#8220;harici bir sistemle senkronizasyon&#8221; olarak d\u00fc\u015f\u00fcnmek, daha do\u011fru ve esnek bir kullan\u0131m sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p><code>useEffect<\/code> hook&#8217;u, React&#8217;te fonksiyonel bile\u015fenlerin g\u00fcc\u00fcn\u00fc ve esnekli\u011fini devrim niteli\u011finde art\u0131rm\u0131\u015ft\u0131r. S\u0131n\u0131f bile\u015fenlerinin ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131n\u0131n yerini alarak, yan etkileri y\u00f6netme \u015feklimizi k\u00f6kten de\u011fi\u015ftirmi\u015ftir. <code>useEffect<\/code> sayesinde, ilgili mant\u0131\u011f\u0131 tek bir yerde toplayabilir, kodu daha okunabilir hale getirebilir ve \u00f6zel hook&#8217;lar arac\u0131l\u0131\u011f\u0131yla kolayca yeniden kullanabiliriz.<\/p>\n<p>Her ne kadar ba\u015flang\u0131\u00e7ta ba\u011f\u0131ml\u0131l\u0131k dizisi, temizleme fonksiyonlar\u0131 ve asenkron i\u015flemlerin y\u00f6netimi gibi konular bir \u00f6\u011frenme e\u011frisi sunsa da, <code>useEffect<\/code>&#8216;in sundu\u011fu avantajlar bu \u00e7abaya de\u011fer. Modern React uygulamalar\u0131nda fonksiyonel bile\u015fenler ve hook&#8217;lar standart haline gelmi\u015ftir ve <code>useEffect<\/code>&#8216;i ustaca kullanmak, daha sa\u011flam, bak\u0131m\u0131 daha kolay ve performansl\u0131 React uygulamalar\u0131 geli\u015ftirmek i\u00e7in temel bir beceridir. Art\u0131k React geli\u015ftiricileri, bile\u015fen ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131n\u0131n karma\u015f\u0131k d\u00fcnyas\u0131nda gezinmek yerine, bile\u015fenlerinin harici sistemlerle nas\u0131l senkronize olmas\u0131 gerekti\u011fine odaklanabilirler. Bu, React&#8217;in deklaratif do\u011fas\u0131na daha uygun ve genel olarak daha keyifli bir geli\u015ftirme deneyimi sunar.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React&#8217;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#8217;u ile De\u011fi\u015ftirmek\nReact, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in deklaratif bir yakla\u015f\u0131m","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[128],"tags":[],"class_list":{"0":"post-31532","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React&#039;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#039;u ile De\u011fi\u015ftirmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React&#039;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#039;u ile De\u011fi\u015ftirmek\" \/>\n<meta property=\"og:description\" content=\"React&#039;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#039;u ile De\u011fi\u015ftirmek React, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in deklaratif bir yakla\u015f\u0131m\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T21:41:07+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React&#8217;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#8217;u ile De\u011fi\u015ftirmek\",\"datePublished\":\"2025-10-10T21:41:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/\"},\"wordCount\":3154,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/\",\"name\":\"React'te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook'u ile De\u011fi\u015ftirmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-10T21:41:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React&#8217;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#8217;u ile De\u011fi\u015ftirmek\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React'te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook'u ile De\u011fi\u015ftirmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/","og_locale":"tr_TR","og_type":"article","og_title":"React'te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook'u ile De\u011fi\u015ftirmek","og_description":"React'te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook'u ile De\u011fi\u015ftirmek React, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in deklaratif bir yakla\u015f\u0131m","og_url":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-10T21:41:07+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React&#8217;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#8217;u ile De\u011fi\u015ftirmek","datePublished":"2025-10-10T21:41:07+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/"},"wordCount":3154,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/","url":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/","name":"React'te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook'u ile De\u011fi\u015ftirmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-10T21:41:07+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/reactte-komponent-yasam-dongulerini-useeffect-hooku-ile-degistirmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React&#8217;te Komponent Ya\u015fam D\u00f6ng\u00fclerini useEffect Hook&#8217;u ile De\u011fi\u015ftirmek"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31532"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31532\/revisions"}],"predecessor-version":[{"id":31533,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31532\/revisions\/31533"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}