{"id":31894,"date":"2025-10-15T08:41:17","date_gmt":"2025-10-15T05:41:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31894"},"modified":"2025-10-15T08:41:17","modified_gmt":"2025-10-15T05:41:17","slug":"react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/","title":{"rendered":"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine"},"content":{"rendered":"<p><body><\/p>\n<h2>React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine<\/h2>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken, React gibi bile\u015fen tabanl\u0131 k\u00fct\u00fcphaneler, kullan\u0131c\u0131 aray\u00fczlerini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yap\u0131 sunar. Ancak, uygulaman\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a, farkl\u0131 bile\u015fenler aras\u0131nda durum (state) payla\u015f\u0131m\u0131 \u00f6nemli bir zorluk haline gelebilir. \u00d6zellikle, bir durumun bile\u015fen a\u011fac\u0131nda derinlerdeki bir bile\u015fen taraf\u0131ndan kullan\u0131lmas\u0131 gerekti\u011finde, bu durumu \u00fcst bile\u015fenlerden alt bile\u015fenlere prop&#8217;lar arac\u0131l\u0131\u011f\u0131yla manuel olarak aktarmak (&#8220;prop drilling&#8221;) hem kodun okunabilirli\u011fini azalt\u0131r hem de bak\u0131m\u0131 zorla\u015ft\u0131r\u0131r. React Context API, bu t\u00fcr durum payla\u015f\u0131m sorunlar\u0131na zarif ve yerle\u015fik bir \u00e7\u00f6z\u00fcm sunarak, bile\u015fenler aras\u0131nda veri ak\u0131\u015f\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Bu makalede, React Context API&#8217;nin ne oldu\u011funu, prop drilling sorununu nas\u0131l \u00e7\u00f6zd\u00fc\u011f\u00fcn\u00fc, temel bile\u015fenlerini ve ad\u0131m ad\u0131m nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ayr\u0131ca, dinamik durum y\u00f6netimi, performans optimizasyonlar\u0131 ve Context API&#8217;nin ne zaman di\u011fer durum y\u00f6netim k\u00fct\u00fcphanelerine (Redux, Zustand vb.) tercih edilmesi gerekti\u011fi gibi konulara da de\u011finece\u011fiz. Amac\u0131m\u0131z, geli\u015ftiricilere Context API&#8217;yi projelerinde etkili bir \u015fekilde kullanmalar\u0131 i\u00e7in kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h2>Prop Drilling Nedir ve Neden Bir Sorundur?<\/h2>\n<p>React uygulamalar\u0131nda, veriler genellikle \u00fcst bile\u015fenlerden alt bile\u015fenlere &#8220;prop&#8221; ad\u0131 verilen \u00f6zellikler arac\u0131l\u0131\u011f\u0131yla aktar\u0131l\u0131r. Bu, bile\u015fenler aras\u0131ndaki veri ak\u0131\u015f\u0131n\u0131 a\u00e7\u0131k ve anla\u015f\u0131l\u0131r k\u0131lar. Ancak, bir veri par\u00e7as\u0131n\u0131n bile\u015fen a\u011fac\u0131nda \u00e7ok derinlerdeki bir bile\u015fen taraf\u0131ndan kullan\u0131lmas\u0131 gerekti\u011finde, bu veri, arada kalan ve asl\u0131nda bu veriye ihtiyac\u0131 olmayan bile\u015fenler \u00fczerinden de prop olarak ge\u00e7irilmek zorunda kal\u0131r. Bu duruma &#8220;prop drilling&#8221; (prop sondaj\u0131) denir.<\/p>\n<h3>Prop Drilling&#8217;in Tan\u0131m\u0131<\/h3>\n<p>Prop drilling, bir verinin (state veya fonksiyon) bile\u015fen hiyerar\u015fisinde birden fazla katman atlayarak, do\u011frudan kullan\u0131c\u0131s\u0131 olmayan ara bile\u015fenler \u00fczerinden ge\u00e7irilmesi i\u015flemidir. \u00d6rne\u011fin, <code>AppComponent<\/code>&#8216;in sahip oldu\u011fu bir <code>user<\/code> objesini, <code>AppComponent<\/code> -> <code>Dashboard<\/code> -> <code>Sidebar<\/code> -> <code>UserProfile<\/code> yolunu izleyerek <code>UserProfile<\/code> bile\u015fenine ula\u015ft\u0131rmak istedi\u011finizi varsayal\u0131m. <code>Dashboard<\/code> ve <code>Sidebar<\/code> bile\u015fenlerinin <code>user<\/code> objesine do\u011frudan ihtiyac\u0131 olmamas\u0131na ra\u011fmen, bu objeyi <code>UserProfile<\/code>&#8216;a iletmek i\u00e7in prop olarak almak ve alt bile\u015fenlerine aktarmak zorundad\u0131rlar.<\/p>\n<pre><code class=\"language-jsx\">\/\/ AppComponent.js\nfunction AppComponent() {\n  const user = { name: \"Alice\", id: 1 };\n  return <Dashboard user={user} \/>;\n}\n\n\/\/ Dashboard.js\nfunction Dashboard({ user }) {\n  return <Sidebar user={user} \/>;\n}\n\n\/\/ Sidebar.js\nfunction Sidebar({ user }) {\n  return (\n    <div>\n      <p>Welcome, {user.name}<\/p>\n      <UserProfile user={user} \/>\n    <\/div>\n  );\n}\n\n\/\/ UserProfile.js\nfunction UserProfile({ user }) {\n  return <div>User ID: {user.id}<\/div>;\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>user<\/code> prop&#8217;u <code>Dashboard<\/code> ve <code>Sidebar<\/code> \u00fczerinden &#8220;delinerek&#8221; <code>UserProfile<\/code>&#8216;a ula\u015ft\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<h3>Prop Drilling&#8217;in Dezavantajlar\u0131<\/h3>\n<p>Prop drilling, uygulaman\u0131n boyutu ve karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a bir dizi soruna yol a\u00e7ar:<\/p>\n<p>*   <strong>Kod Okunabilirli\u011finin Azalmas\u0131:<\/strong> Hangi prop&#8217;un nereden geldi\u011fini ve hangi bile\u015fenin ona ger\u00e7ekten ihtiya\u00e7 duydu\u011funu anlamak zorla\u015f\u0131r. Bir prop&#8217;un sadece aktar\u0131c\u0131 g\u00f6revi g\u00f6ren bile\u015fenlerde bulunmas\u0131, kodun amac\u0131n\u0131 belirsizle\u015ftirir.<br \/>\n*   <strong>Bak\u0131m Zorlu\u011fu:<\/strong> Bir prop&#8217;un ad\u0131n\u0131 veya yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmek istedi\u011finizde, bu prop&#8217;u kullanan t\u00fcm bile\u015fenlerin yan\u0131 s\u0131ra, bu prop&#8217;u sadece ileten t\u00fcm ara bile\u015fenleri de g\u00fcncellemeniz gerekir. Bu, hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve refactoring s\u00fcrecini yava\u015flat\u0131r.<br \/>\n*   <strong>Bile\u015fen Tekrar Kullan\u0131labilirli\u011finin D\u00fc\u015fmesi:<\/strong> Bir bile\u015fen, ihtiya\u00e7 duymad\u0131\u011f\u0131 prop&#8217;lara ba\u011f\u0131ml\u0131 hale geldi\u011finde, onu ba\u015fka bir ba\u011flamda tekrar kullanmak zorla\u015f\u0131r. \u00c7\u00fcnk\u00fc bu bile\u015fenin, o prop&#8217;u sa\u011flayacak bir \u00fcst bile\u015fenle birlikte kullan\u0131lmas\u0131 gerekir.<br \/>\n*   <strong>Gereksiz Yeniden Render&#8217;lar:<\/strong> Prop&#8217;lar de\u011fi\u015fti\u011finde, React varsay\u0131lan olarak ilgili t\u00fcm bile\u015fenleri yeniden render eder. E\u011fer bir bile\u015fen sadece prop&#8217;u iletmekle kal\u0131yor ve kendi i\u00e7inde kullanm\u0131yorsa, bu bile\u015fenin prop de\u011fi\u015fti\u011finde yeniden render olmas\u0131 \u00e7o\u011fu zaman gereksizdir. Bu durum, performans sorunlar\u0131na yol a\u00e7abilir, \u00f6zellikle bile\u015fen a\u011fac\u0131 \u00e7ok derinse.<\/p>\n<p>Bu dezavantajlar g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, prop drilling&#8217;in React geli\u015ftiricilerinin ka\u00e7\u0131nmak istedi\u011fi bir anti-pattern oldu\u011fu a\u00e7\u0131kt\u0131r. \u0130\u015fte tam da bu noktada React Context API devreye girerek, bu soruna zarif bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h2>React Context API&#8217;ye Giri\u015f<\/h2>\n<p>React Context API, bile\u015fen a\u011fac\u0131nda verileri manuel olarak prop&#8217;lar arac\u0131l\u0131\u011f\u0131yla her seviyede ge\u00e7irmeden, do\u011frudan payla\u015fman\u0131n bir yoludur. Temel olarak, bir &#8220;ba\u011flam&#8221; olu\u015fturman\u0131za ve bu ba\u011flamdaki verileri, a\u011fa\u00e7taki herhangi bir bile\u015fenin eri\u015febilece\u011fi \u015fekilde sa\u011flaman\u0131za olanak tan\u0131r.<\/p>\n<h3>Context Nedir?<\/h3>\n<p>Context, React&#8217;te belirli bir t\u00fcrdeki verileri (\u00f6rne\u011fin, tema ayarlar\u0131, kullan\u0131c\u0131 kimlik do\u011frulama durumu veya tercih edilen dil) bile\u015fen a\u011fac\u0131n\u0131n derinliklerine iletmek i\u00e7in tasarlanm\u0131\u015f bir mekanizmad\u0131r. Bu sayede, bu verilere ihtiya\u00e7 duymayan ara bile\u015fenlerin bu verileri prop olarak almas\u0131na gerek kalmaz. Context, uygulaman\u0131zda &#8220;global&#8221; olarak kabul edilebilecek verileri y\u00f6netmek i\u00e7in idealdir, ancak bu veriler t\u00fcm uygulama i\u00e7in ge\u00e7erli olmak zorunda de\u011fildir; sadece belirli bir alt a\u011fa\u00e7 i\u00e7in ge\u00e7erli olabilir.<\/p>\n<p>Context API, \u00f6zellikle \u015fu t\u00fcr durumlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r:<br \/>\n*   <strong>Tema Y\u00f6netimi:<\/strong> A\u00e7\u0131k\/koyu tema ayarlar\u0131n\u0131 t\u00fcm bile\u015fenlere iletmek.<br \/>\n*   <strong>Kullan\u0131c\u0131 Kimlik Do\u011frulama:<\/strong> Giri\u015f yapm\u0131\u015f kullan\u0131c\u0131n\u0131n bilgilerini veya oturum durumunu payla\u015fmak.<br \/>\n*   <strong>Dil Se\u00e7imi:<\/strong> Uygulaman\u0131n tercih edilen dilini bile\u015fenlere bildirmek.<br \/>\n*   <strong>Uygulama Ayarlar\u0131:<\/strong> Genel uygulama ayarlar\u0131n\u0131 da\u011f\u0131tmak.<\/p>\n<h3>Context API&#8217;nin Temel Bile\u015fenleri<\/h3>\n<p>Context API, \u00fc\u00e7 ana kavram etraf\u0131nda d\u00f6ner: Context&#8217;in kendisi, veri sa\u011flay\u0131c\u0131 (Provider) ve veri t\u00fcketici (Consumer). Modern React&#8217;te <code>useContext<\/code> hook&#8217;u, t\u00fcketici bile\u015feninin yerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde alm\u0131\u015ft\u0131r.<\/p>\n<p>1.  <strong><code>React.createContext()<\/code>:<\/strong> Bu fonksiyon, bir Context objesi olu\u015fturur. Bu obje, bir <code>Provider<\/code> ve bir <code>Consumer<\/code> (veya <code>useContext<\/code> hook&#8217;u) i\u00e7erir. <code>createContext()<\/code>&#8216;e iste\u011fe ba\u011fl\u0131 olarak bir <code>defaultValue<\/code> arg\u00fcman\u0131 ge\u00e7irebilirsiniz. Bu varsay\u0131lan de\u011fer, bir bile\u015fenin en yak\u0131n <code>Provider<\/code>&#8216;\u0131 bulamad\u0131\u011f\u0131nda veya <code>Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;u <code>undefined<\/code> oldu\u011funda kullan\u0131l\u0131r. Bu genellikle testler i\u00e7in veya bir hata durumunda bir geri d\u00f6n\u00fc\u015f de\u011feri olarak faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const ThemeContext = React.createContext('light'); \/\/ 'light' varsay\u0131lan de\u011fer<\/code><\/pre>\n<p>2.  <strong><code>Context.Provider<\/code>:<\/strong> Her Context objesi, bir <code>Provider<\/code> React bile\u015feniyle birlikte gelir. Bu bile\u015fen, Context&#8217;e abone olan t\u00fcm alt bile\u015fenlerin eri\u015febilece\u011fi <code>value<\/code> prop&#8217;unu kabul eder. Bir <code>Provider<\/code>&#8216;\u0131 bile\u015fen a\u011fac\u0131n\u0131z\u0131n \u00fcst k\u0131s\u0131mlar\u0131na yerle\u015ftirerek, bu <code>Provider<\/code>&#8216;\u0131n alt\u0131ndaki t\u00fcm bile\u015fenlerin (derinlik fark etmeksizin) bu Context de\u011ferine eri\u015fmesini sa\u011flayabilirsiniz. Bir <code>Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;u de\u011fi\u015fti\u011finde, bu Context&#8217;i t\u00fcketen t\u00fcm bile\u015fenler yeniden render edilir.<\/p>\n<pre><code class=\"language-jsx\">function App() {\n      const [theme, setTheme] = React.useState('light');\n      return (\n        <ThemeContext.Provider value={theme}>\n          {\/<em> Bu alt a\u011fa\u00e7taki t\u00fcm bile\u015fenler 'theme' de\u011ferine eri\u015febilir <\/em>\/}\n          <Toolbar \/>\n        <\/ThemeContext.Provider>\n      );\n    }<\/code><\/pre>\n<p>3.  <strong><code>useContext<\/code> Hook:<\/strong> Fonksiyonel bile\u015fenlerde Context de\u011ferini t\u00fcketmenin modern ve \u00f6nerilen yoludur. <code>useContext<\/code> hook&#8217;u, kendisine verilen Context objesinin (yani <code>React.createContext()<\/code> taraf\u0131ndan d\u00f6nd\u00fcr\u00fclen obje) ge\u00e7erli de\u011ferini d\u00f6nd\u00fcr\u00fcr. En yak\u0131n \u00fcst <code>Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;u neyse, o de\u011feri d\u00f6nd\u00fcr\u00fcr. E\u011fer yukar\u0131da bir <code>Provider<\/code> yoksa, <code>createContext()<\/code>&#8216;e verilen varsay\u0131lan de\u011feri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-jsx\">function ThemedButton() {\n      const theme = React.useContext(ThemeContext);\n      return <button style={{ background: theme === 'light' ? '#eee' : '#333', color: theme === 'light' ? '#333' : '#eee' }}>My Button<\/button>;\n    }<\/code><\/pre>\n<p>4.  <strong><code>Context.Consumer<\/code> (Eski Y\u00f6ntem):<\/strong> S\u0131n\u0131f bile\u015fenlerinde Context de\u011ferini t\u00fcketmek i\u00e7in kullan\u0131lan eski bir y\u00f6ntemdir. Bir render prop deseni kullan\u0131r, yani bir fonksiyonu \u00e7ocuk olarak kabul eder ve bu fonksiyona Context&#8217;in mevcut de\u011ferini arg\u00fcman olarak iletir. <code>useContext<\/code> hook&#8217;u tan\u0131t\u0131ld\u0131ktan sonra, s\u0131n\u0131f bile\u015fenleri haricinde kullan\u0131m\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalm\u0131\u015ft\u0131r ve fonksiyonel bile\u015fenler i\u00e7in <code>useContext<\/code> tercih edilmelidir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ S\u0131n\u0131f bile\u015feni \u00f6rne\u011fi\n    class ThemedButton extends React.Component {\n      render() {\n        return (\n          <ThemeContext.Consumer>\n            {theme => (\n              <button style={{ background: theme === 'light' ? '#eee' : '#333', color: theme === 'light' ? '#333' : '#eee' }}>My Button<\/button>\n            )}\n          <\/ThemeContext.Consumer>\n        );\n      }\n    }<\/code><\/pre>\n<p>Bu temel bile\u015fenleri anlayarak, React uygulamalar\u0131n\u0131zda Context API&#8217;yi kullanarak durum payla\u015f\u0131m\u0131n\u0131 etkili bir \u015fekilde y\u00f6netmeye ba\u015flayabilirsiniz.<\/p>\n<h2>Context API Ad\u0131m Ad\u0131m Uygulama<\/h2>\n<p>\u015eimdi, React Context API&#8217;yi kullanarak basit bir tema de\u011fi\u015ftirici uygulamas\u0131 geli\u015ftirelim. Bu \u00f6rnek, Context&#8217;in nas\u0131l olu\u015fturuldu\u011funu, bir sa\u011flay\u0131c\u0131 (Provider) arac\u0131l\u0131\u011f\u0131yla nas\u0131l veri sa\u011fland\u0131\u011f\u0131n\u0131 ve bir t\u00fcketici (Consumer) bile\u015feni taraf\u0131ndan nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6sterecektir.<\/p>\n<h3>Context Olu\u015fturma<\/h3>\n<p>\u0130lk ad\u0131m, bir Context objesi olu\u015fturmakt\u0131r. Bu objeyi genellikle ayr\u0131 bir dosyada tan\u0131mlar\u0131z, b\u00f6ylece uygulaman\u0131n farkl\u0131 yerlerinden kolayca i\u00e7e aktar\u0131labilir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/contexts\/ThemeContext.js\nimport React from 'react';\n\n\/\/ Varsay\u0131lan de\u011feri 'light' olan bir ThemeContext olu\u015fturuyoruz.\n\/\/ Bu varsay\u0131lan de\u011fer, Provider olmadan Context'i t\u00fcketen bile\u015fenler i\u00e7in kullan\u0131l\u0131r.\nconst ThemeContext = React.createContext('light');\n\nexport default ThemeContext;<\/code><\/pre>\n<p>Burada <code>ThemeContext<\/code> ad\u0131nda bir Context olu\u015fturduk ve varsay\u0131lan de\u011ferini <code>'light'<\/code> olarak belirledik. Bu, herhangi bir <code>ThemeContext.Provider<\/code> bulunmad\u0131\u011f\u0131nda veya <code>value<\/code> prop&#8217;u <code>undefined<\/code> oldu\u011funda kullan\u0131lacak olan geri d\u00f6n\u00fc\u015f de\u011feridir.<\/p>\n<h3>Veri Sa\u011flay\u0131c\u0131 (Provider) Olu\u015fturma<\/h3>\n<p>Context&#8217;in de\u011ferini sa\u011flamak i\u00e7in bir <code>Provider<\/code> bile\u015feni kullan\u0131r\u0131z. Bu <code>Provider<\/code>&#8216;\u0131, Context de\u011ferine eri\u015fmesini istedi\u011fimiz bile\u015fen a\u011fac\u0131n\u0131n en \u00fcst\u00fcne yerle\u015ftiririz. Genellikle bu, uygulaman\u0131n k\u00f6k bile\u015feni (<code>App.js<\/code>) veya belirli bir b\u00f6l\u00fcm\u00fcn k\u00f6k\u00fc olur.<\/p>\n<p>Temay\u0131 y\u00f6netmek ve de\u011fi\u015ftirmek i\u00e7in <code>useState<\/code> hook&#8217;unu kullanacak bir <code>ThemeProvider<\/code> bile\u015feni olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/contexts\/ThemeProvider.js\nimport React, { useState } from 'react';\nimport ThemeContext from '.\/ThemeContext';\n\nconst ThemeProvider = ({ children }) => {\n  const [theme, setTheme] = useState('light'); \/\/ Temay\u0131 tutan state\n\n  const toggleTheme = () => {\n    setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));\n  };\n\n  \/\/ Context'e sa\u011flanacak de\u011fer objesi\n  \/\/ Hem tema de\u011feri hem de temay\u0131 de\u011fi\u015ftiren fonksiyon sa\u011flan\u0131yor\n  const contextValue = {\n    theme,\n    toggleTheme,\n  };\n\n  return (\n    <ThemeContext.Provider value={contextValue}>\n      {children}\n    <\/ThemeContext.Provider>\n  );\n};\n\nexport default ThemeProvider;<\/code><\/pre>\n<p>\u015eimdi <code>ThemeProvider<\/code>&#8216;\u0131 <code>App.js<\/code> dosyam\u0131zda kullanabiliriz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/App.js\nimport React from 'react';\nimport ThemeProvider from '.\/contexts\/ThemeProvider';\nimport Toolbar from '.\/components\/Toolbar';\nimport '.\/App.css'; \/\/ Basit stil dosyas\u0131\n\nfunction App() {\n  return (\n    <ThemeProvider>\n      <div className=\"App\">\n        \n        <Toolbar \/>\n        <p>Uygulama i\u00e7eri\u011fi...<\/p>\n      <\/div>\n    <\/ThemeProvider>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<p>Bu yap\u0131da, <code>ThemeProvider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;una <code>{ theme, toggleTheme }<\/code> objesini ge\u00e7irdik. Art\u0131k <code>ThemeProvider<\/code>&#8216;\u0131n alt\u0131ndaki herhangi bir bile\u015fen bu <code>theme<\/code> de\u011ferine ve <code>toggleTheme<\/code> fonksiyonuna eri\u015febilir.<\/p>\n<h3>Veriyi T\u00fcketme (Consumer) &#8211; <code>useContext<\/code> Hook Kullan\u0131m\u0131<\/h3>\n<p>Fonksiyonel bile\u015fenlerde Context de\u011ferini t\u00fcketmenin en basit ve modern yolu <code>useContext<\/code> hook&#8217;unu kullanmakt\u0131r. Bu hook, do\u011frudan Context objesini al\u0131r ve o anki Context de\u011ferini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>\u015eimdi <code>Toolbar<\/code> ve <code>ThemeButton<\/code> bile\u015fenlerini olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/Toolbar.js\nimport React from 'react';\nimport ThemeButton from '.\/ThemeButton';\n\nfunction Toolbar() {\n  return (\n    <div className=\"Toolbar\">\n      <p>Bu bir ara\u00e7 \u00e7ubu\u011fu.<\/p>\n      <ThemeButton \/>\n    <\/div>\n  );\n}\n\nexport default Toolbar;<\/code><\/pre>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/ThemeButton.js\nimport React, { useContext } from 'react';\nimport ThemeContext from '..\/contexts\/ThemeContext';\n\nfunction ThemeButton() {\n  \/\/ useContext hook'u ile ThemeContext'ten tema de\u011ferini ve toggleTheme fonksiyonunu al\u0131yoruz\n  const { theme, toggleTheme } = useContext(ThemeContext);\n\n  const buttonStyle = {\n    padding: '10px 20px',\n    fontSize: '16px',\n    cursor: 'pointer',\n    backgroundColor: theme === 'light' ? '#f0f0f0' : '#333',\n    color: theme === 'light' ? '#333' : '#f0f0f0',\n    border: '1px solid #ccc',\n    borderRadius: '5px',\n  };\n\n  return (\n    <button style={buttonStyle} onClick={toggleTheme}>\n      Temay\u0131 De\u011fi\u015ftir: {theme === 'light' ? 'A\u00e7\u0131k' : 'Koyu'}\n    <\/button>\n  );\n}\n\nexport default ThemeButton;<\/code><\/pre>\n<p><code>ThemeButton<\/code> bile\u015feni, <code>ThemeContext<\/code>&#8216;ten <code>theme<\/code> ve <code>toggleTheme<\/code> de\u011ferlerini do\u011frudan <code>useContext(ThemeContext)<\/code> \u00e7a\u011fr\u0131s\u0131 ile al\u0131yor. Bu sayede, <code>Toolbar<\/code> bile\u015feninin <code>theme<\/code> veya <code>toggleTheme<\/code> prop&#8217;lar\u0131n\u0131 almas\u0131na gerek kalmad\u0131. Bu, prop drilling sorununu ortadan kald\u0131rman\u0131n temel mekanizmas\u0131d\u0131r.<\/p>\n<h3>Veriyi T\u00fcketme (Consumer) &#8211; <code>Context.Consumer<\/code> Bile\u015feni (Alternatif)<\/h3>\n<p>E\u011fer hala s\u0131n\u0131f bile\u015fenleri kullan\u0131yorsan\u0131z veya eski React kodlar\u0131yla \u00e7al\u0131\u015f\u0131yorsan\u0131z, <code>Context.Consumer<\/code> bile\u015fenini kullanman\u0131z gerekebilir. Bu bile\u015fen, bir render prop deseni kullan\u0131r.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/ThemeButtonClass.js (\u00d6rnek olarak s\u0131n\u0131f bile\u015feni)\nimport React from 'react';\nimport ThemeContext from '..\/contexts\/ThemeContext';\n\nclass ThemeButtonClass extends React.Component {\n  render() {\n    return (\n      <ThemeContext.Consumer>\n        {({ theme, toggleTheme }) => ( \/\/ Render prop fonksiyonu, context de\u011ferini al\u0131r\n          <button\n            style={{\n              padding: '10px 20px',\n              fontSize: '16px',\n              cursor: 'pointer',\n              backgroundColor: theme === 'light' ? '#f0f0f0' : '#333',\n              color: theme === 'light' ? '#333' : '#f0f0f0',\n              border: '1px solid #ccc',\n              borderRadius: '5px',\n            }}\n            onClick={toggleTheme}\n          >\n            Temay\u0131 De\u011fi\u015ftir: {theme === 'light' ? 'A\u00e7\u0131k' : 'Koyu'} (S\u0131n\u0131f Bile\u015feni)\n          <\/button>\n        )}\n      <\/ThemeContext.Consumer>\n    );\n  }\n}\n\nexport default ThemeButtonClass;<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>Context.Consumer<\/code> daha fazla boilerplate koduna yol a\u00e7ar ve <code>useContext<\/code> hook&#8217;una k\u0131yasla daha az sezgiseldir. Bu nedenle, fonksiyonel bile\u015fenler i\u00e7in her zaman <code>useContext<\/code> tercih edilmelidir.<\/p>\n<h2>Dinamik Durum ve Context API<\/h2>\n<p>Context API&#8217;nin g\u00fcc\u00fc, sadece statik verileri de\u011fil, ayn\u0131 zamanda dinamik olarak de\u011fi\u015fen durumlar\u0131 ve bu durumlar\u0131 g\u00fcncelleyen fonksiyonlar\u0131 da payla\u015fabilmesinden gelir. \u00d6nceki tema \u00f6rne\u011finde de g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, <code>useState<\/code> hook&#8217;u ile birlikte Context&#8217;i kullanarak dinamik bir tema y\u00f6netim sistemi olu\u015fturabiliriz.<\/p>\n<h3>Context De\u011ferini G\u00fcncelleme<\/h3>\n<p>Context&#8217;e sa\u011flad\u0131\u011f\u0131n\u0131z <code>value<\/code> objesi, sadece durumun kendisini de\u011fil, ayn\u0131 zamanda bu durumu de\u011fi\u015ftirecek fonksiyonlar\u0131 da i\u00e7erebilir. Bu, alt bile\u015fenlerin Context&#8217;teki durumu do\u011frudan de\u011fi\u015ftirmesine olanak tan\u0131r.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/contexts\/ThemeProvider.js (Tekrar g\u00f6zden ge\u00e7irelim)\nimport React, { useState, useMemo, useCallback } from 'react';\nimport ThemeContext from '.\/ThemeContext';\n\nconst ThemeProvider = ({ children }) => {\n  const [theme, setTheme] = useState('light');\n\n  \/\/ toggleTheme fonksiyonunu useCallback ile memoize ediyoruz\n  \/\/ Bu, fonksiyon referans\u0131n\u0131n her renderda de\u011fi\u015fmesini engeller\n  const toggleTheme = useCallback(() => {\n    setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));\n  }, []); \/\/ Ba\u011f\u0131ml\u0131l\u0131k dizisi bo\u015f, \u00e7\u00fcnk\u00fc d\u0131\u015far\u0131dan bir \u015feye ba\u011fl\u0131 de\u011fil\n\n  \/\/ contextValue objesini useMemo ile memoize ediyoruz\n  \/\/ Bu, objenin referans\u0131n\u0131n sadece theme veya toggleTheme de\u011fi\u015fti\u011finde de\u011fi\u015fmesini sa\u011flar\n  const contextValue = useMemo(() => ({\n    theme,\n    toggleTheme,\n  }), [theme, toggleTheme]); \/\/ theme veya toggleTheme de\u011fi\u015fti\u011finde yeniden hesapla\n\n  return (\n    <ThemeContext.Provider value={contextValue}>\n      {children}\n    <\/ThemeContext.Provider>\n  );\n};\n\nexport default ThemeProvider;<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte <code>toggleTheme<\/code> fonksiyonunu <code>useCallback<\/code> ile ve <code>contextValue<\/code> objesini <code>useMemo<\/code> ile sarmalad\u0131k. Bu, performans optimizasyonu i\u00e7in \u00f6nemlidir ve Context API&#8217;nin dezavantajlar\u0131ndan biri olan gereksiz yeniden render&#8217;lar\u0131 azaltmaya yard\u0131mc\u0131 olur. E\u011fer <code>value<\/code> prop&#8217;u her renderda yeni bir obje referans\u0131 olu\u015fturursa, Context&#8217;i t\u00fcketen t\u00fcm bile\u015fenler her zaman yeniden render olacakt\u0131r. <code>useMemo<\/code> ve <code>useCallback<\/code> kullanarak bu durumun \u00f6n\u00fcne ge\u00e7ebiliriz.<\/p>\n<h3>Birden Fazla Context Kullan\u0131m\u0131<\/h3>\n<p>Bazen uygulaman\u0131zda birden fazla ba\u011f\u0131ms\u0131z global duruma ihtiyac\u0131n\u0131z olabilir (\u00f6rne\u011fin, tema ve kullan\u0131c\u0131 kimlik do\u011frulama). React, birden fazla Context kullanman\u0131za izin verir. Bunu yapmak i\u00e7in, farkl\u0131 Context&#8217;leri olu\u015fturur ve <code>Provider<\/code>&#8216;lar\u0131n\u0131 i\u00e7 i\u00e7e yerle\u015ftirirsiniz.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/contexts\/AuthContext.js\nimport React from 'react';\nconst AuthContext = React.createContext(null); \/\/ Varsay\u0131lan olarak null\n\nexport default AuthContext;\n\n\/\/ src\/contexts\/AuthProvider.js\nimport React, { useState, useMemo, useCallback } from 'react';\nimport AuthContext from '.\/AuthContext';\n\nconst AuthProvider = ({ children }) => {\n  const [user, setUser] = useState(null); \/\/ Kullan\u0131c\u0131 objesi veya null\n\n  const login = useCallback((username, password) => {\n    \/\/ Basit bir login sim\u00fclasyonu\n    if (username === 'test' && password === 'password') {\n      setUser({ id: 1, name: 'Test User' });\n      return true;\n    }\n    return false;\n  }, []);\n\n  const logout = useCallback(() => {\n    setUser(null);\n  }, []);\n\n  const authContextValue = useMemo(() => ({\n    user,\n    login,\n    logout,\n  }), [user, login, logout]);\n\n  return (\n    <AuthContext.Provider value={authContextValue}>\n      {children}\n    <\/AuthContext.Provider>\n  );\n};\n\nexport default AuthProvider;<\/code><\/pre>\n<p>\u015eimdi <code>App.js<\/code>&#8216;de hem <code>ThemeProvider<\/code> hem de <code>AuthProvider<\/code>&#8216;\u0131 i\u00e7 i\u00e7e kullanabiliriz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/App.js\nimport React from 'react';\nimport ThemeProvider from '.\/contexts\/ThemeProvider';\nimport AuthProvider from '.\/contexts\/AuthProvider';\nimport Toolbar from '.\/components\/Toolbar';\nimport AuthStatus from '.\/components\/AuthStatus'; \/\/ Yeni bir bile\u015fen\nimport '.\/App.css';\n\nfunction App() {\n  return (\n    <AuthProvider>\n      <ThemeProvider> {\/<em> Provider'lar i\u00e7 i\u00e7e yerle\u015ftirilir <\/em>\/}\n        <div className=\"App\">\n          \n          <AuthStatus \/>\n          <Toolbar \/>\n          <p>Uygulama i\u00e7eri\u011fi...<\/p>\n        <\/div>\n      <\/ThemeProvider>\n    <\/AuthProvider>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<p>Ve <code>AuthStatus<\/code> bile\u015fenini olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/AuthStatus.js\nimport React, { useContext } from 'react';\nimport AuthContext from '..\/contexts\/AuthContext';\n\nfunction AuthStatus() {\n  const { user, login, logout } = useContext(AuthContext);\n  const [username, setUsername] = React.useState('');\n  const [password, setPassword] = React.useState('');\n\n  const handleLogin = () => {\n    if (login(username, password)) {\n      alert('Giri\u015f ba\u015far\u0131l\u0131!');\n      setUsername('');\n      setPassword('');\n    } else {\n      alert('Kullan\u0131c\u0131 ad\u0131 veya \u015fifre hatal\u0131!');\n    }\n  };\n\n  return (\n    <div style={{ border: '1px solid #ddd', padding: '15px', margin: '15px 0' }}>\n      {user ? (\n        <>\n          <p>Ho\u015f geldiniz, {user.name}!<\/p>\n          <button onClick={logout}>\u00c7\u0131k\u0131\u015f Yap<\/button>\n        <\/>\n      ) : (\n        <>\n          <p>Giri\u015f yapmad\u0131n\u0131z.<\/p>\n          <div>\n            <input\n              type=\"text\"\n              placeholder=\"Kullan\u0131c\u0131 Ad\u0131\"\n              value={username}\n              onChange={(e) => setUsername(e.target.value)}\n            \/>\n            <input\n              type=\"password\"\n              placeholder=\"\u015eifre\"\n              value={password}\n              onChange={(e) => setPassword(e.target.value)}\n            \/>\n            <button onClick={handleLogin}>Giri\u015f Yap<\/button>\n          <\/div>\n        <\/>\n      )}\n    <\/div>\n  );\n}\n\nexport default AuthStatus;<\/code><\/pre>\n<p>Bu \u015fekilde, farkl\u0131 Context&#8217;ler arac\u0131l\u0131\u011f\u0131yla uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmlerinde ba\u011f\u0131ms\u0131z durumlar\u0131 y\u00f6netebilir ve payla\u015fabilirsiniz. Ancak, \u00e7ok say\u0131da i\u00e7 i\u00e7e ge\u00e7mi\u015f <code>Provider<\/code> bile\u015feni, bile\u015fen a\u011fac\u0131n\u0131 karma\u015f\u0131kla\u015ft\u0131rabilir. Bu durumda, t\u00fcm <code>Provider<\/code>&#8216;lar\u0131 tek bir bile\u015fende toplayan \u00f6zel bir <code>AppProvider<\/code> bile\u015feni olu\u015fturmak iyi bir uygulama olabilir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/contexts\/AppProviders.js\nimport React from 'react';\nimport AuthProvider from '.\/AuthProvider';\nimport ThemeProvider from '.\/ThemeProvider';\n\nconst AppProviders = ({ children }) => {\n  return (\n    <AuthProvider>\n      <ThemeProvider>\n        {children}\n      <\/ThemeProvider>\n    <\/AuthProvider>\n  );\n};\n\nexport default AppProviders;\n\n\/\/ src\/App.js\n\/\/ ...\nimport AppProviders from '.\/contexts\/AppProviders';\n\nfunction App() {\n  return (\n    <AppProviders>\n      <div className=\"App\">\n        {\/<em> ... <\/em>\/}\n      <\/div>\n    <\/AppProviders>\n  );\n}\n\/\/ ...<\/code><\/pre>\n<p>Bu, <code>App.js<\/code> dosyas\u0131n\u0131 daha temiz tutar ve t\u00fcm sa\u011flay\u0131c\u0131lar\u0131 tek bir yerde y\u00f6netmenizi sa\u011flar.<\/p>\n<h2>Context API&#8217;nin Avantajlar\u0131 ve Dezavantajlar\u0131<\/h2>\n<p>React Context API, prop drilling sorununa g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunsa da, her ara\u00e7 gibi kendine \u00f6zg\u00fc avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r.<\/p>\n<h3>Avantajlar<\/h3>\n<p>*   <strong>Prop Drilling&#8217;i Ortadan Kald\u0131r\u0131r:<\/strong> En belirgin avantaj\u0131, verileri bile\u015fen a\u011fac\u0131nda derinlere iletmek i\u00e7in her seviyede prop ge\u00e7irme zorunlulu\u011funu ortadan kald\u0131rmas\u0131d\u0131r. Bu, kodun daha temiz ve okunabilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Kod Okunabilirli\u011fini ve Bak\u0131m Kolayl\u0131\u011f\u0131n\u0131 Art\u0131r\u0131r:<\/strong> Bir bile\u015fen sadece ihtiyac\u0131 olan veriyi Context&#8217;ten \u00e7eker, bu da bile\u015fenin amac\u0131n\u0131 daha net hale getirir. Veri yap\u0131s\u0131nda yap\u0131lan de\u011fi\u015fiklikler sadece Context tan\u0131m\u0131n\u0131 ve sa\u011flay\u0131c\u0131s\u0131n\u0131 etkiler, ara bile\u015fenleri de\u011fil.<br \/>\n*   <strong>Global State Y\u00f6netimi \u0130\u00e7in Basit \u00c7\u00f6z\u00fcm:<\/strong> Tema, dil, kullan\u0131c\u0131 kimlik do\u011frulama gibi uygulama genelinde payla\u015f\u0131lan durumlar i\u00e7in basit ve yerle\u015fik bir \u00e7\u00f6z\u00fcm sunar. Harici bir k\u00fct\u00fcphane eklemeye gerek kalmaz.<br \/>\n*   <strong>Boilerplate Kodunu Azalt\u0131r:<\/strong> \u00d6zellikle Redux gibi daha karma\u015f\u0131k durum y\u00f6netim k\u00fct\u00fcphanelerine k\u0131yasla, Context API&#8217;nin kurulumu ve kullan\u0131m\u0131 daha az boilerplate kodu gerektirir. K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli uygulamalar i\u00e7in h\u0131zl\u0131 bir ba\u015flang\u0131\u00e7 sa\u011flar.<br \/>\n*   <strong>Mod\u00fclerlik:<\/strong> Her Context, belirli bir veri t\u00fcr\u00fc veya i\u015flevsellik i\u00e7in ayr\u0131 ayr\u0131 olu\u015fturulabilir, bu da uygulaman\u0131n daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Dezavantajlar<\/h3>\n<p>*   <strong>T\u00fcm T\u00fcketicileri Yeniden Render Etme Potansiyeli:<\/strong> Bu, Context API&#8217;nin en \u00f6nemli dezavantajlar\u0131ndan biridir. E\u011fer bir <code>Context.Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;u her render&#8217;da yeni bir obje referans\u0131 olu\u015fturursa (ki bu, <code>useState<\/code> veya <code>useReducer<\/code> ile dinamik durum sa\u011flarken s\u0131k\u00e7a olur), bu Context&#8217;i t\u00fcketen t\u00fcm bile\u015fenler, de\u011ferin kendisi de\u011fi\u015fmese bile yeniden render edilir. Bu durum, performans sorunlar\u0131na yol a\u00e7abilir. <code>useMemo<\/code> ve <code>useCallback<\/code> kullanarak bu durumun \u00f6n\u00fcne ge\u00e7mek m\u00fcmk\u00fcnd\u00fcr, ancak bu ek bir \u00e7aba ve dikkat gerektirir.<br \/>\n*   <strong>Karma\u015f\u0131k Global State Y\u00f6netimi \u0130\u00e7in Yeterli Olmayabilir:<\/strong> \u00c7ok b\u00fcy\u00fck veya \u00e7ok karma\u015f\u0131k uygulamalarda, Context API tek ba\u015f\u0131na yeterli olmayabilir. Redux, Zustand, Recoil gibi daha geli\u015fmi\u015f durum y\u00f6netim k\u00fct\u00fcphaneleri; ara yaz\u0131l\u0131mlar (middleware), zaman yolculu\u011fu (time-travel debugging), t\u00fcretilmi\u015f durum (derived state) ve daha yap\u0131land\u0131r\u0131lm\u0131\u015f bir durum y\u00f6netim deseni gibi \u00f6zellikler sunar. Context API, bu t\u00fcr karma\u015f\u0131k senaryolar i\u00e7in bu k\u00fct\u00fcphanelerin sundu\u011fu ara\u00e7lara sahip de\u011fildir.<br \/>\n*   <strong>Bile\u015fen A\u011fac\u0131nda Context&#8217;in Nerede Sa\u011fland\u0131\u011f\u0131n\u0131 Bulmak Zor Olabilir:<\/strong> \u00d6zellikle b\u00fcy\u00fck uygulamalarda, bir Context&#8217;in de\u011ferinin hangi <code>Provider<\/code> taraf\u0131ndan sa\u011fland\u0131\u011f\u0131n\u0131 ve bu <code>Provider<\/code>&#8216;\u0131n bile\u015fen a\u011fac\u0131nda nerede bulundu\u011funu takip etmek zorla\u015fabilir. Bu, hata ay\u0131klama s\u00fcrecini karma\u015f\u0131kla\u015ft\u0131rabilir.<br \/>\n*   <strong>Tek Bir Context&#8217;ten \u00c7ok Fazla Veri Sa\u011flama Riski:<\/strong> Bir Context&#8217;e \u00e7ok fazla veri veya i\u015flevsellik koymak, &#8220;god object&#8221; anti-pattern&#8217;ine benzer bir duruma yol a\u00e7abilir. Bu, Context&#8217;i t\u00fcketen bile\u015fenlerin, asl\u0131nda ihtiya\u00e7 duymad\u0131klar\u0131 verilere de abone olmas\u0131na neden olabilir ve gereksiz yeniden render&#8217;lar\u0131 art\u0131rabilir.<\/p>\n<p>Bu avantaj ve dezavantajlar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak, Context API&#8217;nin uygulaman\u0131z i\u00e7in do\u011fru ara\u00e7 olup olmad\u0131\u011f\u0131na karar vermeniz \u00f6nemlidir.<\/p>\n<h2>Context API ve Performans Optimizasyonu<\/h2>\n<p>Context API&#8217;nin en s\u0131k kar\u015f\u0131la\u015f\u0131lan performans sorunlar\u0131ndan biri, bir <code>Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;u de\u011fi\u015fti\u011finde, bu Context&#8217;i t\u00fcketen t\u00fcm bile\u015fenlerin (de\u011ferin kendisi de\u011fi\u015fmese bile) yeniden render edilmesidir. Bu, uygulaman\u0131z\u0131n yava\u015flamas\u0131na neden olabilir. Ancak, bu sorunu \u00e7\u00f6zmek i\u00e7in baz\u0131 etkili optimizasyon teknikleri mevcuttur.<\/p>\n<h3>Gereksiz Yeniden Render&#8217;lar\u0131 \u00d6nleme<\/h3>\n<p>Bir <code>Context.Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;u, her render&#8217;da yeni bir obje referans\u0131 olu\u015fturdu\u011funda, React bu de\u011feri &#8220;de\u011fi\u015fmi\u015f&#8221; olarak alg\u0131lar ve bu Context&#8217;i t\u00fcketen t\u00fcm alt bile\u015fenleri yeniden render eder. Bu durum, <code>useState<\/code> veya <code>useReducer<\/code> ile y\u00f6netilen dinamik durumlar\u0131 Context arac\u0131l\u0131\u011f\u0131yla sa\u011flarken yayg\u0131nd\u0131r.<\/p>\n<p>*   <strong><code>value<\/code> prop&#8217;unun Referans E\u015fitli\u011finin \u00d6nemi:<\/strong> React, bir <code>Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;unun bir \u00f6nceki render&#8217;daki <code>value<\/code> prop&#8217;u ile ayn\u0131 referansa sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer referans farkl\u0131ysa, Context&#8217;i t\u00fcketen t\u00fcm bile\u015fenler yeniden render edilir.<\/p>\n<p>*   <strong>Objeleri ve Fonksiyonlar\u0131 <code>useMemo<\/code> ve <code>useCallback<\/code> ile Memoize Etme:<\/strong> Bu, en \u00f6nemli optimizasyon tekni\u011fidir.<br \/>\n    *   <strong><code>useCallback<\/code>:<\/strong> E\u011fer <code>value<\/code> prop&#8217;u i\u00e7inde bir fonksiyon sa\u011fl\u0131yorsan\u0131z, bu fonksiyonun referans\u0131n\u0131n her render&#8217;da de\u011fi\u015fmemesini sa\u011flamak i\u00e7in <code>useCallback<\/code> hook&#8217;unu kullanmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code class=\"language-jsx\">const toggleTheme = useCallback(() => {\n          setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));\n        }, []); \/\/ Ba\u011f\u0131ml\u0131l\u0131k dizisi bo\u015f oldu\u011fu i\u00e7in fonksiyon referans\u0131 de\u011fi\u015fmez<\/code><\/pre>\n<p>    *   <strong><code>useMemo<\/code>:<\/strong> E\u011fer <code>value<\/code> prop&#8217;u i\u00e7inde bir obje sa\u011fl\u0131yorsan\u0131z (ki bu \u00e7ok yayg\u0131nd\u0131r, \u00e7\u00fcnk\u00fc genellikle birden fazla de\u011fer veya fonksiyon sa\u011flamak istersiniz), bu objenin referans\u0131n\u0131n sadece ger\u00e7ekten de\u011fi\u015fti\u011finde de\u011fi\u015fmesini sa\u011flamak i\u00e7in <code>useMemo<\/code> hook&#8217;unu kullanmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code class=\"language-jsx\">const contextValue = useMemo(() => ({\n          theme,\n          toggleTheme,\n        }), [theme, toggleTheme]); \/\/ theme veya toggleTheme de\u011fi\u015fti\u011finde obje yeniden olu\u015fturulur<\/code><\/pre>\n<p>    Bu sayede, <code>ThemeProvider<\/code> her render edildi\u011finde <code>contextValue<\/code> objesi ve <code>toggleTheme<\/code> fonksiyonu yeniden olu\u015fturulmaz, dolay\u0131s\u0131yla alt bile\u015fenlerin gereksiz yere yeniden render edilmesi engellenir.<\/p>\n<p>*   <strong>Birden Fazla Context&#8217;i Daha K\u00fc\u00e7\u00fck Par\u00e7alara B\u00f6lme:<\/strong> Bir Context&#8217;e \u00e7ok fazla farkl\u0131 veri koymak, o Context&#8217;i t\u00fcketen bile\u015fenlerin, asl\u0131nda ihtiya\u00e7 duymad\u0131klar\u0131 veriler de\u011fi\u015fti\u011finde bile yeniden render edilmesine neden olabilir. Bu durumu \u00f6nlemek i\u00e7in, farkl\u0131 veri t\u00fcrleri veya i\u015flevsellikler i\u00e7in ayr\u0131 Context&#8217;ler olu\u015fturmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. \u00d6rne\u011fin, tema ve kimlik do\u011frulama bilgilerini ayn\u0131 Context&#8217;te tutmak yerine, <code>ThemeContext<\/code> ve <code>AuthContext<\/code> gibi iki ayr\u0131 Context kullanmak daha iyidir.<\/p>\n<p>*   <strong>Context De\u011ferini Ay\u0131rma (State ve Dispatch&#8217;i Ayr\u0131 Context&#8217;ler Olarak Verme):<\/strong> Daha geli\u015fmi\u015f bir optimizasyon tekni\u011fi, <code>useReducer<\/code> hook&#8217;u ile birlikte Context&#8217;i kullan\u0131rken, durumu (state) ve durumu de\u011fi\u015ftiren fonksiyonu (dispatch) ayr\u0131 Context&#8217;ler olarak sa\u011flamakt\u0131r.<\/p>\n<pre><code class=\"language-jsx\">\/\/ StateContext.js\n    const StateContext = React.createContext();\n    \/\/ DispatchContext.js\n    const DispatchContext = React.createContext();\n\n    function MyProvider({ children }) {\n      const [state, dispatch] = useReducer(myReducer, initialState);\n\n      return (\n        <StateContext.Provider value={state}>\n          <DispatchContext.Provider value={dispatch}>\n            {children}\n          <\/DispatchContext.Provider>\n        <\/StateContext.Provider>\n      );\n    }<\/code><\/pre>\n<p>    Bu sayede, sadece durumu kullanan bile\u015fenler <code>StateContext<\/code>&#8216;i t\u00fcketir ve durum de\u011fi\u015fti\u011finde yeniden render olur. Durumu de\u011fi\u015ftiren fonksiyonu kullanan bile\u015fenler ise <code>DispatchContext<\/code>&#8216;i t\u00fcketir. <code>dispatch<\/code> fonksiyonunun referans\u0131 genellikle de\u011fi\u015fmedi\u011fi i\u00e7in, bu bile\u015fenler gereksiz yere yeniden render olmaz.<\/p>\n<h3><code>React.memo<\/code> ile T\u00fcketici Bile\u015fenleri Optimize Etme<\/h3>\n<p><code>React.memo<\/code>, bir fonksiyonel bile\u015fenin prop&#8217;lar\u0131 de\u011fi\u015fmedi\u011fi s\u00fcrece yeniden render edilmesini engelleyen bir y\u00fcksek mertebeden bile\u015fendir (Higher-Order Component). Context de\u011ferleri de\u011fi\u015fti\u011finde bile\u015fenleriniz hala yeniden render oluyorsa, bu bile\u015fenleri <code>React.memo<\/code> ile sarmalayarak performans\u0131 art\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/ThemeButton.js (React.memo ile optimize edilmi\u015f)\nimport React, { useContext } from 'react';\nimport ThemeContext from '..\/contexts\/ThemeContext';\n\nfunction ThemeButton() {\n  const { theme, toggleTheme } = useContext(ThemeContext);\n\n  \/\/ ... (stil ve di\u011fer kodlar ayn\u0131)\n\n  return (\n    <button style={buttonStyle} onClick={toggleTheme}>\n      Temay\u0131 De\u011fi\u015ftir: {theme === 'light' ? 'A\u00e7\u0131k' : 'Koyu'}\n    <\/button>\n  );\n}\n\n\/\/ Bile\u015feni React.memo ile sarmal\u0131yoruz\n\/\/ Bu, prop'lar\u0131 de\u011fi\u015fmedi\u011fi s\u00fcrece ThemeButton'\u0131n yeniden render olmas\u0131n\u0131 engeller.\n\/\/ Ancak useContext ile \u00e7ekilen de\u011ferler prop olarak say\u0131lmaz, do\u011frudan Context'ten gelir.\n\/\/ Bu y\u00fczden, Context de\u011feri de\u011fi\u015fti\u011finde yine de render olur.\n\/\/ React.memo, Context'ten gelen de\u011ferler de\u011fil, bile\u015fene d\u0131\u015far\u0131dan gelen prop'lar i\u00e7in etkilidir.\n\/\/ Context de\u011ferleri de\u011fi\u015fti\u011finde React.memo'lu bile\u015fenler <em>yine de<\/em> render olur,\n\/\/ \u00e7\u00fcnk\u00fc Context'ten gelen de\u011fer bir \"prop\" gibi davran\u0131r.\n\/\/ Bu durumda, yukar\u0131daki useMemo\/useCallback teknikleri daha \u00f6nemlidir.\nexport default React.memo(ThemeButton);<\/code><\/pre>\n<p><code>React.memo<\/code>&#8216;nun Context API ile kullan\u0131m\u0131nda dikkatli olmak gerekir. Bir bile\u015fen <code>useContext<\/code> kullanarak bir Context de\u011ferini t\u00fcketti\u011finde, bu Context de\u011feri de\u011fi\u015fti\u011finde <code>React.memo<\/code>&#8216;lu bile\u015fen bile yeniden render olur. \u00c7\u00fcnk\u00fc <code>React.memo<\/code>, bile\u015fenin <em>prop&#8217;lar\u0131n\u0131<\/em> kontrol eder, Context&#8217;ten gelen de\u011ferleri de\u011fil. Dolay\u0131s\u0131yla, Context API&#8217;deki performans sorunlar\u0131n\u0131n ana \u00e7\u00f6z\u00fcm\u00fc, <code>Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;unun referans e\u015fitli\u011fini korumakt\u0131r (<code>useMemo<\/code>, <code>useCallback<\/code> ile). <code>React.memo<\/code> daha \u00e7ok, bile\u015fene d\u0131\u015far\u0131dan gelen prop&#8217;lar\u0131n de\u011fi\u015fmedi\u011fi durumlarda gereksiz render&#8217;lar\u0131 \u00f6nlemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Bu optimizasyon tekniklerini do\u011fru bir \u015fekilde uygulayarak, Context API&#8217;nin sa\u011flad\u0131\u011f\u0131 kolayl\u0131k ve esnekli\u011fin yan\u0131 s\u0131ra, uygulaman\u0131z\u0131n performans\u0131n\u0131 da koruyabilirsiniz.<\/p>\n<h2>Context API vs. State Y\u00f6netim K\u00fct\u00fcphaneleri (Redux, Zustand vb.)<\/h2>\n<p>React Context API, prop drilling sorununu \u00e7\u00f6zmek ve global durumu y\u00f6netmek i\u00e7in harika bir yerle\u015fik ara\u00e7 olsa da, piyasada Redux, Zustand, Recoil gibi bir\u00e7ok g\u00fc\u00e7l\u00fc harici durum y\u00f6netim k\u00fct\u00fcphanesi bulunmaktad\u0131r. Hangi arac\u0131 ne zaman kullanaca\u011f\u0131n\u0131za karar vermek, geli\u015ftiriciler i\u00e7in \u00f6nemli bir sorudur.<\/p>\n<h3>Ne Zaman Context Kullan\u0131lmal\u0131?<\/h3>\n<p>Context API, \u00f6zellikle a\u015fa\u011f\u0131daki senaryolarda tercih edilebilir:<\/p>\n<p>*   <strong>Uygulama Genelinde Payla\u015f\u0131lan, S\u0131k G\u00fcncellenmeyen Veriler:<\/strong> Tema ayarlar\u0131, kullan\u0131c\u0131n\u0131n kimlik do\u011frulama durumu, tercih edilen dil veya basit uygulama ayarlar\u0131 gibi veriler, Context API i\u00e7in idealdir. Bu veriler genellikle t\u00fcm uygulama genelinde eri\u015filebilir olmal\u0131, ancak \u00e7ok s\u0131k g\u00fcncellenmemelidir.<br \/>\n*   <strong>Orta D\u00fczeyde Karma\u015f\u0131k Olmayan Durumlar:<\/strong> Uygulaman\u0131z\u0131n global durumu \u00e7ok karma\u015f\u0131k de\u011filse ve \u00e7ok fazla farkl\u0131 eylem veya t\u00fcretilmi\u015f duruma (derived state) ihtiya\u00e7 duymuyorsa, Context API yeterli olacakt\u0131r.<br \/>\n*   <strong>K\u00fc\u00e7\u00fck ve Orta \u00d6l\u00e7ekli Uygulamalar:<\/strong> B\u00fcy\u00fck bir ba\u011f\u0131ml\u0131l\u0131k eklemek istemedi\u011finiz k\u00fc\u00e7\u00fck veya orta \u00f6l\u00e7ekli uygulamalar i\u00e7in Context API, h\u0131zl\u0131 ve hafif bir \u00e7\u00f6z\u00fcm sunar.<br \/>\n*   <strong>Boilerplate Kodundan Ka\u00e7\u0131nmak \u0130stedi\u011finizde:<\/strong> Redux gibi k\u00fct\u00fcphaneler, g\u00fc\u00e7l\u00fc \u00f6zellikler sunsa da, kurulum ve kullan\u0131m a\u00e7\u0131s\u0131ndan daha fazla boilerplate kodu gerektirebilir. Context API, daha az kodla benzer bir amaca ula\u015fman\u0131z\u0131 sa\u011flar.<br \/>\n*   <strong>React Ekosistemine G\u00fcvenmek \u0130stedi\u011finizde:<\/strong> Context API, React&#8217;in \u00e7ekirdek bir par\u00e7as\u0131d\u0131r. Bu, gelecekteki React g\u00fcncellemeleriyle uyumlulu\u011funun garanti edildi\u011fi ve topluluk deste\u011finin g\u00fc\u00e7l\u00fc oldu\u011fu anlam\u0131na gelir.<\/p>\n<p><strong>\u00d6zetle:<\/strong> Context API, &#8220;birka\u00e7 bile\u015fen taraf\u0131ndan kullan\u0131lan birka\u00e7 durum&#8221; i\u00e7in harikad\u0131r.<\/p>\n<h3>Ne Zaman Harici Bir K\u00fct\u00fcphane D\u00fc\u015f\u00fcn\u00fclmeli?<\/h3>\n<p>A\u015fa\u011f\u0131daki durumlarda Redux, Zustand, Recoil gibi harici bir durum y\u00f6netim k\u00fct\u00fcphanesi kullanmay\u0131 d\u00fc\u015f\u00fcnmelisiniz:<\/p>\n<p>*   <strong>B\u00fcy\u00fck \u00d6l\u00e7ekli Uygulamalar:<\/strong> Global durumun \u00e7ok b\u00fcy\u00fck, karma\u015f\u0131k ve bir\u00e7ok farkl\u0131 bile\u015fen aras\u0131nda etkile\u015fimli bir \u015fekilde payla\u015f\u0131ld\u0131\u011f\u0131 b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, Context API&#8217;nin sundu\u011fu basitlik yetersiz kalabilir.<br \/>\n*   <strong>Karma\u015f\u0131k, S\u0131k G\u00fcncellenen Durum:<\/strong> E\u011fer durumunuz s\u0131k s\u0131k de\u011fi\u015fiyor, birden fazla kaynaktan etkileniyor ve durumun g\u00fcncellenme mant\u0131\u011f\u0131 karma\u015f\u0131ksa (\u00f6rne\u011fin, birden fazla asenkron i\u015flem i\u00e7eren), harici k\u00fct\u00fcphaneler daha yap\u0131land\u0131r\u0131lm\u0131\u015f bir yakla\u015f\u0131m sunar.<br \/>\n*   <strong>Geli\u015fmi\u015f Geli\u015ftirici Ara\u00e7lar\u0131 ve Ara Yaz\u0131l\u0131mlar (Middleware):<\/strong> Redux DevTools gibi ara\u00e7lar, durumun zaman i\u00e7indeki de\u011fi\u015fimini izleme, hata ay\u0131klama ve &#8220;zaman yolculu\u011fu&#8221; gibi \u00f6zellikler sunar. Middleware&#8217;ler (thunk, saga gibi), asenkron eylemleri ve yan etkileri y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc mekanizmalar sa\u011flar. Context API&#8217;de bu t\u00fcr yerle\u015fik ara\u00e7lar yoktur.<br \/>\n*   <strong>Durumun Tutarl\u0131 ve \u00d6ng\u00f6r\u00fclebilir Bir \u015eekilde Y\u00f6netilmesi Gerekti\u011finde:<\/strong> Redux gibi k\u00fct\u00fcphaneler, durum g\u00fcncellemeleri i\u00e7in kat\u0131 kurallar (tek kaynakl\u0131 do\u011fru, durumun sadece saf fonksiyonlarla de\u011fi\u015ftirilmesi) uygulayarak, uygulaman\u0131z\u0131n durumunu daha \u00f6ng\u00f6r\u00fclebilir ve test edilebilir hale getirir.<br \/>\n*   <strong>Performans Optimizasyonlar\u0131 ve T\u00fcretilmi\u015f Durum Y\u00f6netimi:<\/strong> Baz\u0131 k\u00fct\u00fcphaneler, t\u00fcretilmi\u015f durumlar\u0131 (\u00f6rne\u011fin, Recoil&#8217;deki selectors veya Zustand&#8217;daki computed state) optimize edilmi\u015f bir \u015fekilde y\u00f6netmek i\u00e7in \u00f6zel mekanizmalar sunar. Context API&#8217;de bu t\u00fcr optimizasyonlar\u0131 manuel olarak <code>useMemo<\/code> ve <code>useCallback<\/code> ile yapman\u0131z gerekir.<br \/>\n*   <strong>Uygulama Genelinde Tutarl\u0131 Bir Durum Y\u00f6netimi Deseni \u0130stedi\u011finizde:<\/strong> B\u00fcy\u00fck ekiplerde, t\u00fcm geli\u015ftiricilerin durum y\u00f6netimi i\u00e7in ayn\u0131 deseni takip etmesini sa\u011flamak \u00f6nemlidir. Harici k\u00fct\u00fcphaneler, bu tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in belirli bir yap\u0131 ve kurallar sunar.<\/p>\n<p><strong>\u00d6zetle:<\/strong> Harici k\u00fct\u00fcphaneler, &#8220;\u00e7ok say\u0131da bile\u015fen taraf\u0131ndan kullan\u0131lan \u00e7ok say\u0131da durum&#8221; ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 i\u00e7in daha uygundur.<\/p>\n<p>Her iki yakla\u015f\u0131m\u0131n da kendine g\u00f6re g\u00fc\u00e7l\u00fc ve zay\u0131f y\u00f6nleri vard\u0131r. \u00d6nemli olan, projenizin gereksinimlerini ve \u00f6l\u00e7e\u011fini do\u011fru bir \u015fekilde de\u011ferlendirerek en uygun \u00e7\u00f6z\u00fcm\u00fc se\u00e7mektir. Bir\u00e7ok durumda, k\u00fc\u00e7\u00fck global durumlar i\u00e7in Context API&#8217;yi kullan\u0131rken, daha karma\u015f\u0131k veya kritik global durumlar i\u00e7in harici bir k\u00fct\u00fcphaneyi bir arada kullanmak da m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>React Context API, modern React uygulamalar\u0131nda durum payla\u015f\u0131m\u0131 sorununa zarif ve etkili bir \u00e7\u00f6z\u00fcm sunar. Prop drilling&#8217;i ortadan kald\u0131rarak kodun okunabilirli\u011fini art\u0131r\u0131r, bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r ve bile\u015fenlerin tekrar kullan\u0131labilirli\u011fini iyile\u015ftirir. Tema y\u00f6netimi, kullan\u0131c\u0131 kimlik do\u011frulama, dil se\u00e7imi gibi uygulama genelinde veya belirli bir alt a\u011fa\u00e7ta payla\u015f\u0131lan durumlar i\u00e7in ideal bir yerle\u015fik ara\u00e7t\u0131r.<\/p>\n<p>Makalemizde, Context API&#8217;nin temel bile\u015fenlerini (<code>createContext<\/code>, <code>Provider<\/code>, <code>useContext<\/code>) ad\u0131m ad\u0131m inceledik ve dinamik durumlar\u0131 nas\u0131l y\u00f6netece\u011fimizi, birden fazla Context&#8217;i nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 g\u00f6sterdik. Ayr\u0131ca, Context API&#8217;nin potansiyel performans sorunlar\u0131na kar\u015f\u0131 <code>useMemo<\/code> ve <code>useCallback<\/code> gibi optimizasyon tekniklerinin \u00f6nemini vurgulad\u0131k.<\/p>\n<p>Her ne kadar Context API g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, her senaryo i\u00e7in en iyi \u00e7\u00f6z\u00fcm de\u011fildir. \u00d6zellikle \u00e7ok b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, Redux veya Zustand gibi daha kapsaml\u0131 durum y\u00f6netim k\u00fct\u00fcphanelerinin sundu\u011fu geli\u015ftirici ara\u00e7lar\u0131, ara yaz\u0131l\u0131mlar ve yap\u0131land\u0131r\u0131lm\u0131\u015f y\u00f6netim desenleri daha uygun olabilir. Context API, &#8220;birka\u00e7 bile\u015fen taraf\u0131ndan kullan\u0131lan birka\u00e7 durum&#8221; i\u00e7in m\u00fckemmelken, harici k\u00fct\u00fcphaneler &#8220;\u00e7ok say\u0131da bile\u015fen taraf\u0131ndan kullan\u0131lan \u00e7ok say\u0131da durum&#8221; ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 i\u00e7in daha iyi bir se\u00e7enek sunar.<\/p>\n<p>Sonu\u00e7 olarak, React geli\u015ftiricileri olarak Context API&#8217;nin yeteneklerini ve s\u0131n\u0131rlamalar\u0131n\u0131 iyi anlamak, projelerimizde do\u011fru arac\u0131 se\u00e7memiz a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, Context API React uygulamalar\u0131n\u0131z\u0131n daha temiz, daha s\u00fcrd\u00fcr\u00fclebilir ve daha performansl\u0131 olmas\u0131na b\u00fcy\u00fck katk\u0131 sa\u011flayacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine\nModern web uygulamalar\u0131 geli\u015ftirirken, React gibi bile\u015fen tabanl\u0131 k\u00fct","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-31894","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 Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine - 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\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine\" \/>\n<meta property=\"og:description\" content=\"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine Modern web uygulamalar\u0131 geli\u015ftirirken, React gibi bile\u015fen tabanl\u0131 k\u00fct\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-15T05:41:17+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=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine\",\"datePublished\":\"2025-10-15T05:41:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/\"},\"wordCount\":4235,\"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-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/\",\"name\":\"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-15T05:41:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine\"}]},{\"@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 Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine - 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\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/","og_locale":"tr_TR","og_type":"article","og_title":"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine","og_description":"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine Modern web uygulamalar\u0131 geli\u015ftirirken, React gibi bile\u015fen tabanl\u0131 k\u00fct","og_url":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-15T05:41:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine","datePublished":"2025-10-15T05:41:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/"},"wordCount":4235,"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-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/","url":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/","name":"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-15T05:41:17+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-bilesenleri-arasinda-durum-paylasimi-context-api-derinlemesine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React Bile\u015fenleri Aras\u0131nda Durum Payla\u015f\u0131m\u0131: Context API Derinlemesine"}]},{"@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\/31894","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=31894"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31894\/revisions"}],"predecessor-version":[{"id":31895,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31894\/revisions\/31895"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}