{"id":34715,"date":"2025-11-21T04:30:50","date_gmt":"2025-11-21T01:30:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/"},"modified":"2025-11-21T04:30:50","modified_gmt":"2025-11-21T01:30:50","slug":"react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/","title":{"rendered":"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon"},"content":{"rendered":"<p><body><\/p>\n<p>React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan etkileri (side effects) d\u00fczenli ve performansl\u0131 bir \u015fekilde nas\u0131l ele alabiliriz? \u0130\u015fte tam da bu noktada, React&#8217;\u0131n g\u00fc\u00e7l\u00fc ve esnek Hook&#8217;u olan <code>useEffect<\/code> devreye giriyor ve bile\u015fenlerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha fonksiyonel bir bak\u0131\u015f a\u00e7\u0131s\u0131yla y\u00f6netmenizi sa\u011fl\u0131yor.<\/p>\n<p>Modern web uygulamalar\u0131, sadece statik i\u00e7erik g\u00f6stermekle kalmaz, ayn\u0131 zamanda API&#8217;lerden veri \u00e7eker, kullan\u0131c\u0131 etkile\u015fimlerine tepki verir, animasyonlar\u0131 y\u00f6netir ve taray\u0131c\u0131 API&#8217;leri (<code>localStorage<\/code>, <code>navigator<\/code> gibi) ile ileti\u015fim kurar. React d\u00fcnyas\u0131nda, bir bile\u015fenin render edilmesi s\u0131ras\u0131nda do\u011frudan ger\u00e7ekle\u015fmeyen, yani &#8220;saf&#8221; fonksiyonel olmayan t\u00fcm bu i\u015flemlere yan etki (side effect) diyoruz. \u00d6rne\u011fin, bir sunucudan veri \u00e7ekmek, bir olay dinleyicisi (event listener) eklemek, manuel olarak DOM&#8217;u manip\u00fcle etmek veya bir zamanlay\u0131c\u0131 (timer) ayarlamak tipik yan etkilerdir.<\/p>\n<p><code>useEffect<\/code> Hook&#8217;u, fonksiyonel bile\u015fenlerimizde bu yan etkileri bildirimsel bir \u015fekilde belirtmemize olanak tan\u0131r. React, bile\u015fen render edildikten sonra (veya belirli ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fti\u011finde) bu yan etkileri \u00e7al\u0131\u015ft\u0131r\u0131r. Temel olarak, <code>useEffect<\/code> bize &#8220;Bu i\u015fi, bile\u015fenim ekrana yerle\u015ftikten veya \u015fu de\u011ferler de\u011fi\u015ftikten sonra yap&#8221; deme g\u00fcc\u00fc verir. Class bile\u015fenlerindeki <code>componentDidMount<\/code>, <code>componentDidUpdate<\/code> ve <code>componentWillUnmount<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc metodlar\u0131n\u0131n birle\u015fimini modern ve daha anla\u015f\u0131l\u0131r bir yap\u0131da sunar. Bu sayede kod tekrar\u0131n\u0131 azalt\u0131r, ilgili mant\u0131\u011f\u0131 tek bir yerde toplar ve bile\u015fenlerimizin daha okunabilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><code>useEffect<\/code>&#8216;in \u00e7al\u0131\u015fma prensibini anlamak i\u00e7in temel s\u00f6zdizimine bakmak \u00f6nemlidir:<\/p>\n<pre><code class=\"language-javascript\">\n    import React, { useEffect, useState } from 'react';\n\n    function VeriCekmeBileseni() {\n      const [veri, setVeri] = useState(null);\n      const [yukleniyor, setYukleniyor] = useState(true);\n      const [hata, setHata] = useState(null);\n\n      useEffect(() => {\n        \/\/ Bu fonksiyon, bile\u015fen render edildikten sonra \u00e7al\u0131\u015f\u0131r.\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 hatas\u0131! Durum: ${response.status}<\/code>);\n            }\n            const result = await response.json();\n            setVeri(result);\n          } catch (error) {\n            setHata(error);\n          } finally {\n            setYukleniyor(false);\n          }\n        };\n\n        fetchData(); \/\/ Veri \u00e7ekme i\u015flemini ba\u015flat\n\n        \/\/ \u0130ste\u011fe ba\u011fl\u0131 temizleme fonksiyonu:\n        \/\/ Bu fonksiyon, bile\u015fen unmount edildi\u011finde veya ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fmeden \u00f6nce \u00e7al\u0131\u015f\u0131r.\n        return () => {\n          \/\/ \u00d6rne\u011fin, devam eden bir iste\u011fi iptal etme veya olay dinleyicilerini kald\u0131rma.\n          console.log('Veri \u00e7ekme efekti temizlendi.');\n        };\n      }, []); \/\/ Ba\u011f\u0131ml\u0131l\u0131k dizisi bo\u015f oldu\u011fu i\u00e7in sadece ilk render'da \u00e7al\u0131\u015f\u0131r.\n\n      if (yukleniyor) return <div>Y\u00fckleniyor...<\/div>;\n      if (hata) return <div>Hata: {hata.message}<\/div>;\n\n      return (\n        <div>\n          <h3>\u00c7ekilen Veri:<\/h3>\n          <pre>{JSON.stringify(veri, null, 2)}<\/pre>\n<\/p><\/div>\n<p>      );<br \/>\n    }<br \/>\n    <\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>useEffect<\/code> bir API'den veri \u00e7ekme i\u015flemini y\u00f6netiyor. Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi <code>[]<\/code>, bu efektin yaln\u0131zca bile\u015fen ilk kez DOM'a eklendi\u011finde (mount edildi\u011finde) bir kez \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu sayede, her yeniden render i\u015fleminde gereksiz veri \u00e7ekme isteklerinin \u00f6n\u00fcne ge\u00e7ilir, b\u00f6ylece a\u011f y\u00fck\u00fc ve performans art\u0131r\u0131lm\u0131\u015f olur. <code>useEffect<\/code>'in d\u00f6nd\u00fcrd\u00fc\u011f\u00fc opsiyonel temizleme fonksiyonu ise, bile\u015fen unmount edildi\u011finde veya efekt yeniden \u00e7al\u0131\u015fmadan \u00f6nce kaynaklar\u0131n d\u00fczg\u00fcn bir \u015fekilde serbest b\u0131rak\u0131lmas\u0131n\u0131 sa\u011flayarak bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler. Bu da <code>useEffect<\/code>'in sadece i\u015fleri ba\u015flatmakla kalmay\u0131p, ayn\u0131 zamanda sonland\u0131rmak i\u00e7in de ne kadar \u00f6nemli oldu\u011funu g\u00f6sterir.<\/p>\n<h2>Ba\u011f\u0131ml\u0131l\u0131k Dizisi (Dependency Array) Nas\u0131l \u00c7al\u0131\u015f\u0131r ve Hatalar Nas\u0131l \u00d6nlenir?<\/h2>\n<p><code>useEffect<\/code> Hook'unun en kritik ve belki de en \u00e7ok yanl\u0131\u015f anla\u015f\u0131lan par\u00e7alar\u0131ndan biri ba\u011f\u0131ml\u0131l\u0131k dizisidir. Bu dizi, React'a \"Bu efekti ne zaman yeniden \u00e7al\u0131\u015ft\u0131rmal\u0131y\u0131m?\" sorusunun cevab\u0131n\u0131 verir. Ba\u011f\u0131ml\u0131l\u0131k dizisi (ikinci arg\u00fcman), <code>useEffect<\/code>'in i\u00e7indeki callback fonksiyonunun hangi de\u011ferlere ba\u011f\u0131ml\u0131 oldu\u011funu belirtir. React, bu dizideki de\u011ferlerden herhangi birinin bir \u00f6nceki render'dan farkl\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer farkl\u0131ysa, efekt callback'ini yeniden \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<ul>\n<li><strong>Bo\u015f Dizi (<code>[]<\/code>):<\/strong> Efekt, bile\u015fen ilk monte edildi\u011finde (mount) bir kez \u00e7al\u0131\u015f\u0131r ve bir daha asla \u00e7al\u0131\u015fmaz (temizleme fonksiyonu hari\u00e7). Bu, <code>componentDidMount<\/code> davran\u0131\u015f\u0131na benzer. \u00d6rne\u011fin, ba\u015flang\u0131\u00e7 verilerini \u00e7ekmek veya olay dinleyicilerini bir kez ayarlamak i\u00e7in idealdir.<\/li>\n<li><strong>Dizi Yok (arg\u00fcman verilmemi\u015f):<\/strong> Efekt, bile\u015fen her render edildi\u011finde \u00e7al\u0131\u015f\u0131r. Bu genellikle istenmeyen bir durumdur ve performans sorunlar\u0131na yol a\u00e7abilir, \u00e7\u00fcnk\u00fc her state veya prop de\u011fi\u015fti\u011finde yan etki yeniden tetiklenir.<\/li>\n<li><strong>Dolu Dizi (<code>[dep1, dep2]<\/code>):<\/strong> Efekt, bile\u015fen ilk monte edildi\u011finde \u00e7al\u0131\u015f\u0131r ve daha sonra yaln\u0131zca <code>dep1<\/code> veya <code>dep2<\/code> de\u011ferlerinden herhangi biri de\u011fi\u015fti\u011finde yeniden \u00e7al\u0131\u015f\u0131r. Bu, <code>componentDidUpdate<\/code>'in belirli ko\u015fullar alt\u0131nda \u00e7al\u0131\u015fmas\u0131na benzer bir kontrol sa\u011flar.<\/li>\n<\/ul>\n<p><strong>Vaka Analizi: Kullan\u0131c\u0131 ID'sine G\u00f6re Veri \u00c7ekme<\/strong><\/p>\n<p>Bir kullan\u0131c\u0131 profil sayfas\u0131nda, URL'den al\u0131nan <code>userId<\/code> prop'una g\u00f6re kullan\u0131c\u0131 verilerini \u00e7ekmemiz gerekti\u011fini d\u00fc\u015f\u00fcnelim. Kullan\u0131c\u0131 ID'si de\u011fi\u015fti\u011finde verilerin g\u00fcncellenmesi gerekir.<\/p>\n<pre><code class=\"language-javascript\">\n    import React, { useEffect, useState } from 'react';\n\n    function KullaniciProfilBileseni({ userId }) {\n      const [kullaniciVerisi, setKullaniciVerisi] = useState(null);\n      const [yukleniyor, setYukleniyor] = useState(true);\n\n      useEffect(() => {\n        setYukleniyor(true); \/\/ Yeni veri \u00e7ekilirken y\u00fcklenme durumunu ayarla\n        const fetchKullanici = async () => {\n          try {\n            const response = await fetch(<code>https:\/\/api.example.com\/users\/${userId}<\/code>);\n            const data = await response.json();\n            setKullaniciVerisi(data);\n          } catch (error) {\n            console.error('Kullan\u0131c\u0131 verisi \u00e7ekilirken hata olu\u015ftu:', error);\n          } finally {\n            setYukleniyor(false);\n          }\n        };\n\n        fetchKullanici();\n\n        \/\/ Temizleme fonksiyonu (iste\u011fe ba\u011fl\u0131, burada gerekli de\u011filse de iyi bir pratiktir)\n        return () => {\n          \/\/ \u00d6rne\u011fin, devam eden bir iste\u011fi iptal etmek i\u00e7in kullan\u0131labilir.\n          console.log(<code>Kullan\u0131c\u0131 ID ${userId} i\u00e7in efekt temizlendi.<\/code>);\n        };\n      }, [userId]); \/\/ userId de\u011fi\u015fti\u011finde efekti yeniden \u00e7al\u0131\u015ft\u0131r.\n\n      if (yukleniyor) return <div>Kullan\u0131c\u0131 bilgileri y\u00fckleniyor...<\/div>;\n      if (!kullaniciVerisi) return <div>Kullan\u0131c\u0131 bulunamad\u0131.<\/div>;\n\n      return (\n        <div>\n          <h3>Kullan\u0131c\u0131 Profili<\/h3>\n          <p>Ad: {kullaniciVerisi.name}<\/p>\n          <p>Email: {kullaniciVerisi.email}<\/p>\n        <\/div>\n      );\n    }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, ba\u011f\u0131ml\u0131l\u0131k dizisindeki <code>[userId]<\/code>, React'a <code>userId<\/code> prop'u her de\u011fi\u015fti\u011finde efekti yeniden \u00e7al\u0131\u015ft\u0131rmas\u0131 gerekti\u011fini s\u00f6yler. E\u011fer <code>userId<\/code> de\u011fi\u015fmezse, bile\u015fen yeniden render olsa bile efekt yeniden \u00e7al\u0131\u015fmaz, bu da gereksiz a\u011f isteklerini \u00f6nler. Ancak, ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru bir \u015fekilde belirtmek \u00e7ok \u00f6nemlidir. E\u011fer <code>userId<\/code>'yi ba\u011f\u0131ml\u0131l\u0131k dizisinden \u00e7\u0131kar\u0131rsan\u0131z, efekt sadece bile\u015fen ilk monte edildi\u011finde \u00e7al\u0131\u015f\u0131r ve <code>userId<\/code> daha sonra de\u011fi\u015fse bile yeni verileri \u00e7ekmez. Bu \"stale closure\" (eskimi\u015f kapan\u0131\u015f) sorununa yol a\u00e7abilir, yani efektin i\u00e7inde kullan\u0131lan <code>userId<\/code> de\u011feri ilk render'daki de\u011fer olarak kal\u0131r.<\/p>\n<div class=\"tip-box\">\n      Uzman \u0130pucu: Ba\u011f\u0131ml\u0131l\u0131k dizisini asla yalan s\u00f6ylemeyin! Efektinizin i\u00e7inde kulland\u0131\u011f\u0131n\u0131z herhangi bir state, prop veya fonksiyondan (<code>useCallback<\/code> veya <code>useMemo<\/code> ile sarmalanmam\u0131\u015fsa) ba\u011f\u0131ml\u0131l\u0131k olarak eklemeyi unutmay\u0131n. eslint-plugin-react-hooks'un <code>exhaustive-deps<\/code> kural\u0131 bu konuda size b\u00fcy\u00fck \u00f6l\u00e7\u00fcde yard\u0131mc\u0131 olacakt\u0131r.\n    <\/div>\n<p>Ayr\u0131ca, ba\u011f\u0131ml\u0131l\u0131k dizisine nesne veya dizi gibi referans tiplerini do\u011frudan eklerken dikkatli olmal\u0131s\u0131n\u0131z. JavaScript'te nesneler ve diziler referansla kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r, bu da her render'da yeni bir nesne veya dizi olu\u015fturuldu\u011funda, i\u00e7eri\u011fi ayn\u0131 olsa bile <code>useEffect<\/code>'in yeniden \u00e7al\u0131\u015fmas\u0131na neden olabilir. Bu durumu \u00f6nlemek i\u00e7in, bu t\u00fcr de\u011ferleri <code>useMemo<\/code> ile sarmalayarak referans stabilitesini sa\u011flayabilirsiniz.<\/p>\n<h2>Temizleme Fonksiyonu (Cleanup Function) Nedir ve Neden \u00d6nemlidir?<\/h2>\n<p><code>useEffect<\/code> sadece yan etkileri ba\u015flatmakla kalmaz, ayn\u0131 zamanda onlar\u0131 d\u00fczg\u00fcn bir \u015fekilde sonland\u0131rmam\u0131za da olanak tan\u0131r. \u0130\u015fte bu noktada, <code>useEffect<\/code> callback'inden d\u00f6nd\u00fcr\u00fclen temizleme fonksiyonu (cleanup function) devreye girer. Bu fonksiyon, bile\u015fen DOM'dan kald\u0131r\u0131lmadan (unmount) \u00f6nce veya bir sonraki render'da efekt yeniden \u00e7al\u0131\u015fmadan \u00f6nce tetiklenir.<\/p>\n<p>Temizleme fonksiyonunun temel amac\u0131, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek ve gereksiz kaynak t\u00fcketimini durdurmakt\u0131r. React, bir efektin bir \u00f6nceki \u00e7al\u0131\u015fmas\u0131ndan kaynaklanan herhangi bir aboneli\u011fi, olay dinleyicisini veya zamanlay\u0131c\u0131y\u0131 kald\u0131rmak i\u00e7in bu fonksiyonu kullan\u0131r. Bu mekanizma, uygulaman\u0131z\u0131n uzun vadeli kararl\u0131l\u0131\u011f\u0131 ve performans\u0131 i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<p><strong>Vaka Analizi: Pencere Yeniden Boyutland\u0131rma Dinleyicisi Y\u00f6netimi<\/strong><\/p>\n<p>Bir bile\u015fenin, pencerenin boyutunu her de\u011fi\u015fti\u011finde takip etmesi gerekti\u011fini ve bu bilgiyi kullanarak aray\u00fcz\u00fcn\u00fc g\u00fcncellemesi gerekti\u011fini d\u00fc\u015f\u00fcnelim.<\/p>\n<pre><code class=\"language-javascript\">\n    import React, { useEffect, useState } from 'react';\n\n    function PencereBoyutuGosterici() {\n      const [boyut, setBoyut] = useState({\n        genislik: window.innerWidth,\n        yukseklik: window.innerHeight,\n      });\n\n      useEffect(() => {\n        const handleResize = () => {\n          setBoyut({\n            genislik: window.innerWidth,\n            yukseklik: window.innerHeight,\n          });\n        };\n\n        window.addEventListener('resize', handleResize); \/\/ Olay dinleyicisini ekle\n\n        \/\/ Temizleme fonksiyonu:\n        return () => {\n          window.removeEventListener('resize', handleResize); \/\/ Bile\u015fen unmount edildi\u011finde kald\u0131r\n          console.log('Pencere boyutu dinleyicisi kald\u0131r\u0131ld\u0131.');\n        };\n      }, []); \/\/ Sadece bile\u015fen ilk monte edildi\u011finde bir kez ayarla\n\n      return (\n        <div>\n          <h3>Pencere Boyutu<\/h3>\n          <p>Geni\u015flik: {boyut.genislik}px<\/p>\n          <p>Y\u00fckseklik: {boyut.yukseklik}px<\/p>\n        <\/div>\n      );\n    }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>useEffect<\/code> ile bir <code>'resize'<\/code> olay dinleyicisi ekleniyor. E\u011fer temizleme fonksiyonunu sa\u011flamazsak ve bile\u015fen DOM'dan kald\u0131r\u0131l\u0131rsa, <code>handleResize<\/code> fonksiyonu hala \u00e7al\u0131\u015fmaya devam ederdi. Bu, kald\u0131r\u0131lm\u0131\u015f bir bile\u015fenin state'ini g\u00fcncellemeye \u00e7al\u0131\u015farak hatalara yol a\u00e7abilir ve potansiyel olarak uygulaman\u0131zda performans sorunlar\u0131na neden olabilir. Temizleme fonksiyonu (<code>return () => { ... }<\/code>), bile\u015fen unmount edildi\u011finde veya ba\u011f\u0131ml\u0131l\u0131klar (bu \u00f6rnekte bo\u015f dizi oldu\u011fu i\u00e7in sadece unmount durumunda) de\u011fi\u015fti\u011finde dinleyiciyi kald\u0131r\u0131r. Bu, uygulaman\u0131n daha kararl\u0131 ve verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Temizleme fonksiyonu ayr\u0131ca, bir <code>useEffect<\/code> i\u00e7inde ba\u015flat\u0131lan aboneliklerin (WebSockets gibi), zamanlay\u0131c\u0131lar\u0131n (<code>setTimeout<\/code>, <code>setInterval<\/code>) veya di\u011fer uzun \u00f6m\u00fcrl\u00fc i\u015flemlerin iptal edilmesi i\u00e7in de kullan\u0131l\u0131r. Herhangi bir harici kayna\u011fa ba\u011fland\u0131\u011f\u0131n\u0131zda veya k\u00fcresel bir \u015feye m\u00fcdahale etti\u011finizde, genellikle bir temizleme fonksiyonuna ihtiyac\u0131n\u0131z vard\u0131r. Bu, React'\u0131n tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131n\u0131 ve bile\u015fen izolasyonunu koruman\u0131n \u00f6nemli bir par\u00e7as\u0131d\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n    function ZamanlayiciBileseni() {\n      const [saniye, setSaniye] = useState(0);\n\n      useEffect(() => {\n        const intervalId = setInterval(() => {\n          setSaniye(prevSaniye => prevSaniye + 1);\n        }, 1000);\n\n        \/\/ Zamanlay\u0131c\u0131y\u0131 temizle\n        return () => {\n          clearInterval(intervalId);\n          console.log('Zamanlay\u0131c\u0131 durduruldu.');\n        };\n      }, []); \/\/ Sadece ilk render'da ba\u015fla\n\n      return <p>Ge\u00e7en S\u00fcre: {saniye} saniye<\/p>;\n    }\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda, <code>clearInterval(intervalId)<\/code> \u00e7a\u011fr\u0131s\u0131, bile\u015fen ekrandan kald\u0131r\u0131ld\u0131\u011f\u0131nda zamanlay\u0131c\u0131n\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 durdurur. Aksi takdirde, bile\u015fen olmasa bile her saniye state g\u00fcncellemesi yapmaya \u00e7al\u0131\u015farak hata ve performans sorunlar\u0131na yol a\u00e7ard\u0131. Bu nedenle, <code>useEffect<\/code> kullan\u0131rken temizleme fonksiyonunu d\u00fc\u015f\u00fcnmek, sa\u011flam ve hatas\u0131z uygulamalar yazmak i\u00e7in kritik bir ad\u0131md\u0131r.<\/p>\n<h2>Performans Optimizasyonu: useEffect ile Gereksiz Yeniden \u00c7al\u0131\u015fmalar\u0131 \u00d6nleme<\/h2>\n<p><code>useEffect<\/code> do\u011fru kullan\u0131lmad\u0131\u011f\u0131nda, React uygulaman\u0131zda ciddi performans d\u00fc\u015f\u00fc\u015flerine neden olabilir. \u00d6zellikle ba\u011f\u0131ml\u0131l\u0131k dizisini yanl\u0131\u015f belirlemek veya hi\u00e7 belirtmemek, efektin her render'da gereksiz yere \u00e7al\u0131\u015fmas\u0131na yol a\u00e7ar. Bu da s\u0131k s\u0131k a\u011f istekleri g\u00f6ndermeye, a\u011f\u0131r hesaplamalar yapmaya veya DOM'u gereksiz yere manip\u00fcle etmeye neden olabilir.<\/p>\n<p>Performans\u0131 optimize etmek i\u00e7in, <code>useEffect<\/code>'in yaln\u0131zca ger\u00e7ekten ihtiya\u00e7 duyuldu\u011funda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak esast\u0131r. Bunun i\u00e7in en \u00f6nemli ara\u00e7, elbette ba\u011f\u0131ml\u0131l\u0131k dizisidir. Ancak bazen ba\u011f\u0131ml\u0131l\u0131k dizisine eklemeniz gereken bir fonksiyon veya nesne, her render'da yeniden olu\u015fturuldu\u011fu i\u00e7in efekti gereksiz yere tetikleyebilir. \u0130\u015fte bu noktada <code>useCallback<\/code> ve <code>useMemo<\/code> Hook'lar\u0131 devreye girer.<\/p>\n<ul>\n<li><strong><code>useCallback<\/code>:<\/strong> Bir fonksiyonun referans\u0131n\u0131 haf\u0131zaya (memoize) al\u0131r. E\u011fer bir fonksiyonu <code>useEffect<\/code>'in ba\u011f\u0131ml\u0131l\u0131k dizisine eklemeniz gerekiyorsa ve bu fonksiyon prop olarak alt bile\u015fenlere ge\u00e7iriliyorsa, <code>useCallback<\/code> kullanarak bu fonksiyonun referans\u0131n\u0131n her render'da de\u011fi\u015fmesini engelleyebilirsiniz. Bu, hem <code>useEffect<\/code>'in gereksiz \u00e7al\u0131\u015fmas\u0131n\u0131 \u00f6nler hem de alt bile\u015fenlerin gereksiz yeniden render edilmesini engeller.<\/li>\n<li><strong><code>useMemo<\/code>:<\/strong> Bir de\u011ferin (nesne, dizi veya karma\u015f\u0131k hesaplama sonucu) referans\u0131n\u0131 haf\u0131zaya al\u0131r. E\u011fer <code>useEffect<\/code> i\u00e7inde veya ba\u011f\u0131ml\u0131l\u0131k dizisinde kullan\u0131lan bir nesne veya dizi, her render'da yeni bir referansla olu\u015fturuluyorsa, <code>useMemo<\/code> kullanarak bu referans\u0131n stabil kalmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/li>\n<\/ul>\n<p><strong>Vaka Analizi: Performansl\u0131 Arama Filtresi<\/strong><\/p>\n<p>Bir \u00fcr\u00fcn listesi uygulamas\u0131 d\u00fc\u015f\u00fcn\u00fcn. Kullan\u0131c\u0131 bir arama terimi girdi\u011finde, sunucudan filtrelenmi\u015f verileri \u00e7ekmemiz gerekiyor. Ancak her tu\u015f vuru\u015funda istek g\u00f6ndermek yerine, kullan\u0131c\u0131n\u0131n yazmay\u0131 bitirmesini beklemeliyiz (debounce).<\/p>\n<pre><code class=\"language-javascript\">\n    import React, { useEffect, useState, useMemo } from 'react';\n\n    function UrunArama({ aramaTerimi }) {\n      const [urunler, setUrunler] = useState([]);\n      const [yukleniyor, setYukleniyor] = useState(false);\n      const [debouncedAramaTerimi, setDebouncedAramaTerimi] = useState(aramaTerimi);\n\n      \/\/ aramaTerimi de\u011fi\u015fti\u011finde debouncedAramaTerimi'ni g\u00fcncelle\n      \/\/ Kullan\u0131c\u0131n\u0131n yazmay\u0131 bitirmesini bekler\n      useEffect(() => {\n        setYukleniyor(true);\n        const handler = setTimeout(() => {\n          setDebouncedAramaTerimi(aramaTerimi);\n        }, 500); \/\/ 500ms bekle\n\n        return () => {\n          clearTimeout(handler); \/\/ Zamanlay\u0131c\u0131y\u0131 temizle\n        };\n      }, [aramaTerimi]); \/\/ aramaTerimi her de\u011fi\u015fti\u011finde bu efekti \u00e7al\u0131\u015ft\u0131r\n\n      \/\/ Debounced arama terimi de\u011fi\u015fti\u011finde API'den veri \u00e7ek\n      useEffect(() => {\n        if (!debouncedAramaTerimi) {\n          setUrunler([]); \/\/ Arama terimi yoksa bo\u015falt\n          setYukleniyor(false);\n          return;\n        }\n\n        const fetchUrunler = async () => {\n          try {\n            const response = await fetch(<code>https:\/\/api.example.com\/products?q=${debouncedAramaTerimi}<\/code>);\n            const data = await response.json();\n            setUrunler(data);\n          } catch (error) {\n            console.error('\u00dcr\u00fcnler \u00e7ekilirken hata olu\u015ftu:', error);\n          } finally {\n            setYukleniyor(false);\n          }\n        };\n\n        fetchUrunler();\n      }, [debouncedAramaTerimi]); \/\/ Yaln\u0131zca debouncedAramaTerimi de\u011fi\u015fti\u011finde \u00e7al\u0131\u015f\u0131r\n\n      return (\n        <div>\n          <h3>\u00dcr\u00fcn Arama Sonu\u00e7lar\u0131 ({aramaTerimi})<\/h3>\n          {yukleniyor && <p>\u00dcr\u00fcnler aran\u0131yor...<\/p>}\n          <ul>\n            {urunler.map(urun => (\n              <li key={urun.id}>{urun.name}<\/li>\n            ))}\n          <\/ul>\n        <\/div>\n      );\n    }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte iki ayr\u0131 <code>useEffect<\/code> kullan\u0131lm\u0131\u015ft\u0131r. \u0130lk <code>useEffect<\/code>, <code>aramaTerimi<\/code> prop'u her de\u011fi\u015fti\u011finde bir gecikme (debounce) uygular ve bu sayede <code>debouncedAramaTerimi<\/code> state'ini sadece kullan\u0131c\u0131 yazmay\u0131 b\u0131rakt\u0131\u011f\u0131nda g\u00fcnceller. \u0130kinci <code>useEffect<\/code> ise, yaln\u0131zca <code>debouncedAramaTerimi<\/code> de\u011fi\u015fti\u011finde API iste\u011fini g\u00f6nderir. Bu yakla\u015f\u0131m, gereksiz API isteklerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azaltarak hem sunucu y\u00fck\u00fcn\u00fc hafifletir hem de kullan\u0131c\u0131 aray\u00fcz\u00fc deneyimini iyile\u015ftirir.<\/p>\n<div class=\"tip-box\">\n      Uyar\u0131: <code>useEffect<\/code> i\u00e7inde karma\u015f\u0131k ve pahal\u0131 hesaplamalar yap\u0131yorsan\u0131z, bu hesaplamalar\u0131n sonucunu <code>useMemo<\/code> ile \u00f6nbelle\u011fe almay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu, efektin i\u00e7indeki mant\u0131\u011f\u0131n her \u00e7al\u0131\u015fmas\u0131nda ayn\u0131 hesaplamay\u0131 tekrarlamas\u0131n\u0131 \u00f6nler, b\u00f6ylece \u00f6zellikle b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken performans art\u0131\u015f\u0131 sa\u011flar.\n    <\/div>\n<p>Ayr\u0131ca, bazen farkl\u0131 yan etkileri tek bir <code>useEffect<\/code> i\u00e7inde birle\u015ftirmek yerine, ilgili yan etkileri mant\u0131ksal olarak ayr\u0131 <code>useEffect<\/code> bloklar\u0131na b\u00f6lmek daha iyi bir stratejidir. Bu, her bir yan etkinin kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131na sahip olmas\u0131n\u0131 sa\u011flar ve tek bir b\u00fcy\u00fck efektten kaynaklanabilecek gereksiz yeniden \u00e7al\u0131\u015fmalar\u0131 \u00f6nler. Kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 da kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, bir API'den veri \u00e7ekmek i\u00e7in bir <code>useEffect<\/code> ve bir olay dinleyicisi eklemek i\u00e7in ba\u015fka bir <code>useEffect<\/code> kullanmak daha do\u011fru bir yakla\u015f\u0131md\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Senaryolar: useEffect ile Asenkron \u0130\u015flemler ve Veri Senkronizasyonu<\/h2>\n<p><code>useEffect<\/code> Hook'u, sadece basit yan etkileri y\u00f6netmekle kalmaz, ayn\u0131 zamanda asenkron veri ak\u0131\u015flar\u0131n\u0131 ve karma\u015f\u0131k senkronizasyon senaryolar\u0131n\u0131 da g\u00fc\u00e7l\u00fc bir \u015fekilde ele alabilir. Modern uygulamalarda s\u0131k\u00e7a kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z API \u00e7a\u011fr\u0131lar\u0131, WebSocket abonelikleri veya zamanlanm\u0131\u015f g\u00f6revler gibi asenkron i\u015flemler, <code>useEffect<\/code> ile g\u00fcvenli ve etkin bir \u015fekilde y\u00f6netilebilir.<\/p>\n<p>Ancak, <code>useEffect<\/code>'in callback fonksiyonu do\u011frudan bir <code>async<\/code> fonksiyon olamaz. \u00c7\u00fcnk\u00fc <code>async<\/code> fonksiyonlar her zaman bir Promise d\u00f6nd\u00fcr\u00fcr ve <code>useEffect<\/code>'ten bir Promise d\u00f6nd\u00fcrmek, React'\u0131n bekledi\u011fi bir temizleme fonksiyonu de\u011fil, farkl\u0131 bir davran\u0131\u015ft\u0131r. Bu durumu \u00e7\u00f6zmek i\u00e7in, <code>useEffect<\/code> i\u00e7inde asenkron bir fonksiyon tan\u0131mlay\u0131p onu hemen \u00e7a\u011f\u0131rmak yayg\u0131n bir desendir:<\/p>\n<pre><code class=\"language-javascript\">\n    import React, { useEffect, useState } from 'react';\n\n    function AsyncVeriCekme({ id }) {\n      const [veri, setVeri] = useState(null);\n      const [yukleniyor, setYukleniyor] = useState(true);\n\n      useEffect(() => {\n        let isCancelled = false; \/\/ Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in flag\n\n        const fetchVeri = async () => {\n          setYukleniyor(true);\n          try {\n            const response = await fetch(<code>https:\/\/api.example.com\/items\/${id}<\/code>);\n            const result = await response.json();\n            if (!isCancelled) { \/\/ Bile\u015fen unmount edilmediyse state'i g\u00fcncelle\n              setVeri(result);\n            }\n          } catch (error) {\n            if (!isCancelled) {\n              console.error(\"Veri \u00e7ekme hatas\u0131:\", error);\n            }\n          } finally {\n            if (!isCancelled) {\n              setYukleniyor(false);\n            }\n          }\n        };\n\n        fetchVeri();\n\n        \/\/ Temizleme fonksiyonu:\n        return () => {\n          isCancelled = true; \/\/ Bile\u015fen unmount edildi\u011finde veya id de\u011fi\u015fti\u011finde iste\u011fi iptal et\n          console.log(<code>Asenkron i\u015flem ${id} iptal edildi.<\/code>);\n        };\n      }, [id]); \/\/ id de\u011fi\u015fti\u011finde efekti yeniden \u00e7al\u0131\u015ft\u0131r\n\n      if (yukleniyor) return <div>Veriler y\u00fckleniyor...<\/div>;\n      if (!veri) return <div>Veri bulunamad\u0131.<\/div>;\n\n      return (\n        <div>\n          <h3>\u00d6\u011fe: {veri.name}<\/h3>\n          <p>A\u00e7\u0131klama: {veri.description}<\/p>\n        <\/div>\n      );\n    }\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>fetchVeri<\/code> ad\u0131nda bir <code>async<\/code> fonksiyon tan\u0131mlan\u0131r ve hemen \u00e7a\u011fr\u0131l\u0131r. En \u00f6nemlisi, bir <code>isCancelled<\/code> bayra\u011f\u0131 kullan\u0131larak, bile\u015fen unmount edildi\u011finde veya <code>id<\/code> de\u011fi\u015fti\u011finde (yani efekt yeniden \u00e7al\u0131\u015fmadan \u00f6nce) asenkron i\u015flemin sonucunun state'i g\u00fcncellemesini engelleriz. Bu, \"race condition\" (yar\u0131\u015f durumu) olarak bilinen bir sorunu \u00f6nler; yani eski bir iste\u011fin daha yeni bir iste\u011fin verilerini ezmesini engeller. Bu, \u00f6zellikle h\u0131zl\u0131ca de\u011fi\u015fen ba\u011f\u0131ml\u0131l\u0131klarla \u00e7al\u0131\u015fan veya bile\u015fenin h\u0131zl\u0131ca mount\/unmount oldu\u011fu durumlarda kritik bir optimizasyondur.<\/p>\n<h3>React'ta Responsive Tasar\u0131m ve useEffect<\/h3>\n<p><code>useEffect<\/code>, sadece veri \u00e7ekme gibi i\u015flemler i\u00e7in de\u011fil, ayn\u0131 zamanda responsive UI davran\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in de kullan\u0131labilir. \u00d6rne\u011fin, ekran boyutuna g\u00f6re farkl\u0131 bile\u015fenler render etmek veya stil kurallar\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmek isteyebilirsiniz. Temizleme fonksiyonu ile olay dinleyicilerini d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmek bu t\u00fcr senaryolarda \u00e7ok \u00f6nemlidir.<\/p>\n<pre><code class=\"language-css\">\n    <style>\n      .responsive-text {\n        font-size: 16px;\n      }\n\n      @media (min-width: 768px) {\n        .responsive-text {\n          font-size: 20px;\n          color: blue;\n        }\n      }\n\n      @media (min-width: 1024px) {\n        .responsive-text {\n          font-size: 24px;\n          color: green;\n        }\n      }\n    <\/style>\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS \u00f6rne\u011fi, farkl\u0131 ekran boyutlar\u0131na g\u00f6re yaz\u0131 tipini ve rengi de\u011fi\u015ftiren temel bir responsive stil sa\u011flar. <code>useEffect<\/code> ile JavaScript kullanarak da dinamik stiller uygulayabilir veya bile\u015fenin davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirebilirsiniz. \u00d6rne\u011fin, belirli bir e\u015fik de\u011ferinin alt\u0131nda bir mobil men\u00fc g\u00f6stermek i\u00e7in <code>window.innerWidth<\/code> de\u011ferini takip edip bir state'i g\u00fcncelleyebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\n    import React, { useEffect, useState } from 'react';\n\n    function ResponsiveMenu() {\n      const [isMobile, setIsMobile] = useState(window.innerWidth < 768);\n\n      useEffect(() => {\n        const handleResize = () => {\n          setIsMobile(window.innerWidth < 768);\n        };\n\n        window.addEventListener('resize', handleResize);\n\n        return () => {\n          window.removeEventListener('resize', handleResize);\n        };\n      }, []); \/\/ Sadece ilk render'da \u00e7al\u0131\u015f\u0131r\n\n      return (\n        <nav>\n          {isMobile ? (\n            <button>Men\u00fc<\/button> \/\/ Mobil men\u00fc ikonu\n          ) : (\n            <ul>\n              <li>Anasayfa<\/li>\n              <li>Hakk\u0131m\u0131zda<\/li>\n              <li>\u0130leti\u015fim<\/li>\n            <\/ul>\n          )}\n          <p class=\"responsive-text\">Bu metin, ekran boyutuna g\u00f6re de\u011fi\u015fecek.<\/p>\n        <\/nav>\n      );\n    }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu bile\u015fen, pencere boyutunu izler ve <code>isMobile<\/code> state'ini g\u00fcncelleyerek farkl\u0131 men\u00fc g\u00f6r\u00fcn\u00fcmleri sunar. B\u00f6ylece <code>useEffect<\/code>, sadece backend ile ileti\u015fimde de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn dinamik adaptasyonunda da kritik bir rol oynar.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p><code>useEffect<\/code> Hook'u, React fonksiyonel bile\u015fenlerimizde yan etkileri y\u00f6netmek i\u00e7in paha bi\u00e7ilmez bir ara\u00e7t\u0131r. Bile\u015fenlerin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc modern ve bildirimsel bir yakla\u015f\u0131mla ele almam\u0131z\u0131 sa\u011flayarak, veri \u00e7ekme, olay dinleyicileri ekleme, DOM manip\u00fclasyonu gibi d\u0131\u015f d\u00fcnya ile etkile\u015fimleri g\u00fcvenli ve performansl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirmemize olanak tan\u0131r. Ba\u011f\u0131ml\u0131l\u0131k dizisini do\u011fru kullanmak ve temizleme fonksiyonunun \u00f6nemini anlamak, yayg\u0131n hatalardan ka\u00e7\u0131nmak ve uygulamalar\u0131n\u0131z\u0131n uzun vadeli kararl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Ayr\u0131ca, <code>useCallback<\/code> ve <code>useMemo<\/code> gibi optimizasyon ara\u00e7lar\u0131yla birlikte kullan\u0131ld\u0131\u011f\u0131nda, <code>useEffect<\/code> React uygulamalar\u0131n\u0131z\u0131n sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda h\u0131zl\u0131 ve verimli olmas\u0131n\u0131 da garantiler.<\/p>\n<p><code>useEffect<\/code>'in g\u00fcc\u00fcn\u00fc ve inceliklerini kavrad\u0131k\u00e7a, daha temiz, daha bak\u0131m\u0131 kolay ve daha performansl\u0131 React bile\u015fenleri yazma yetene\u011finiz artacakt\u0131r. Bu, modern React geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve her React geli\u015ftiricisinin derinlemesine anlamas\u0131 gereken bir konudur.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n            <strong><code>useEffect<\/code> neden do\u011frudan bir <code>async<\/code> fonksiyon olamaz?<\/strong><\/p>\n<p><code>useEffect<\/code>'in callback fonksiyonu bir temizleme fonksiyonu d\u00f6nd\u00fcrmeyi beklerken, do\u011frudan <code>async<\/code> olarak tan\u0131mlanan bir fonksiyon her zaman bir Promise d\u00f6nd\u00fcr\u00fcr. React, bu Promise'i bir temizleme fonksiyonu olarak alg\u0131layamaz, bu da beklenmedik davran\u0131\u015flara veya hatalara yol a\u00e7abilir. Bu y\u00fczden asenkron i\u015flemleri <code>useEffect<\/code> i\u00e7inde tan\u0131mlanan ba\u015fka bir <code>async<\/code> fonksiyon ile y\u00f6netmek en iyi yoldur.<\/p>\n<\/li>\n<li>\n            <strong>Ba\u011f\u0131ml\u0131l\u0131k dizisini bo\u015f b\u0131rakmak ile hi\u00e7 ba\u011f\u0131ml\u0131l\u0131k dizisi vermemek aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p>Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi (<code>[]<\/code>), efektin yaln\u0131zca bile\u015fen ilk monte edildi\u011finde (mount) bir kez \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Hi\u00e7 ba\u011f\u0131ml\u0131l\u0131k dizisi vermemek ise, efektin bile\u015fenin her yeniden render edildi\u011finde \u00e7al\u0131\u015fmas\u0131na neden olur. Bu genellikle istenmeyen bir durumdur ve performans sorunlar\u0131na yol a\u00e7ar, \u00e7\u00fcnk\u00fc her state veya prop de\u011fi\u015fti\u011finde yan etki yeniden tetiklenir.<\/p>\n<\/li>\n<li>\n            <strong><code>useEffect<\/code> i\u00e7indeki sonsuz d\u00f6ng\u00fcler nas\u0131l \u00f6nlenir?<\/strong><\/p>\n<p>Sonsuz d\u00f6ng\u00fcler genellikle yanl\u0131\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi kullan\u0131m\u0131ndan kaynaklan\u0131r. \u00d6rne\u011fin, bir state'i g\u00fcncelleyen bir efekti, g\u00fcncelledi\u011fi state'i ba\u011f\u0131ml\u0131l\u0131k dizisine eklemeden kullanmak sonsuz d\u00f6ng\u00fcye yol a\u00e7abilir. Bunu \u00f6nlemek i\u00e7in, efektin i\u00e7inde kullan\u0131lan t\u00fcm state'leri, prop'lar\u0131 ve stable olmayan fonksiyonlar\u0131 ba\u011f\u0131ml\u0131l\u0131k dizisine ekledi\u011finizden emin olun. Ayr\u0131ca, referans de\u011fi\u015fti\u011fi i\u00e7in efekti tetikleyen nesne ve fonksiyonlar i\u00e7in <code>useCallback<\/code> veya <code>useMemo<\/code> kullanmak da d\u00f6ng\u00fcleri engellemeye yard\u0131mc\u0131 olur.<\/p>\n<\/li>\n<li>\n            <strong>Birden fazla <code>useEffect<\/code> kullanmak iyi bir pratik midir?<\/strong><\/p>\n<p>Evet, genellikle iyi bir pratiktir. Farkl\u0131 yan etkileri (\u00f6rne\u011fin, veri \u00e7ekme ve olay dinleyicisi ekleme) ayr\u0131 <code>useEffect<\/code> Hook'lar\u0131na b\u00f6lmek, kodun daha okunabilir, bak\u0131m\u0131 daha kolay ve daha performansl\u0131 olmas\u0131n\u0131 sa\u011flar. Her <code>useEffect<\/code> kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131na sahip olabilir, bu da her bir yan etkinin yaln\u0131zca gerekti\u011finde \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder.<\/p>\n<\/li>\n<li>\n            <strong><code>useEffect<\/code> yerine <code>useLayoutEffect<\/code> ne zaman kullanmal\u0131y\u0131z?<\/strong><\/p>\n<p><code>useEffect<\/code>, DOM g\u00fcncellemeleri ekrana yans\u0131t\u0131ld\u0131ktan sonra asenkron olarak \u00e7al\u0131\u015f\u0131r. <code>useLayoutEffect<\/code> ise, DOM g\u00fcncellemeleri ekrana yans\u0131t\u0131lmadan hemen \u00f6nce senkron olarak \u00e7al\u0131\u015f\u0131r. E\u011fer DOM'u \u00f6l\u00e7meniz, de\u011fi\u015ftirmeyi planlad\u0131\u011f\u0131n\u0131z bir stil okuman\u0131z veya taray\u0131c\u0131n\u0131n bir sonraki boyama i\u015fleminden \u00f6nce g\u00f6rsel bir de\u011fi\u015fikli\u011fi tetiklemeniz gerekiyorsa <code>useLayoutEffect<\/code> kullanmal\u0131s\u0131n\u0131z. Ancak \u00e7o\u011fu yan etki i\u00e7in <code>useEffect<\/code> yeterlidir ve daha iyi performansa sahiptir.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan&hellip;","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-34715","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 useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon<\/title>\n<meta name=\"description\" content=\"React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan etkileri (side effects) d\u00fczenli ve performansl\u0131 bir \u015fekilde nas\u0131l ele alabiliriz? \u0130\u015fte tam da bu noktada, React&#039;\u0131n g\u00fc\u00e7l\u00fc ve esnek Hook&#039;u olan useEffect devreye giriyor ve bile\u015fenlerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha fonksiyonel bir bak\u0131\u015f a\u00e7\u0131s\u0131yla y\u00f6netmenizi sa\u011fl\u0131yor.\" \/>\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\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon\" \/>\n<meta property=\"og:description\" content=\"React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan etkileri (side effects) d\u00fczenli ve performansl\u0131 bir \u015fekilde nas\u0131l ele alabiliriz? \u0130\u015fte tam da bu noktada, React&#039;\u0131n g\u00fc\u00e7l\u00fc ve esnek Hook&#039;u olan useEffect devreye giriyor ve bile\u015fenlerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha fonksiyonel bir bak\u0131\u015f a\u00e7\u0131s\u0131yla y\u00f6netmenizi sa\u011fl\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-21T01:30:50+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon\",\"datePublished\":\"2025-11-21T01:30:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/\"},\"wordCount\":2823,\"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\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/\",\"name\":\"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-21T01:30:50+00:00\",\"description\":\"React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan etkileri (side effects) d\u00fczenli ve performansl\u0131 bir \u015fekilde nas\u0131l ele alabiliriz? \u0130\u015fte tam da bu noktada, React'\u0131n g\u00fc\u00e7l\u00fc ve esnek Hook'u olan useEffect devreye giriyor ve bile\u015fenlerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha fonksiyonel bir bak\u0131\u015f a\u00e7\u0131s\u0131yla y\u00f6netmenizi sa\u011fl\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon\"}]},{\"@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 useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon","description":"React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan etkileri (side effects) d\u00fczenli ve performansl\u0131 bir \u015fekilde nas\u0131l ele alabiliriz? \u0130\u015fte tam da bu noktada, React'\u0131n g\u00fc\u00e7l\u00fc ve esnek Hook'u olan useEffect devreye giriyor ve bile\u015fenlerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha fonksiyonel bir bak\u0131\u015f a\u00e7\u0131s\u0131yla y\u00f6netmenizi sa\u011fl\u0131yor.","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\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/","og_locale":"tr_TR","og_type":"article","og_title":"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon","og_description":"React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan etkileri (side effects) d\u00fczenli ve performansl\u0131 bir \u015fekilde nas\u0131l ele alabiliriz? \u0130\u015fte tam da bu noktada, React'\u0131n g\u00fc\u00e7l\u00fc ve esnek Hook'u olan useEffect devreye giriyor ve bile\u015fenlerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha fonksiyonel bir bak\u0131\u015f a\u00e7\u0131s\u0131yla y\u00f6netmenizi sa\u011fl\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-21T01:30:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon","datePublished":"2025-11-21T01:30:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/"},"wordCount":2823,"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\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/","url":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/","name":"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-21T01:30:50+00:00","description":"React uygulamalar\u0131nda bile\u015fenlerimizin yaln\u0131zca aray\u00fcz\u00fc de\u011fil, ayn\u0131 zamanda d\u0131\u015f d\u00fcnya ile etkile\u015fimini de y\u00f6netmemiz gerekir. Peki, bu yan etkileri (side effects) d\u00fczenli ve performansl\u0131 bir \u015fekilde nas\u0131l ele alabiliriz? \u0130\u015fte tam da bu noktada, React'\u0131n g\u00fc\u00e7l\u00fc ve esnek Hook'u olan useEffect devreye giriyor ve bile\u015fenlerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc daha fonksiyonel bir bak\u0131\u015f a\u00e7\u0131s\u0131yla y\u00f6netmenizi sa\u011fl\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-useeffect-perde-arkasi-calisma-mantigi-ve-optimizasyon\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React useEffect: Perde Arkas\u0131 \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 ve Optimizasyon"}]},{"@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\/34715","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=34715"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34715\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34715"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34715"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}