{"id":38763,"date":"2026-02-07T05:40:41","date_gmt":"2026-02-07T02:40:41","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38763"},"modified":"2026-02-07T05:40:41","modified_gmt":"2026-02-07T02:40:41","slug":"reactin-yeni-context-apiini-taniyin","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/","title":{"rendered":"React&#8217;\u0131n Yeni Context API&#8217;\u0131n\u0131 Tan\u0131y\u0131n"},"content":{"rendered":"<p><body><\/p>\n<h2>React&#8217;\u0131n Yeni Context API&#8217;\u0131n\u0131 Tan\u0131y\u0131n<\/h2>\n<h3>Giri\u015f: React Context API Neden \u00d6nemli?<\/h3>\n<p>React, bile\u015fen tabanl\u0131 mimarisiyle modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bir JavaScript k\u00fct\u00fcphanesidir. Bile\u015fenler aras\u0131 veri ak\u0131\u015f\u0131, React&#8217;\u0131n temelini olu\u015fturur. Genellikle bu ak\u0131\u015f, ebeveyn bile\u015fenden \u00e7ocuk bile\u015fene &#8220;prop&#8221;lar arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015fir. Ancak, uygulama b\u00fcy\u00fcd\u00fck\u00e7e ve bile\u015fen a\u011fac\u0131 derinle\u015ftik\u00e7e, baz\u0131 verilerin bir\u00e7ok ara bile\u015fenden ge\u00e7irilmesi gerekebilir, bu da &#8220;prop drilling&#8221; olarak bilinen bir soruna yol a\u00e7ar. Prop drilling, kodun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve yeniden d\u00fczenlenmesini zorla\u015ft\u0131r\u0131r.<\/p>\n<p>React Context API, bu sorunu \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. Bile\u015fen a\u011fac\u0131nda, prop&#8217;lar\u0131 her seviyeden manuel olarak ge\u00e7irmeden veri payla\u015f\u0131m\u0131 yapman\u0131n bir yolunu sunar. Bu makalede, React&#8217;\u0131n &#8220;yeni&#8221; Context API&#8217;\u0131n\u0131 (React 16.3&#8217;ten itibaren kararl\u0131 hale gelen ve <code>useContext<\/code> hook&#8217;u ile \u00e7ok daha g\u00fc\u00e7l\u00fc hale gelen versiyonunu) derinlemesine inceleyece\u011fiz. Ne oldu\u011funu, nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, performans ipu\u00e7lar\u0131n\u0131 ve ne zaman kullan\u0131lmas\u0131 gerekti\u011fini detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z.<\/p>\n<h3>Prop Drilling Problemi ve Context&#8217;in Gerek\u00e7esi<\/h3>\n<p>React&#8217;te veri ak\u0131\u015f\u0131 genellikle tek y\u00f6nl\u00fcd\u00fcr: ebeveynden \u00e7ocu\u011fa. Bir bile\u015fenin bir alt bile\u015fenine veri g\u00f6ndermesi gerekti\u011finde, bu veriyi prop olarak iletir. Ancak, veri do\u011frudan bir alt bile\u015fene de\u011fil de, o alt bile\u015fenin i\u00e7indeki ba\u015fka bir alt bile\u015fene (yani daha derindeki bir bile\u015fene) gitmesi gerekiyorsa, bu veri aradaki t\u00fcm bile\u015fenlerden prop olarak ge\u00e7irilmek zorunda kal\u0131r. Bu duruma &#8220;prop drilling&#8221; denir.<\/p>\n<p>\u00d6rne\u011fin, bir <code>App<\/code> bile\u015feniniz oldu\u011funu ve bu bile\u015fenin bir <code>User<\/code> bile\u015fenine, <code>User<\/code> bile\u015feninin de bir <code>Avatar<\/code> bile\u015fenine ihtiyac\u0131 olan <code>theme<\/code> verisini tuttu\u011funu varsayal\u0131m:<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.jsx\nfunction App() {\n  const theme = { primaryColor: 'blue', secondaryColor: 'lightgray' };\n  return <Toolbar theme={theme} \/>;\n}\n\n\/\/ Toolbar.jsx\nfunction Toolbar({ theme }) {\n  return (\n    <div>\n      \n      <Button theme={theme}>Click Me<\/Button>\n      <User theme={theme} \/> {\/<em> theme prop'unu User'a ge\u00e7iriyoruz <\/em>\/}\n    <\/div>\n  );\n}\n\n\/\/ User.jsx\nfunction User({ theme }) {\n  const userName = \"John Doe\";\n  return (\n    <div>\n      <p>Welcome, {userName}<\/p>\n      <Avatar theme={theme} userName={userName} \/> {\/<em> theme prop'unu Avatar'a ge\u00e7iriyoruz <\/em>\/}\n    <\/div>\n  );\n}\n\n\/\/ Avatar.jsx\nfunction Avatar({ theme, userName }) {\n  return (\n    <div style={{ backgroundColor: theme.secondaryColor, color: theme.primaryColor }}>\n      {userName[0]}\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>theme<\/code> verisi sadece <code>Avatar<\/code> bile\u015feni taraf\u0131ndan kullan\u0131lmas\u0131na ra\u011fmen, <code>App<\/code>&#8216;ten <code>Toolbar<\/code>&#8216;a, <code>Toolbar<\/code>&#8216;dan <code>User<\/code>&#8216;a ve <code>User<\/code>&#8216;dan <code>Avatar<\/code>&#8216;a olmak \u00fczere \u00fc\u00e7 seviyeden prop olarak ge\u00e7irilmi\u015ftir. <code>Toolbar<\/code> ve <code>User<\/code> bile\u015fenleri <code>theme<\/code> prop&#8217;unu kendileri kullanmad\u0131klar\u0131 halde sadece bir arac\u0131 g\u00f6revi g\u00f6rm\u00fc\u015flerdir. Bu durum, bile\u015fenler aras\u0131nda gereksiz ba\u011f\u0131ml\u0131l\u0131klar yarat\u0131r, kodun okunabilirli\u011fini azalt\u0131r ve bir prop&#8217;un ad\u0131n\u0131 veya yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmek istedi\u011finizde bir\u00e7ok dosyada de\u011fi\u015fiklik yapman\u0131z gerekti\u011fi anlam\u0131na gelir.<\/p>\n<p>\u0130\u015fte tam da bu noktada React Context API devreye girer. Context, bu t\u00fcr &#8220;global&#8221; veya &#8220;yar\u0131-global&#8221; verileri, aradaki prop&#8217;lara ihtiya\u00e7 duymadan do\u011frudan ilgili bile\u015fenlere ula\u015ft\u0131rman\u0131n zarif bir yolunu sunar.<\/p>\n<h3>React Context API Nedir?<\/h3>\n<p>React Context API, React bile\u015fen a\u011fac\u0131nda veri payla\u015f\u0131m\u0131 i\u00e7in tasarlanm\u0131\u015f yerle\u015fik bir mekanizmad\u0131r. Bir Context olu\u015fturdu\u011funuzda, asl\u0131nda bir <code>Provider<\/code> ve bir <code>Consumer<\/code> (veya modern yakla\u015f\u0131mla <code>useContext<\/code> hook&#8217;u) elde edersiniz.<\/p>\n<p>*   <strong><code>Context<\/code> Objesi:<\/strong> <code>React.createContext()<\/code> ile olu\u015fturulan objedir. \u0130\u00e7inde <code>Provider<\/code> ve <code>Consumer<\/code> bile\u015fenlerini bar\u0131nd\u0131r\u0131r.<br \/>\n*   <strong><code>Context.Provider<\/code>:<\/strong> Bu bile\u015fen, Context&#8217;e de\u011fer sa\u011flamak i\u00e7in kullan\u0131l\u0131r. <code>value<\/code> prop&#8217;u arac\u0131l\u0131\u011f\u0131yla sa\u011flanan de\u011fer, bu <code>Provider<\/code>&#8216;\u0131n alt\u0131ndaki t\u00fcm bile\u015fenler taraf\u0131ndan eri\u015filebilir hale gelir.<br \/>\n*   <strong><code>Context.Consumer<\/code>:<\/strong> (Eski Y\u00f6ntem) Bu bile\u015fen, bir Context&#8217;ten de\u011fer almak i\u00e7in kullan\u0131l\u0131r. Bir &#8220;render prop&#8221; deseni arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong><code>useContext<\/code> Hook&#8217;u:<\/strong> (Modern ve Tercih Edilen Y\u00f6ntem) Fonksiyonel bile\u015fenlerde bir Context&#8217;ten de\u011fer almak i\u00e7in kullan\u0131lan React Hook&#8217;udur. <code>Context.Consumer<\/code>&#8216;a g\u00f6re \u00e7ok daha basit ve okunabilir bir sentaksa sahiptir.<\/p>\n<p>Temel fikir \u015fudur: Bir <code>Provider<\/code> bile\u015feni, a\u011fac\u0131n \u00fcst seviyelerine yerle\u015ftirilir ve bir de\u011feri <code>value<\/code> prop&#8217;u arac\u0131l\u0131\u011f\u0131yla sa\u011flar. Bu <code>Provider<\/code>&#8216;\u0131n alt\u0131ndaki herhangi bir bile\u015fen (derinli\u011fi ne olursa olsun), bu Context&#8217;i <code>useContext<\/code> hook&#8217;u (veya eski y\u00f6ntemlerle <code>Context.Consumer<\/code> veya <code>contextType<\/code>) arac\u0131l\u0131\u011f\u0131yla t\u00fcketebilir.<\/p>\n<h3><code>React.createContext()<\/code> Kullan\u0131m\u0131<\/h3>\n<p>Bir Context olu\u015fturmak i\u00e7in <code>React.createContext()<\/code> fonksiyonunu kullan\u0131r\u0131z. Bu fonksiyon, opsiyonel olarak bir varsay\u0131lan de\u011fer alabilir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/contexts\/ThemeContext.js\nimport React from 'react';\n\nconst ThemeContext = React.createContext({\n  primaryColor: 'gray', \/\/ Varsay\u0131lan de\u011fer\n  secondaryColor: 'white'\n});\n\nexport default ThemeContext;<\/code><\/pre>\n<p><code>React.createContext()<\/code>&#8216;e verdi\u011finiz varsay\u0131lan de\u011fer, a\u015fa\u011f\u0131daki iki durumda kullan\u0131l\u0131r:<br \/>\n1.  Bir bile\u015fen, ilgili <code>Provider<\/code>&#8216;\u0131 olmadan bir Context&#8217;i t\u00fcketmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda.<br \/>\n2.  Test ama\u00e7l\u0131, <code>Provider<\/code>&#8216;\u0131 mock&#8217;lamak istemedi\u011finiz durumlarda.<\/p>\n<p>Genellikle, <code>Provider<\/code> her zaman olaca\u011f\u0131 i\u00e7in bu varsay\u0131lan de\u011fer nadiren kullan\u0131l\u0131r. Ancak, <code>value<\/code> prop&#8217;u <code>undefined<\/code> veya <code>null<\/code> olarak ayarlan\u0131rsa, yine de varsay\u0131lan de\u011fer tetiklenir.<\/p>\n<h3><code>Context.Provider<\/code> Bile\u015feni<\/h3>\n<p><code>Context.Provider<\/code> bile\u015feni, olu\u015fturdu\u011fumuz Context&#8217;e bir de\u011fer sa\u011flamak i\u00e7in kullan\u0131l\u0131r. Bu de\u011feri, <code>value<\/code> ad\u0131nda \u00f6zel bir prop arac\u0131l\u0131\u011f\u0131yla iletiriz.<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.jsx\nimport React, { useState } from 'react';\nimport ThemeContext from '.\/contexts\/ThemeContext';\nimport Toolbar from '.\/components\/Toolbar';\n\nfunction App() {\n  const [theme, setTheme] = useState({ primaryColor: 'blue', secondaryColor: 'lightgray' });\n\n  const toggleTheme = () => {\n    setTheme(prevTheme => ({\n      primaryColor: prevTheme.primaryColor === 'blue' ? 'red' : 'blue',\n      secondaryColor: prevTheme.secondaryColor === 'lightgray' ? 'darkgray' : 'lightgray'\n    }));\n  };\n\n  return (\n    <ThemeContext.Provider value={theme}> {\/<em> Context de\u011ferini sa\u011fl\u0131yoruz <\/em>\/}\n      <div style={{ padding: '20px' }}>\n        <button onClick={toggleTheme}>Temay\u0131 De\u011fi\u015ftir<\/button>\n        <Toolbar \/>\n      <\/div>\n    <\/ThemeContext.Provider>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>App<\/code> bile\u015feni <code>ThemeContext.Provider<\/code>&#8216;\u0131 sarmalam\u0131\u015ft\u0131r. <code>value={theme}<\/code> prop&#8217;u sayesinde, <code>theme<\/code> objesi bu <code>Provider<\/code>&#8216;\u0131n alt\u0131ndaki t\u00fcm bile\u015fenler taraf\u0131ndan eri\u015filebilir hale gelir. Art\u0131k <code>Toolbar<\/code> bile\u015feninin <code>theme<\/code> prop&#8217;unu almas\u0131na gerek kalmaz.<\/p>\n<p>Bir uygulamada birden fazla Context kullanmak m\u00fcmk\u00fcnd\u00fcr. Bu durumda, <code>Provider<\/code>&#8216;lar\u0131 i\u00e7 i\u00e7e yerle\u015ftiririz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.jsx (Birden fazla Context \u00f6rne\u011fi)\nimport React from 'react';\nimport ThemeContext from '.\/contexts\/ThemeContext';\nimport UserContext from '.\/contexts\/UserContext';\nimport Layout from '.\/components\/Layout';\n\nconst currentUser = { name: 'Alice', isLoggedIn: true };\nconst currentTheme = { primaryColor: 'green', secondaryColor: 'lightgreen' };\n\nfunction App() {\n  return (\n    <UserContext.Provider value={currentUser}>\n      <ThemeContext.Provider value={currentTheme}>\n        <Layout \/>\n      <\/ThemeContext.Provider>\n    <\/UserContext.Provider>\n  );\n}<\/code><\/pre>\n<p>Bu \u015fekilde, <code>Layout<\/code> ve onun alt\u0131ndaki bile\u015fenler hem <code>UserContext<\/code>&#8216;e hem de <code>ThemeContext<\/code>&#8216;e eri\u015febilirler.<\/p>\n<h3>Context De\u011ferine Eri\u015fme Yollar\u0131<\/h3>\n<p>Context taraf\u0131ndan sa\u011flanan de\u011fere eri\u015fmenin \u00fc\u00e7 ana yolu vard\u0131r: <code>Context.Consumer<\/code> (class bile\u015fenleri i\u00e7in eski y\u00f6ntem), <code>contextType<\/code> (class bile\u015fenleri i\u00e7in tek Context) ve <code>useContext<\/code> hook&#8217;u (fonksiyonel bile\u015fenler i\u00e7in modern ve tercih edilen y\u00f6ntem).<\/p>\n<h4>Class Bile\u015fenlerinde <code>Context.Consumer<\/code> (Eski Y\u00f6ntem)<\/h4>\n<p><code>Context.Consumer<\/code> bile\u015feni, bir &#8220;render prop&#8221; deseni kullanarak Context de\u011ferine eri\u015fir. Bu, <code>Consumer<\/code>&#8216;\u0131n bir \u00e7ocuk olarak bir fonksiyon almas\u0131 ve bu fonksiyonun, Context de\u011ferini bir arg\u00fcman olarak al\u0131p render edilecek React elemanlar\u0131n\u0131 d\u00f6nd\u00fcrmesi anlam\u0131na gelir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ Avatar.jsx (Class bile\u015feni ile Context.Consumer)\nimport React from 'react';\nimport ThemeContext from '..\/contexts\/ThemeContext';\nimport UserContext from '..\/contexts\/UserContext'; \/\/ \u00d6rnek i\u00e7in UserContext'i de kullanal\u0131m\n\nclass Avatar extends React.Component {\n  render() {\n    return (\n      <UserContext.Consumer>\n        {user => (\n          <ThemeContext.Consumer>\n            {theme => (\n              <div style={{ backgroundColor: theme.secondaryColor, color: theme.primaryColor, padding: '10px', borderRadius: '5px' }}>\n                Merhaba, {user.name}! ({user.isLoggedIn ? 'Giri\u015f Yap\u0131ld\u0131' : 'Misafir'})\n                <span style={{ marginLeft: '10px', fontWeight: 'bold' }}>\n                  {user.name[0]}\n                <\/span>\n              <\/div>\n            )}\n          <\/ThemeContext.Consumer>\n        )}\n      <\/UserContext.Consumer>\n    );\n  }\n}\n\nexport default Avatar;<\/code><\/pre>\n<p><code>Context.Consumer<\/code> yakla\u015f\u0131m\u0131 \u00e7al\u0131\u015fsa da, birden fazla Context t\u00fcketmeniz gerekti\u011finde i\u00e7 i\u00e7e <code>Consumer<\/code>&#8216;lar nedeniyle &#8220;wrapper hell&#8221; olarak bilinen bir soruna yol a\u00e7abilir. Bu, kodun okunabilirli\u011fini ve d\u00fczenini olumsuz etkiler.<\/p>\n<h4>Class Bile\u015fenlerinde <code>contextType<\/code> (Sadece Tek Bir Context \u0130\u00e7in)<\/h4>\n<p>React 16.3&#8217;ten itibaren class bile\u015fenleri i\u00e7in <code>static contextType<\/code> \u00f6zelli\u011fi eklendi. Bu \u00f6zellik, bir class bile\u015feninin tek bir Context&#8217;e abone olmas\u0131n\u0131 sa\u011flar ve Context de\u011ferini <code>this.context<\/code> arac\u0131l\u0131\u011f\u0131yla eri\u015filebilir k\u0131lar.<\/p>\n<pre><code class=\"language-jsx\">\/\/ Avatar.jsx (Class bile\u015feni ile contextType)\nimport React from 'react';\nimport ThemeContext from '..\/contexts\/ThemeContext';\n\nclass Avatar extends React.Component {\n  static contextType = ThemeContext; \/\/ Sadece tek bir Context'e abone olabilir\n\n  render() {\n    const theme = this.context; \/\/ Context de\u011ferine this.context ile eri\u015fim\n    \/\/ Bu bile\u015fen UserContext'e bu y\u00f6ntemle eri\u015femez, bunun i\u00e7in Consumer kullanmas\u0131 gerekir.\n    const userName = \"John Doe\"; \/\/ Bu bilgiyi prop olarak veya ba\u015fka bir context'ten almal\u0131\n\n    return (\n      <div style={{ backgroundColor: theme.secondaryColor, color: theme.primaryColor, padding: '10px', borderRadius: '5px' }}>\n        {userName[0]}\n      <\/div>\n    );\n  }\n}\n\nexport default Avatar;<\/code><\/pre>\n<p><code>contextType<\/code> daha temiz bir sentaks sunsa da, en b\u00fcy\u00fck k\u0131s\u0131tlamas\u0131 bir bile\u015fenin sadece tek bir Context&#8217;e abone olabilmesidir. Birden fazla Context&#8217;e ihtiyac\u0131n\u0131z varsa, yine <code>Context.Consumer<\/code>&#8216;lar\u0131 kullanman\u0131z veya bile\u015feninizi fonksiyonel bir bile\u015fene d\u00f6n\u00fc\u015ft\u00fcr\u00fcp <code>useContext<\/code> kullanman\u0131z gerekir.<\/p>\n<h4>Fonksiyonel Bile\u015fenlerde <code>useContext<\/code> Hook&#8217;u (Modern ve Tercih Edilen Y\u00f6ntem)<\/h4>\n<p>React 16.8 ile tan\u0131t\u0131lan <code>useContext<\/code> hook&#8217;u, Context API&#8217;\u0131n\u0131 fonksiyonel bile\u015fenlerde kullanmay\u0131 inan\u0131lmaz derecede basit ve g\u00fc\u00e7l\u00fc hale getirdi. <code>useContext<\/code> hook&#8217;u, bir Context objesini arg\u00fcman olarak al\u0131r ve o Context&#8217;in g\u00fcncel de\u011ferini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-jsx\">\/\/ Avatar.jsx (Fonksiyonel bile\u015fen ile useContext)\nimport React, { useContext } from 'react';\nimport ThemeContext from '..\/contexts\/ThemeContext';\nimport UserContext from '..\/contexts\/UserContext';\n\nfunction Avatar() {\n  const theme = useContext(ThemeContext); \/\/ ThemeContext'ten de\u011feri al\n  const user = useContext(UserContext);   \/\/ UserContext'ten de\u011feri al\n\n  return (\n    <div style={{ backgroundColor: theme.secondaryColor, color: theme.primaryColor, padding: '10px', borderRadius: '5px' }}>\n      Merhaba, {user.name}! ({user.isLoggedIn ? 'Giri\u015f Yap\u0131ld\u0131' : 'Misafir'})\n      <span style={{ marginLeft: '10px', fontWeight: 'bold' }}>\n        {user.name[0]}\n      <\/span>\n    <\/div>\n  );\n}\n\nexport default Avatar;<\/code><\/pre>\n<p><code>useContext<\/code> hook&#8217;u, hem kodun okunabilirli\u011fini art\u0131r\u0131r hem de birden fazla Context&#8217;i kolayca t\u00fcketmenizi sa\u011flar. Modern React uygulamalar\u0131nda Context kullan\u0131rken tercih edilen y\u00f6ntem budur. <code>useContext<\/code> sayesinde &#8220;wrapper hell&#8221; problemi ortadan kalkar ve bile\u015fenler daha temiz ve i\u015flevsel kal\u0131r.<\/p>\n<h3>Context API ile \u00c7al\u0131\u015f\u0131rken Performans Optimizasyonu<\/h3>\n<p>Context API, prop drilling sorununu \u00e7\u00f6zerken, dikkatli kullan\u0131lmad\u0131\u011f\u0131nda performans sorunlar\u0131na yol a\u00e7abilir. Bunun temel nedeni \u015fudur: Bir <code>Context.Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;u de\u011fi\u015fti\u011finde, o <code>Provider<\/code>&#8216;\u0131n alt\u0131ndaki ve o Context&#8217;i t\u00fcketen <em>t\u00fcm<\/em> bile\u015fenler (hatta <code>shouldComponentUpdate<\/code> veya <code>React.memo<\/code> ile optimize edilmi\u015f olsalar bile) yeniden render edilir.<\/p>\n<p>Bu durum, <code>value<\/code> prop&#8217;unun her render&#8217;da yeni bir obje veya dizi referans\u0131 olu\u015fturmas\u0131yla s\u0131k\u00e7a ya\u015fan\u0131r. JavaScript&#8217;te objeler ve diziler referans tipindedir; yani <code>{} === {}<\/code> false&#8217;tur. Her render&#8217;da yeni bir obje olu\u015fturursan\u0131z, React bunu de\u011fi\u015fmi\u015f bir de\u011fer olarak alg\u0131lar ve Context&#8217;i t\u00fcketen t\u00fcm bile\u015fenleri yeniden render eder.<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.jsx (Performans sorunu yaratabilecek \u00f6rnek)\nimport React, { useState } from 'react';\nimport ThemeContext from '.\/contexts\/ThemeContext';\nimport Toolbar from '.\/components\/Toolbar';\n\nfunction App() {\n  const [themeName, setThemeName] = useState('light');\n\n  const toggleTheme = () => {\n    setThemeName(prev => (prev === 'light' ? 'dark' : 'light'));\n  };\n\n  \/\/ Her render'da yeni bir 'theme' objesi olu\u015fturuluyor!\n  const theme = {\n    primaryColor: themeName === 'light' ? 'black' : 'white',\n    secondaryColor: themeName === 'light' ? 'white' : 'black'\n  };\n\n  return (\n    <ThemeContext.Provider value={theme}> {\/<em> theme objesi her render'da yeni bir referans <\/em>\/}\n      <div style={{ padding: '20px' }}>\n        <button onClick={toggleTheme}>Temay\u0131 De\u011fi\u015ftir<\/button>\n        <Toolbar \/>\n      <\/div>\n    <\/ThemeContext.Provider>\n  );\n}<\/code><\/pre>\n<p><code>Toolbar<\/code> ve onun alt\u0131ndaki t\u00fcm Context t\u00fcketicileri, <code>themeName<\/code> de\u011fi\u015fmese bile (\u00f6rne\u011fin <code>App<\/code> i\u00e7inde ba\u015fka bir state g\u00fcncellense bile) <code>theme<\/code> objesinin referans\u0131 her render&#8217;da de\u011fi\u015fti\u011fi i\u00e7in yeniden render olacakt\u0131r.<\/p>\n<h4>Memoizasyon Teknikleri ile Optimizasyon<\/h4>\n<p>Bu performans sorununu \u00e7\u00f6zmek i\u00e7in React&#8217;\u0131n memoizasyon mekanizmalar\u0131n\u0131 kullanabiliriz:<\/p>\n<p>1.  <strong><code>useMemo<\/code> ile <code>value<\/code> prop&#8217;unu stabilize etmek:<\/strong> <code>useMemo<\/code> hook&#8217;u, pahal\u0131 hesaplamalar\u0131n sonu\u00e7lar\u0131n\u0131 \u00f6nbelle\u011fe almam\u0131z\u0131 sa\u011flar. <code>Context.Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;unu <code>useMemo<\/code> i\u00e7ine alarak, ba\u011f\u0131ml\u0131l\u0131klar\u0131 de\u011fi\u015fmedi\u011fi s\u00fcrece ayn\u0131 obje referans\u0131n\u0131n kullan\u0131lmas\u0131n\u0131 sa\u011flayabiliriz.<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.jsx (useMemo ile optimize edilmi\u015f)\n    import React, { useState, useMemo } from 'react';\n    import ThemeContext from '.\/contexts\/ThemeContext';\n    import Toolbar from '.\/components\/Toolbar';\n\n    function App() {\n      const [themeName, setThemeName] = useState('light');\n      const [count, setCount] = useState(0); \/\/ Ekstra bir state\n\n      const toggleTheme = () => {\n        setThemeName(prev => (prev === 'light' ? 'dark' : 'light'));\n      };\n\n      \/\/ theme objesi sadece themeName de\u011fi\u015fti\u011finde yeniden olu\u015fturulur\n      const theme = useMemo(() => ({\n        primaryColor: themeName === 'light' ? 'black' : 'white',\n        secondaryColor: themeName === 'light' ? 'white' : 'black'\n      }), [themeName]); \/\/ Ba\u011f\u0131ml\u0131l\u0131k dizisi: themeName de\u011fi\u015fti\u011finde yeniden hesapla\n\n      return (\n        <ThemeContext.Provider value={theme}>\n          <div style={{ padding: '20px' }}>\n            <button onClick={toggleTheme}>Temay\u0131 De\u011fi\u015ftir<\/button>\n            <button onClick={() => setCount(c => c + 1)}>Sayac\u0131 Art\u0131r: {count}<\/button>\n            <Toolbar \/>\n          <\/div>\n        <\/ThemeContext.Provider>\n      );\n    }<\/code><\/pre>\n<p>    Bu durumda, <code>count<\/code> state&#8217;i de\u011fi\u015fti\u011finde <code>App<\/code> yeniden render olsa bile, <code>themeName<\/code> de\u011fi\u015fmedi\u011fi s\u00fcrece <code>theme<\/code> objesinin referans\u0131 ayn\u0131 kal\u0131r. Bu da <code>ThemeContext<\/code>&#8216;i t\u00fcketen bile\u015fenlerin gereksiz yere yeniden render olmas\u0131n\u0131 engeller (tabii e\u011fer bu bile\u015fenler de <code>React.memo<\/code> ile sarmalanm\u0131\u015fsa).<\/p>\n<p>2.  <strong><code>React.memo<\/code> ile t\u00fcketici bile\u015fenleri optimize etmek:<\/strong> <code>React.memo<\/code> (fonksiyonel bile\u015fenler i\u00e7in) veya <code>PureComponent<\/code> (class bile\u015fenleri i\u00e7in), bir bile\u015fenin prop&#8217;lar\u0131 de\u011fi\u015fmedi\u011fi s\u00fcrece yeniden render olmas\u0131n\u0131 engeller. Ancak, Context de\u011feri de\u011fi\u015fti\u011finde, <code>useContext<\/code> hook&#8217;u bile\u015fenin yeniden render olmas\u0131n\u0131 tetikler ve <code>React.memo<\/code> bunu durduramaz. <code>React.memo<\/code> daha \u00e7ok bile\u015fene prop olarak gelen de\u011ferler i\u00e7in etkilidir.<\/p>\n<p>    Context&#8217;i kullanan bir bile\u015fen, Context de\u011feri de\u011fi\u015fti\u011finde <em>her zaman<\/em> yeniden render olacakt\u0131r. Bu, Context&#8217;i kullanman\u0131n do\u011fas\u0131nda vard\u0131r. Optimizasyon, <code>Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;unu m\u00fcmk\u00fcn oldu\u011funca stabil tutarak gereksiz Context g\u00fcncellemelerini \u00f6nlemekle ilgilidir.<\/p>\n<p>3.  <strong>Context&#8217;i daha k\u00fc\u00e7\u00fck par\u00e7alara ay\u0131rmak:<\/strong> E\u011fer Context objenizde s\u0131k de\u011fi\u015fen ve nadiren de\u011fi\u015fen de\u011ferler bir aradaysa, bunlar\u0131 ayr\u0131 Context&#8217;lere b\u00f6lmek mant\u0131kl\u0131 olabilir. B\u00f6ylece, sadece de\u011fi\u015fen Context&#8217;i t\u00fcketen bile\u015fenler yeniden render olur.<\/p>\n<pre><code class=\"language-jsx\">\/\/ Ayr\u0131 Context'ler\n    const AuthContext = React.createContext();\n    const ThemeContext = React.createContext();\n\n    function App() {\n      const [user, setUser] = useState({ name: 'Alice', isLoggedIn: true });\n      const [theme, setTheme] = useState('light');\n\n      const authContextValue = useMemo(() => ({ user, setUser }), [user]);\n      const themeContextValue = useMemo(() => ({ theme, setTheme }), [theme]);\n\n      return (\n        <AuthContext.Provider value={authContextValue}>\n          <ThemeContext.Provider value={themeContextValue}>\n            {\/<em> ... <\/em>\/}\n          <\/ThemeContext.Provider>\n        <\/AuthContext.Provider>\n      );\n    }<\/code><\/pre>\n<p>    Bu yakla\u015f\u0131m, \u00f6rne\u011fin sadece tema de\u011fi\u015fti\u011finde kullan\u0131c\u0131 bilgilerini t\u00fcketen bile\u015fenlerin yeniden render olmas\u0131n\u0131 engeller.<\/p>\n<h3>Context&#8217;i Ne Zaman Kullanmal\u0131y\u0131z?<\/h3>\n<p>Context API, her t\u00fcrl\u00fc veriyi payla\u015fmak i\u00e7in kullan\u0131labilse de, belirli senaryolarda \u00f6zellikle parlar:<\/p>\n<p>*   <strong>Tema Ayarlar\u0131:<\/strong> Uygulaman\u0131n genel tema ayarlar\u0131n\u0131 (a\u00e7\u0131k\/koyu mod, renk paletleri vb.) bile\u015fen a\u011fac\u0131nda payla\u015fmak.<br \/>\n*   <strong>Kullan\u0131c\u0131 Kimlik Do\u011frulama Durumu:<\/strong> Giri\u015f yapm\u0131\u015f kullan\u0131c\u0131 bilgileri, oturum durumu gibi verileri global olarak eri\u015filebilir k\u0131lmak.<br \/>\n*   <strong>Dil ve Yerelle\u015ftirme:<\/strong> Uygulaman\u0131n ge\u00e7erli dilini ve \u00e7eviri fonksiyonlar\u0131n\u0131 sa\u011flamak.<br \/>\n*   <strong>Uygulama Ayarlar\u0131:<\/strong> Kullan\u0131c\u0131n\u0131n tercih etti\u011fi ayarlar (\u00f6rne\u011fin, bildirim tercihleri, g\u00f6r\u00fcnt\u00fcleme se\u00e7enekleri) gibi global konfig\u00fcrasyonlar.<br \/>\n*   <strong>Prop Drilling&#8217;i \u00d6nlemek:<\/strong> Bir verinin \u00e7ok say\u0131da ara bile\u015fenden ge\u00e7irilmesi gerekti\u011fi ve bu ara bile\u015fenlerin veriyi kendilerinin kullanmad\u0131\u011f\u0131 durumlar.<\/p>\n<p>Context API, &#8220;k\u00fcresel&#8221; verilere kolay eri\u015fim sa\u011flaman\u0131n ve prop drilling&#8217;i azaltman\u0131n harika bir yoludur.<\/p>\n<h3>Context&#8217;i Ne Zaman Kullanmamal\u0131y\u0131z? (Alternatifler)<\/h3>\n<p>Context API g\u00fc\u00e7l\u00fc olsa da, her zaman en iyi \u00e7\u00f6z\u00fcm de\u011fildir ve yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda sorunlara yol a\u00e7abilir.<\/p>\n<p>*   <strong>S\u0131k G\u00fcncellenen, Karma\u015f\u0131k Global State Y\u00f6netimi:<\/strong> E\u011fer uygulaman\u0131z\u0131n state&#8217;i \u00e7ok karma\u015f\u0131k, s\u0131k g\u00fcncellenen ve bir\u00e7ok farkl\u0131 bile\u015fen aras\u0131nda birbirine ba\u011fl\u0131ysa, Context API tek ba\u015f\u0131na yeterli olmayabilir. Bu t\u00fcr durumlarda Redux, Zustand, Recoil, Jotai gibi \u00f6zel state y\u00f6netim k\u00fct\u00fcphaneleri daha uygun \u00e7\u00f6z\u00fcmler sunar. Bu k\u00fct\u00fcphaneler genellikle daha geli\u015fmi\u015f optimizasyon, hata ay\u0131klama ara\u00e7lar\u0131 ve middleware gibi \u00f6zelliklere sahiptir. Context API, bu k\u00fct\u00fcphanelerin sa\u011flad\u0131\u011f\u0131 &#8220;se\u00e7ici abonelik&#8221; (selective subscription) mekanizmalar\u0131na sahip de\u011fildir; yani Context&#8217;teki k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik bile t\u00fcm t\u00fcketicileri yeniden render edebilir.<\/p>\n<p>*   <strong>Bile\u015fenler Aras\u0131 Yerel \u0130leti\u015fim:<\/strong> E\u011fer veri sadece iki veya \u00fc\u00e7 seviye derinlikteki bile\u015fenler aras\u0131nda payla\u015f\u0131l\u0131yorsa ve bu veri yerel bir state ise, prop drilling&#8217;in maliyeti Context API&#8217;\u0131n\u0131 kurman\u0131n karma\u015f\u0131kl\u0131\u011f\u0131ndan daha az olabilir. Basit durumlarda prop ge\u00e7irmek veya callback fonksiyonlar\u0131 kullanmak daha anla\u015f\u0131l\u0131r ve daha az &#8220;overhead&#8221; olu\u015fturabilir.<\/p>\n<p>*   <strong>\u00c7ok S\u0131k De\u011fi\u015fen De\u011ferler:<\/strong> Context&#8217;in <code>value<\/code> prop&#8217;u \u00e7ok s\u0131k de\u011fi\u015fiyorsa ve bu de\u011fi\u015fiklikler y\u00fcz\u00fcnden bir\u00e7ok bile\u015fen gereksiz yere yeniden render ediliyorsa, performans sorunlar\u0131 ya\u015fayabilirsiniz. Bu durumda, ya Context&#8217;i daha k\u00fc\u00e7\u00fck par\u00e7alara ay\u0131rman\u0131z ya da daha optimize state y\u00f6netim k\u00fct\u00fcphanelerine y\u00f6nelmeniz gerekebilir.<\/p>\n<p>*   <strong>API \u00c7a\u011fr\u0131lar\u0131 ve Cache Y\u00f6netimi:<\/strong> API&#8217;dan gelen verilerin y\u00f6netimi, \u00f6nbellekleme (caching) ve asenkron state&#8217;ler i\u00e7in React Query (TanStack Query), SWR gibi veri \u00e7ekme k\u00fct\u00fcphaneleri genellikle Context API&#8217;dan daha iyi bir \u00e7\u00f6z\u00fcmd\u00fcr. Bu k\u00fct\u00fcphaneler, verinin y\u00fcklenmesi, hata durumu, tekrar deneme, \u00f6nbellekleme ve g\u00fcncel tutulmas\u0131 gibi konularda \u00f6zel \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<h3>Context API ile Daha Geli\u015fmi\u015f Kullan\u0131m Senaryolar\u0131: <code>useReducer<\/code> ile State Y\u00f6netimi<\/h3>\n<p><code>useContext<\/code> hook&#8217;u, <code>useReducer<\/code> hook&#8217;u ile birle\u015ftirildi\u011finde, Redux benzeri basit bir global state y\u00f6netim sistemi olu\u015fturmak i\u00e7in olduk\u00e7a g\u00fc\u00e7l\u00fc bir ara\u00e7 haline gelir. Bu desen, orta b\u00fcy\u00fckl\u00fckteki uygulamalar i\u00e7in harici bir state y\u00f6netim k\u00fct\u00fcphanesine ihtiya\u00e7 duymadan yeterli olabilir.<\/p>\n<p>\u00d6rne\u011fin, bir yap\u0131lacaklar listesi uygulamas\u0131 i\u00e7in bir Context ve <code>useReducer<\/code> kombinasyonu:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/contexts\/TodoContext.js\nimport React, { createContext, useReducer, useContext } from 'react';\n\n\/\/ 1. Context'i olu\u015ftur\nconst TodoContext = createContext();\n\n\/\/ 2. Reducer fonksiyonunu tan\u0131mla\nconst todoReducer = (state, action) => {\n  switch (action.type) {\n    case 'ADD_TODO':\n      return [...state, { id: Date.now(), text: action.payload, completed: false }];\n    case 'TOGGLE_TODO':\n      return state.map(todo =>\n        todo.id === action.payload ? { ...todo, completed: !todo.completed } : todo\n      );\n    case 'REMOVE_TODO':\n      return state.filter(todo => todo.id !== action.payload);\n    default:\n      return state;\n  }\n};\n\n\/\/ 3. Provider bile\u015fenini olu\u015ftur\nexport const TodoProvider = ({ children }) => {\n  const [todos, dispatch] = useReducer(todoReducer, []); \/\/ Ba\u015flang\u0131\u00e7 state'i bo\u015f dizi\n\n  \/\/ value prop'unu useMemo ile stabilize et\n  const contextValue = useMemo(() => ({ todos, dispatch }), [todos]);\n\n  return (\n    <TodoContext.Provider value={contextValue}>\n      {children}\n    <\/TodoContext.Provider>\n  );\n};\n\n\/\/ 4. Custom hook olu\u015ftur (iste\u011fe ba\u011fl\u0131 ama \u00f6nerilir)\nexport const useTodos = () => {\n  const context = useContext(TodoContext);\n  if (context === undefined) {\n    throw new Error('useTodos must be used within a TodoProvider');\n  }\n  return context;\n};<\/code><\/pre>\n<p>\u015eimdi bu <code>TodoContext<\/code>&#8216;i nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m:<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.jsx\nimport React from 'react';\nimport { TodoProvider } from '.\/contexts\/TodoContext';\nimport TodoList from '.\/components\/TodoList';\nimport AddTodoForm from '.\/components\/AddTodoForm';\n\nfunction App() {\n  return (\n    <TodoProvider>\n      <div style={{ padding: '20px', maxWidth: '600px', margin: '0 auto' }}>\n        \n        <AddTodoForm \/>\n        <TodoList \/>\n      <\/div>\n    <\/TodoProvider>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/AddTodoForm.jsx\nimport React, { useState } from 'react';\nimport { useTodos } from '..\/contexts\/TodoContext';\n\nfunction AddTodoForm() {\n  const [todoText, setTodoText] = useState('');\n  const { dispatch } = useTodos(); \/\/ dispatch fonksiyonunu Context'ten al\n\n  const handleSubmit = (e) => {\n    e.preventDefault();\n    if (todoText.trim()) {\n      dispatch({ type: 'ADD_TODO', payload: todoText }); \/\/ dispatch ile eylem g\u00f6nder\n      setTodoText('');\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit} style={{ display: 'flex', marginBottom: '20px' }}>\n      <input\n        type=\"text\"\n        value={todoText}\n        onChange={(e) => setTodoText(e.target.value)}\n        placeholder=\"Yeni g\u00f6rev ekle...\"\n        style={{ flexGrow: 1, padding: '10px', border: '1px solid #ddd', borderRadius: '4px' }}\n      \/>\n      <button type=\"submit\" style={{ padding: '10px 15px', marginLeft: '10px', backgroundColor: '#007bff', color: 'white', border: 'none', borderRadius: '4px', cursor: 'pointer' }}>\n        Ekle\n      <\/button>\n    <\/form>\n  );\n}\n\nexport default AddTodoForm;<\/code><\/pre>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/TodoList.jsx\nimport React from 'react';\nimport { useTodos } from '..\/contexts\/TodoContext';\n\nfunction TodoList() {\n  const { todos, dispatch } = useTodos(); \/\/ todos ve dispatch'i Context'ten al\n\n  return (\n    <ul style={{ listStyle: 'none', padding: 0 }}>\n      {todos.map(todo => (\n        <li key={todo.id} style={{ display: 'flex', alignItems: 'center', marginBottom: '10px', padding: '10px', border: '1px solid #eee', borderRadius: '4px', backgroundColor: todo.completed ? '#f0f0f0' : 'white' }}>\n          <input\n            type=\"checkbox\"\n            checked={todo.completed}\n            onChange={() => dispatch({ type: 'TOGGLE_TODO', payload: todo.id })}\n            style={{ marginRight: '10px' }}\n          \/>\n          <span style={{ textDecoration: todo.completed ? 'line-through' : 'none', flexGrow: 1 }}>\n            {todo.text}\n          <\/span>\n          <button\n            onClick={() => dispatch({ type: 'REMOVE_TODO', payload: todo.id })}\n            style={{ background: 'none', border: 'none', color: 'red', cursor: 'pointer', fontSize: '1.2em' }}\n          >\n            &times;\n          <\/button>\n        <\/li>\n      ))}\n    <\/ul>\n  );\n}\n\nexport default TodoList;<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>TodoProvider<\/code>&#8216;\u0131 uygulaman\u0131n en \u00fcst seviyesine yerle\u015ftirerek <code>todos<\/code> state&#8217;ini ve <code>dispatch<\/code> fonksiyonunu t\u00fcm alt bile\u015fenlere sa\u011flad\u0131k. <code>useTodos<\/code> custom hook&#8217;u sayesinde, herhangi bir fonksiyonel bile\u015fen bu bilgilere kolayca eri\u015febilir ve <code>dispatch<\/code> fonksiyonunu kullanarak state&#8217;i g\u00fcvenli bir \u015fekilde g\u00fcncelleyebilir. <code>useMemo<\/code> kullan\u0131m\u0131, <code>todos<\/code> dizisi de\u011fi\u015fmedi\u011fi s\u00fcrece <code>contextValue<\/code> referans\u0131n\u0131n ayn\u0131 kalmas\u0131n\u0131 sa\u011flayarak gereksiz yeniden render&#8217;lar\u0131 \u00f6nler.<\/p>\n<h3>\u00d6zet ve En \u0130yi Uygulamalar<\/h3>\n<p>React&#8217;\u0131n yeni Context API&#8217;\u0131, prop drilling sorununu \u00e7\u00f6zmek ve bile\u015fen a\u011fac\u0131nda veri payla\u015f\u0131m\u0131n\u0131 kolayla\u015ft\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7t\u0131r. <code>useContext<\/code> hook&#8217;u sayesinde, fonksiyonel bile\u015fenlerde Context kullan\u0131m\u0131 olduk\u00e7a basitle\u015fmi\u015f ve modern React geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir.<\/p>\n<p><strong>Anahtar \u00c7\u0131kar\u0131mlar:<\/strong><br \/>\n*   <strong>Prop Drilling&#8217;i Azalt\u0131r:<\/strong> Global veya yar\u0131-global verileri ara bile\u015fenlere prop olarak ge\u00e7irme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<br \/>\n*   <strong>Basit Kullan\u0131m:<\/strong> <code>React.createContext()<\/code>, <code>Context.Provider<\/code> ve <code>useContext()<\/code> temel yap\u0131 ta\u015flar\u0131d\u0131r.<br \/>\n*   <strong>Modern Yakla\u015f\u0131m:<\/strong> <code>useContext<\/code> hook&#8217;u, Context de\u011ferini t\u00fcketmenin en temiz ve tercih edilen yoludur.<br \/>\n*   <strong>Performans Optimizasyonu:<\/strong> <code>Context.Provider<\/code>&#8216;\u0131n <code>value<\/code> prop&#8217;unun referans\u0131n\u0131n stabil kalmas\u0131 i\u00e7in <code>useMemo<\/code> kullanmak \u00f6nemlidir. Aksi takdirde, Context&#8217;i t\u00fcketen t\u00fcm bile\u015fenler gereksiz yere yeniden render olabilir.<br \/>\n*   <strong><code>useReducer<\/code> ile G\u00fc\u00e7l\u00fc Kombinasyon:<\/strong> <code>useContext<\/code> ve <code>useReducer<\/code> birlikte kullan\u0131larak Redux benzeri basit bir state y\u00f6netim sistemi olu\u015fturulabilir.<br \/>\n*   <strong>Ne Zaman Kullanmal\u0131:<\/strong> Tema, kimlik do\u011frulama, dil gibi global ayarlar i\u00e7in idealdir.<br \/>\n*   <strong>Ne Zaman Alternatif D\u00fc\u015f\u00fcnmeli:<\/strong> \u00c7ok karma\u015f\u0131k, s\u0131k g\u00fcncellenen veya asenkron veri y\u00f6netimi gerektiren durumlar i\u00e7in Redux, Zustand, React Query gibi k\u00fct\u00fcphaneler daha uygun olabilir.<\/p>\n<p>Context API&#8217;\u0131, React&#8217;\u0131n temel yeteneklerini geni\u015fleterek daha temiz, daha s\u00fcrd\u00fcr\u00fclebilir ve daha performansl\u0131 uygulamalar geli\u015ftirmenize olanak tan\u0131r. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, React ekosistemindeki en de\u011ferli ara\u00e7lardan biridir. Uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re ne zaman Context kullanaca\u011f\u0131n\u0131za ve ne zaman alternatif \u00e7\u00f6z\u00fcmlere y\u00f6nelece\u011finize karar vermek, deneyimle geli\u015fen \u00f6nemli bir beceridir.<\/p>\n","protected":false},"excerpt":{"rendered":"React&#8217;\u0131n Yeni Context API&#8217;\u0131n\u0131 Tan\u0131y\u0131n\nGiri\u015f: React Context API Neden \u00d6nemli?\nReact, bile\u015fen tabanl\u0131 mimarisiyle modern web uygulamalar\u0131 ge","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-38763","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React&#039;\u0131n Yeni Context API&#039;\u0131n\u0131 Tan\u0131y\u0131n - 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\/reactin-yeni-context-apiini-taniyin\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React&#039;\u0131n Yeni Context API&#039;\u0131n\u0131 Tan\u0131y\u0131n\" \/>\n<meta property=\"og:description\" content=\"React&#039;\u0131n Yeni Context API&#039;\u0131n\u0131 Tan\u0131y\u0131n Giri\u015f: React Context API Neden \u00d6nemli? React, bile\u015fen tabanl\u0131 mimarisiyle modern web uygulamalar\u0131 ge\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-07T02:40:41+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React&#8217;\u0131n Yeni Context API&#8217;\u0131n\u0131 Tan\u0131y\u0131n\",\"datePublished\":\"2026-02-07T02:40:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/\"},\"wordCount\":2489,\"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\/reactin-yeni-context-apiini-taniyin\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/\",\"name\":\"React'\u0131n Yeni Context API'\u0131n\u0131 Tan\u0131y\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-07T02:40:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React&#8217;\u0131n Yeni Context API&#8217;\u0131n\u0131 Tan\u0131y\u0131n\"}]},{\"@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'\u0131n Yeni Context API'\u0131n\u0131 Tan\u0131y\u0131n - 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\/reactin-yeni-context-apiini-taniyin\/","og_locale":"tr_TR","og_type":"article","og_title":"React'\u0131n Yeni Context API'\u0131n\u0131 Tan\u0131y\u0131n","og_description":"React'\u0131n Yeni Context API'\u0131n\u0131 Tan\u0131y\u0131n Giri\u015f: React Context API Neden \u00d6nemli? React, bile\u015fen tabanl\u0131 mimarisiyle modern web uygulamalar\u0131 ge","og_url":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-07T02:40:41+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React&#8217;\u0131n Yeni Context API&#8217;\u0131n\u0131 Tan\u0131y\u0131n","datePublished":"2026-02-07T02:40:41+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/"},"wordCount":2489,"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\/reactin-yeni-context-apiini-taniyin\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/","url":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/","name":"React'\u0131n Yeni Context API'\u0131n\u0131 Tan\u0131y\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-07T02:40:41+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/reactin-yeni-context-apiini-taniyin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React&#8217;\u0131n Yeni Context API&#8217;\u0131n\u0131 Tan\u0131y\u0131n"}]},{"@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\/38763","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=38763"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38763\/revisions"}],"predecessor-version":[{"id":38764,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38763\/revisions\/38764"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}