{"id":34380,"date":"2025-11-15T23:31:07","date_gmt":"2025-11-15T20:31:07","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/"},"modified":"2025-11-15T23:31:07","modified_gmt":"2025-11-15T20:31:07","slug":"react-usereducer-derin-dalis-quizden-kidemli-desenlere","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/","title":{"rendered":"React useReducer Derin Dal\u0131\u015f: Quiz&#8217;den K\u0131demli Desenlere"},"content":{"rendered":"<p><body><\/p>\n<p>React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de <code>useState<\/code> hook&#8217;unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale, <code>useReducer<\/code>&#8216;\u0131n temel prensiplerinden ileri d\u00fczey kullan\u0131m kal\u0131plar\u0131na kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak, sizi bir ba\u015flang\u0131\u00e7 seviyesinden k\u0131demli bir React geli\u015ftirici seviyesine ta\u015f\u0131yacak.<\/p>\n<p>React\u2019\u0131n temel yap\u0131 ta\u015flar\u0131ndan biri olan state (durum) y\u00f6netimi, uygulamalar\u0131n dinamik ve etkile\u015fimli olmas\u0131n\u0131 sa\u011flayan kritik bir unsurdur. K\u00fc\u00e7\u00fck \u00f6l\u00e7ekli uygulamalarda <code>useState<\/code> hook&#8217;u genellikle yeterli olurken, uygulamalar b\u00fcy\u00fcd\u00fck\u00e7e ve state mant\u0131\u011f\u0131 daha karma\u015f\u0131k hale geldik\u00e7e, <code>useState<\/code> kullan\u0131m\u0131 baz\u0131 zorluklar\u0131 beraberinde getirebilir. \u00d6zellikle bir state g\u00fcncellemesi ba\u015fka bir state&#8217;e ba\u011fl\u0131 oldu\u011funda veya bir\u00e7ok state g\u00fcncellemesinin ayn\u0131 anda ger\u00e7ekle\u015fmesi gerekti\u011finde, kodun okunabilirli\u011fi ve bak\u0131m\u0131 zorla\u015fabilir. \u0130\u015fte tam da bu noktada <code>useReducer<\/code> devreye girer; <code>useState<\/code>&#8216;e g\u00f6re daha yap\u0131land\u0131r\u0131lm\u0131\u015f ve \u00f6ng\u00f6r\u00fclebilir bir state y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc sunar.<\/p>\n<p><code>useReducer<\/code>, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, JavaScript&#8217;teki <code>Array.prototype.reduce()<\/code> metodunun \u00e7al\u0131\u015fma prensibine benzer bir mant\u0131kla i\u015fler. Bir <strong>reducer<\/strong> fonksiyonu, mevcut state&#8217;i ve bir <strong>action<\/strong>&#8216;\u0131 alarak yeni bir state d\u00f6nd\u00fcr\u00fcr. Bu model, \u00f6zellikle Redux gibi k\u00fct\u00fcphanelerde yayg\u0131n olarak kullan\u0131lan &#8220;tek kaynak do\u011fruluk&#8221; prensibine dayan\u0131r ve state de\u011fi\u015fimlerini merkezi bir mant\u0131kla y\u00f6netmeyi kolayla\u015ft\u0131r\u0131r. B\u00f6ylece, uygulaman\u0131n herhangi bir yerinden bir action g\u00f6nderildi\u011finde, state&#8217;in nas\u0131l de\u011fi\u015fece\u011fi tek bir yerde tan\u0131mlanm\u0131\u015f olur, bu da hatalar\u0131n izlenmesini ve d\u00fczeltilmesini \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ayr\u0131ca, state g\u00fcncellemelerinin ard\u0131\u015f\u0131k oldu\u011fu veya \u00f6nceki state&#8217;e ba\u011fl\u0131 oldu\u011fu durumlarda <code>useReducer<\/code>, <code>useState<\/code>&#8216;in callback formlar\u0131na k\u0131yasla daha temiz ve anla\u015f\u0131l\u0131r bir kod yap\u0131s\u0131 sunar. Dolay\u0131s\u0131yla, state mant\u0131\u011f\u0131n\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131\u011f\u0131nda veya birden fazla alt bile\u015fenin ayn\u0131 state&#8217;i payla\u015fmas\u0131 gerekti\u011finde, <code>useReducer<\/code> kullanmak, uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131racakt\u0131r.<\/p>\n<h2>useReducer Temelleri: State, Action ve Reducer Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p><code>useReducer<\/code>&#8216;\u0131 anlamak i\u00e7in \u00fc\u00e7 temel kavram\u0131 netle\u015ftirmemiz gerekiyor: <strong>state<\/strong>, <strong>action<\/strong> ve <strong>reducer<\/strong>. Bu \u00fc\u00e7l\u00fc, <code>useReducer<\/code> hook&#8217;unun kalbini olu\u015fturur ve birlikte uyumlu bir \u015fekilde \u00e7al\u0131\u015farak uygulaman\u0131z\u0131n durumunu y\u00f6netir. Hadi her birini ayr\u0131 ayr\u0131 inceleyelim ve basit bir saya\u00e7 \u00f6rne\u011fi \u00fczerinden nas\u0131l i\u015flediklerini g\u00f6relim.<\/p>\n<p><strong>1. State (Durum):<\/strong> Uygulaman\u0131z\u0131n mevcut anl\u0131k veri y\u0131\u011f\u0131n\u0131d\u0131r. Bir kullan\u0131c\u0131n\u0131n ad\u0131, bir \u00fcr\u00fcn\u00fcn sepet miktar\u0131, bir g\u00f6revin tamamlan\u0131p tamamlanmad\u0131\u011f\u0131 gibi dinamik bilgiler state i\u00e7inde tutulur. <code>useReducer<\/code> ba\u011flam\u0131nda, state genellikle bir JavaScript nesnesi veya basit bir de\u011fer olabilir. \u00d6rne\u011fin, bir saya\u00e7 uygulamas\u0131 i\u00e7in state basit\u00e7e bir say\u0131 olabilir: <code>{ count: 0 }<\/code>.<\/p>\n<p><strong>2. Action (Eylem):<\/strong> State&#8217;i de\u011fi\u015ftirmek i\u00e7in g\u00f6nderilen bir sinyaldir. Action&#8217;lar genellikle bir <code>type<\/code> \u00f6zelli\u011fi i\u00e7eren basit JavaScript nesneleridir ve iste\u011fe ba\u011fl\u0131 olarak bir <code>payload<\/code> (y\u00fck) ta\u015f\u0131yabilirler. <code>type<\/code>, hangi de\u011fi\u015fikli\u011fin yap\u0131laca\u011f\u0131n\u0131 belirtirken, <code>payload<\/code> ise bu de\u011fi\u015fiklik i\u00e7in gerekli veriyi ta\u015f\u0131r. \u00d6rne\u011fin, bir saya\u00e7 i\u00e7in art\u0131rma action&#8217;\u0131 <code>{ type: 'INCREMENT' }<\/code> \u015feklinde olabilirken, belirli bir de\u011ferle art\u0131rma action&#8217;\u0131 <code>{ type: 'INCREMENT_BY', payload: 5 }<\/code> \u015feklinde olabilir. Action&#8217;lar, uygulaman\u0131zda neyin ger\u00e7ekle\u015fti\u011fini tan\u0131mlayan soyut mesajlar gibidir.<\/p>\n<p><strong>3. Reducer (\u0130ndirgeyici):<\/strong> Mevcut state&#8217;i ve g\u00f6nderilen action&#8217;\u0131 alarak, bu bilgilere g\u00f6re yeni bir state d\u00f6nd\u00fcren saf bir fonksiyondur. Saf fonksiyon olmas\u0131 demek, ayn\u0131 input&#8217;larla her zaman ayn\u0131 output&#8217;u vermesi ve d\u0131\u015far\u0131dan hi\u00e7bir side effect (yan etki) \u00fcretmemesi anlam\u0131na gelir. Reducer fonksiyonu genellikle bir <code>switch<\/code> ifadesi kullan\u0131larak farkl\u0131 action t\u00fcrlerine g\u00f6re farkl\u0131 state de\u011fi\u015fimlerini y\u00f6netir. Reducer fonksiyonu asla mevcut state&#8217;i do\u011frudan de\u011fi\u015ftirmez; bunun yerine, her zaman yeni bir state nesnesi d\u00f6nd\u00fcr\u00fcr. Bu prensip, React&#8217;\u0131n ve immutability (de\u011fi\u015fmezlik) kavram\u0131n\u0131n temelini olu\u015fturur ve state y\u00f6netimini \u00e7ok daha \u00f6ng\u00f6r\u00fclebilir hale getirir. <\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, basit bir saya\u00e7 uygulamas\u0131 i\u00e7in bu \u00fc\u00e7 bile\u015fenin nas\u0131l bir araya geldi\u011fini g\u00f6rebilirsiniz:<\/p>\n<pre><code>\n    \/\/ 1. Reducer Fonksiyonu\n    const counterReducer = (state, action) => {\n      switch (action.type) {\n        case 'INCREMENT':\n          return { count: state.count + 1 };\n        case 'DECREMENT':\n          return { count: state.count - 1 };\n        case 'RESET':\n          return { count: 0 };\n        case 'INCREMENT_BY_AMOUNT':\n          return { count: state.count + action.payload };\n        default:\n          return state; \/\/ Bilinmeyen action'lar i\u00e7in mevcut state'i d\u00f6nd\u00fcr\n      }\n    };\n\n    \/\/ 2. React Bile\u015feni i\u00e7inde useReducer kullan\u0131m\u0131\n    const Counter = () => {\n      \/\/ useReducer hook'u: [state, dispatch] d\u00f6nd\u00fcr\u00fcr\n      \/\/ \u0130lk arg\u00fcman: Reducer fonksiyonu\n      \/\/ \u0130kinci arg\u00fcman: Ba\u015flang\u0131\u00e7 state'i\n      const [state, dispatch] = React.useReducer(counterReducer, { count: 0 });\n\n      return (\n        <div>\n          <h3>Saya\u00e7: {state.count}<\/h3>\n          <button onClick={() => dispatch({ type: 'INCREMENT' })}>Art\u0131r<\/button>\n          <button onClick={() => dispatch({ type: 'DECREMENT' })}>Azalt<\/button>\n          <button onClick={() => dispatch({ type: 'RESET' })}>S\u0131f\u0131rla<\/button>\n          <button onClick={() => dispatch({ type: 'INCREMENT_BY_AMOUNT', payload: 5 })}>5 Art\u0131r<\/button>\n        <\/div>\n      );\n    };\n\n    ReactDOM.render(<Counter \/>, document.getElementById('root'));\n  <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>counterReducer<\/code> fonksiyonu, state ve action'a g\u00f6re state'i nas\u0131l g\u00fcncelleyece\u011fini belirler. <code>Counter<\/code> bile\u015feni i\u00e7inde ise <code>useReducer<\/code> hook'unu kullanarak <code>state<\/code>'i ve state'i g\u00fcncellemek i\u00e7in kullan\u0131lan <code>dispatch<\/code> fonksiyonunu elde ederiz. Her bir butona t\u0131kland\u0131\u011f\u0131nda, ilgili <code>action<\/code> <code>dispatch<\/code> edilerek <code>reducer<\/code>'a g\u00f6nderilir ve state g\u00fcncellenir. Bu, state y\u00f6netimini merkezi ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde yapmam\u0131z\u0131 sa\u011flar, \u00f6zellikle de uygulamam\u0131zda birden fazla state de\u011fi\u015fikli\u011fi gerekti\u011finde bu yakla\u015f\u0131m\u0131n faydalar\u0131 belirginle\u015fir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir G\u00f6rev Y\u00f6netim Uygulamas\u0131 ile useReducer<\/h2>\n<p>Basit bir saya\u00e7 \u00f6rne\u011fi, <code>useReducer<\/code>'\u0131n temelini anlamak i\u00e7in harika olsa da, ger\u00e7ek d\u00fcnya uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan karma\u015f\u0131kl\u0131klar genellikle \u00e7ok daha fazlad\u0131r. \u015eimdi, bir g\u00f6rev (todo) y\u00f6netim uygulamas\u0131 geli\u015ftirerek <code>useReducer<\/code>'\u0131n daha karma\u015f\u0131k state yap\u0131lar\u0131n\u0131 ve birden fazla action t\u00fcr\u00fcn\u00fc nas\u0131l y\u00f6netece\u011fini derinlemesine inceleyelim. Bu vaka analizi, g\u00f6rev ekleme, silme, tamamlama ve filtreleme gibi yayg\u0131n i\u015flevleri kapsayacak ve <code>useReducer<\/code>'\u0131n neden b\u00fcy\u00fck uygulamalarda tercih edildi\u011fini g\u00f6zler \u00f6n\u00fcne serecek.<\/p>\n<p>Hayal edelim ki kullan\u0131c\u0131lar\u0131n g\u00f6revlerini listeleyebilece\u011fi, yeni g\u00f6revler ekleyebilece\u011fi, mevcut g\u00f6revleri tamamland\u0131 olarak i\u015faretleyebilece\u011fi ve hatta belirli kriterlere g\u00f6re g\u00f6revleri filtreleyebilece\u011fi bir uygulama yap\u0131yoruz. Bu uygulama i\u00e7in state'imiz sadece bir say\u0131 de\u011fil, g\u00f6rev nesnelerinden olu\u015fan bir dizi ve filtre ayarlar\u0131n\u0131 i\u00e7erecektir. \u0130lk olarak, ba\u015flang\u0131\u00e7 state'imizi ve reducer fonksiyonumuzu tan\u0131mlayarak ba\u015flayal\u0131m.<\/p>\n<pre><code>\n    \/\/ Ba\u015flang\u0131\u00e7 State'i\n    const initialTodosState = {\n      todos: [],\n      filter: 'all', \/\/ 'all', 'active', 'completed'\n      nextId: 1, \/\/ Yeni g\u00f6revlere benzersiz ID atamak i\u00e7in\n    };\n\n    \/\/ Reducer Fonksiyonu\n    const todosReducer = (state, action) => {\n      switch (action.type) {\n        case 'ADD_TODO':\n          return {\n            ...state,\n            todos: [\n              ...state.todos,\n              {\n                id: state.nextId,\n                text: action.payload.text,\n                completed: false,\n              },\n            ],\n            nextId: state.nextId + 1,\n          };\n        case 'TOGGLE_TODO':\n          return {\n            ...state,\n            todos: state.todos.map((todo) =>\n              todo.id === action.payload.id\n                ? { ...todo, completed: !todo.completed }\n                : todo\n            ),\n          };\n        case 'REMOVE_TODO':\n          return {\n            ...state,\n            todos: state.todos.filter((todo) => todo.id !== action.payload.id),\n          };\n        case 'SET_FILTER':\n          return {\n            ...state,\n            filter: action.payload.filter,\n          };\n        default:\n          return state;\n      }\n    };\n  <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>todosReducer<\/code> fonksiyonunda, farkl\u0131 action t\u00fcrlerine (<code>ADD_TODO<\/code>, <code>TOGGLE_TODO<\/code>, <code>REMOVE_TODO<\/code>, <code>SET_FILTER<\/code>) g\u00f6re state'in nas\u0131l de\u011fi\u015fti\u011fini g\u00f6r\u00fcyoruz. Her durumda, reducer mevcut state'i asla do\u011frudan de\u011fi\u015ftirmiyor; bunun yerine, immutability prensibine uygun olarak her zaman yeni bir state nesnesi d\u00f6nd\u00fcr\u00fcyor. \u00d6zellikle <code>ADD_TODO<\/code> durumunda, yeni bir g\u00f6rev eklenirken <code>nextId<\/code>'nin de g\u00fcncellenmesi, state'in tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<p>\u015eimdi bu reducer'\u0131 kullanan bir React bile\u015feni olu\u015ftural\u0131m. Bu bile\u015fen, kullan\u0131c\u0131 aray\u00fcz\u00fc ile reducer aras\u0131nda k\u00f6pr\u00fc g\u00f6revi g\u00f6recek.<\/p>\n<pre><code>\n    const TodoApp = () => {\n      const [state, dispatch] = React.useReducer(todosReducer, initialTodosState);\n      const [newTodoText, setNewTodoText] = React.useState('');\n\n      const filteredTodos = state.todos.filter((todo) => {\n        if (state.filter === 'active') return !todo.completed;\n        if (state.filter === 'completed') return todo.completed;\n        return true;\n      });\n\n      const handleAddTodo = (e) => {\n        e.preventDefault();\n        if (newTodoText.trim() === '') return;\n        dispatch({ type: 'ADD_TODO', payload: { text: newTodoText } });\n        setNewTodoText('');\n      };\n\n      return (\n        <div>\n          <h3>G\u00f6rev Y\u00f6netim Uygulamas\u0131<\/h3>\n          <form onSubmit={handleAddTodo}>\n            <input\n              type=\"text\"\n              value={newTodoText}\n              onChange={(e) => setNewTodoText(e.target.value)}\n              placeholder=\"Yeni g\u00f6rev ekle...\"\n            \/>\n            <button type=\"submit\">Ekle<\/button>\n          <\/form>\n\n          <div style={{ margin: '10px 0' }}>\n            <button onClick={() => dispatch({ type: 'SET_FILTER', payload: { filter: 'all' } })}>T\u00fcm\u00fc<\/button>\n            <button onClick={() => dispatch({ type: 'SET_FILTER', payload: { filter: 'active' } })}>Aktif<\/button>\n            <button onClick={() => dispatch({ type: 'SET_FILTER', payload: { filter: 'completed' } })}>Tamamlanan<\/button>\n          <\/div>\n\n          <ul>\n            {filteredTodos.map((todo) => (\n              <li key={todo.id}>\n                <span\n                  style={{\n                    textDecoration: todo.completed ? 'line-through' : 'none',\n                    cursor: 'pointer',\n                  }}\n                  onClick={() => dispatch({ type: 'TOGGLE_TODO', payload: { id: todo.id } })}\n                >\n                  {todo.text}\n                <\/span>\n                <button\n                  onClick={() => dispatch({ type: 'REMOVE_TODO', payload: { id: todo.id } })}\n                  style={{ marginLeft: '10px' }}\n                >\n                  Sil\n                <\/button>\n              <\/li>\n            ))}\n          <\/ul>\n        <\/div>\n      );\n    };\n\n    ReactDOM.render(<TodoApp \/>, document.getElementById('root'));\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>TodoApp<\/code> bile\u015feni, <code>useReducer<\/code> ile y\u00f6netilen g\u00f6revlerin ve filtre durumunun tek bir yerde tutuldu\u011fu merkezi bir state'e sahiptir. Her bir kullan\u0131c\u0131 etkile\u015fimi (g\u00f6rev ekleme, tamamlama, silme, filtreleme), ilgili bir action'\u0131n <code>dispatch<\/code> edilmesiyle tetiklenir. Bu yakla\u015f\u0131m, state mant\u0131\u011f\u0131n\u0131 UI mant\u0131\u011f\u0131ndan ay\u0131rarak, bile\u015fenin daha sade ve odaklanm\u0131\u015f olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, uygulaman\u0131n farkl\u0131 b\u00f6l\u00fcmlerinden ayn\u0131 state mant\u0131\u011f\u0131na eri\u015fim ihtiyac\u0131 do\u011fdu\u011funda, <code>useContext<\/code> ile birle\u015ftirilerek global state y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc olarak da kullan\u0131labilir, ki bu da bizi bir sonraki ileri d\u00fczey konuya ta\u015f\u0131yor.<\/p>\n<h2>Geli\u015fmi\u015f useReducer Kullan\u0131m\u0131: Middleware, Asenkron \u0130\u015flemler ve Performans Optimizasyonu<\/h2>\n<p><code>useReducer<\/code>'\u0131n temel kullan\u0131m\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 g\u00f6rd\u00fckten sonra, \u015fimdi daha karma\u015f\u0131k senaryolara, \u00f6zellikle asenkron i\u015flemlerin y\u00f6netimine, middleware entegrasyonuna ve performans optimizasyonlar\u0131na odaklanal\u0131m. Bu konular, <code>useReducer<\/code>'\u0131 sadece basit bir state y\u00f6netim arac\u0131 olmaktan \u00e7\u0131kar\u0131p, daha b\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm haline getirir.<\/p>\n<h3>Asenkron \u0130\u015flemlerle useReducer Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>React'ta state g\u00fcncellemeleri genellikle senkronize olur. Ancak API \u00e7a\u011fr\u0131lar\u0131, zamanlay\u0131c\u0131lar veya di\u011fer yan etkiler gibi asenkron i\u015flemler, <code>useReducer<\/code>'\u0131n \"saf\" do\u011fas\u0131na do\u011frudan uymaz. Reducer'lar saf olmal\u0131 ve yan etkileri i\u00e7ermemelidir. Bu nedenle, asenkron i\u015flemleri y\u00f6netmek i\u00e7in action dispatch edilmeden \u00f6nce veya action dispatch edildikten sonra baz\u0131 ara katmanlara ihtiyac\u0131m\u0131z vard\u0131r. Geleneksel olarak Redux ekosisteminde Redux Thunk veya Redux Saga gibi middleware'ler kullan\u0131l\u0131r. <code>useReducer<\/code> ile benzer bir pattern'\u0131 kendimiz uygulayabiliriz.<\/p>\n<p>En yayg\u0131n y\u00f6ntem, asenkron bir i\u015flemi ba\u015flatan bir \"thunk\" fonksiyonu olu\u015fturmakt\u0131r. Bu fonksiyon, arg\u00fcman olarak <code>dispatch<\/code> metodunu al\u0131r ve asenkron i\u015flemi tamamlad\u0131ktan sonra ilgili action'lar\u0131 dispatch eder. Bu sayede, reducer saf kal\u0131r ve sadece state de\u011fi\u015fimleriyle ilgilenir.<\/p>\n<pre><code>\n    \/\/ Asenkron bir veri \u00e7ekme i\u015flemi i\u00e7in Action T\u00fcrleri\n    const DATA_FETCH_START = 'DATA_FETCH_START';\n    const DATA_FETCH_SUCCESS = 'DATA_FETCH_SUCCESS';\n    const DATA_FETCH_ERROR = 'DATA_FETCH_ERROR';\n\n    \/\/ Reducer'da yeni durumlar\u0131 ele al\n    const dataReducer = (state, action) => {\n      switch (action.type) {\n        case DATA_FETCH_START:\n          return { ...state, loading: true, error: null };\n        case DATA_FETCH_SUCCESS:\n          return { ...state, loading: false, data: action.payload, error: null };\n        case DATA_FETCH_ERROR:\n          return { ...state, loading: false, error: action.payload };\n        default:\n          return state;\n      }\n    };\n\n    \/\/ Asenkron i\u015flemi y\u00f6neten thunk benzeri bir fonksiyon\n    const fetchData = async (dispatch, url) => {\n      dispatch({ type: DATA_FETCH_START });\n      try {\n        const response = await fetch(url);\n        if (!response.ok) {\n          throw new Error('Network response was not ok');\n        }\n        const data = await response.json();\n        dispatch({ type: DATA_FETCH_SUCCESS, payload: data });\n      } catch (error) {\n        dispatch({ type: DATA_FETCH_ERROR, payload: error.message });\n      }\n    };\n\n    const DataFetcher = () => {\n      const [state, dispatch] = React.useReducer(dataReducer, {\n        loading: false,\n        data: null,\n        error: null,\n      });\n\n      \/\/ fetchData fonksiyonunu do\u011frudan \u00e7a\u011f\u0131rmak yerine, bir sarmalay\u0131c\u0131 kullan\u0131r\u0131z\n      const handleFetchClick = () => {\n        fetchData(dispatch, 'https:\/\/jsonplaceholder.typicode.com\/posts\/1');\n      };\n\n      return (\n        <div>\n          <h3>Asenkron Veri \u00c7ekme<\/h3>\n          <button onClick={handleFetchClick} disabled={state.loading}>\n            {state.loading ? 'Veri \u00c7ekiliyor...' : 'Veri \u00c7ek'}\n          <\/button>\n          {state.error && <p style={{ color: 'red' }}>Hata: {state.error}<\/p>}\n          {state.data && <p>Ba\u015fl\u0131k: {state.data.title}<\/p>}\n        <\/div>\n      );\n    };\n\n    ReactDOM.render(<DataFetcher \/>, document.getElementById('root'));\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, asenkron i\u015flemleri bile\u015fenlerden soyutlayarak, reducer'\u0131n temiz ve saf kalmas\u0131n\u0131 sa\u011flar. <code>fetchData<\/code> fonksiyonu, i\u015flem ba\u015flad\u0131\u011f\u0131nda, ba\u015far\u0131l\u0131 oldu\u011funda veya hata olu\u015ftu\u011funda ilgili action'lar\u0131 dispatch ederek state'i g\u00fcnceller.<\/p>\n<h3>Middleware ve <code>useContext<\/code> ile Global State Y\u00f6netimi<\/h3>\n<p>B\u00fcy\u00fck uygulamalarda, state'in birden fazla bile\u015fen taraf\u0131ndan eri\u015filebilir olmas\u0131 gerekebilir. Bu durumda <code>useReducer<\/code>'\u0131 <code>useContext<\/code> ile birle\u015ftirmek, Redux'a benzer global state y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc olu\u015fturman\u0131n etkili bir yoludur. Bu sayede, state'i prop drilling yapmadan derinle\u015fimli bile\u015fen a\u011fa\u00e7lar\u0131nda kolayca payla\u015fabiliriz.<\/p>\n<pre><code>\n    \/\/ Context olu\u015fturma\n    const GlobalStateContext = React.createContext();\n    const GlobalDispatchContext = React.createContext();\n\n    \/\/ Provider bile\u015feni\n    const GlobalStateProvider = ({ children }) => {\n      const [state, dispatch] = React.useReducer(dataReducer, {\n        loading: false,\n        data: null,\n        error: null,\n      });\n\n      return (\n        <GlobalStateContext.Provider value={state}>\n          <GlobalDispatchContext.Provider value={dispatch}>\n            {children}\n          <\/GlobalDispatchContext.Provider>\n        <\/GlobalStateContext.Provider>\n      );\n    };\n\n    \/\/ \u00c7ocuk bile\u015feni (state ve dispatch'i kullan\u0131r)\n    const ChildComponent = () => {\n      const state = React.useContext(GlobalStateContext);\n      const dispatch = React.useContext(GlobalDispatchContext);\n\n      const handleFetchClick = () => {\n        fetchData(dispatch, 'https:\/\/jsonplaceholder.typicode.com\/todos\/1'); \/\/ Ayn\u0131 fetchData fonksiyonunu kullanabiliriz\n      };\n\n      return (\n        <div>\n          <h4>\u00c7ocuk Bile\u015feni<\/h4>\n          <button onClick={handleFetchClick} disabled={state.loading}>\n            {state.loading ? 'Veri \u00c7ekiliyor...' : 'Todo Verisi \u00c7ek'}\n          <\/button>\n          {state.error && <p style={{ color: 'red' }}>Hata: {state.error}<\/p>}\n          {state.data && <p>Todo Ba\u015fl\u0131\u011f\u0131: {state.data.title}<\/p>}\n        <\/div>\n      );\n    };\n\n    \/\/ Ana Uygulama bile\u015feni\n    const App = () => (\n      <GlobalStateProvider>\n        <h2>Global State Uygulamas\u0131<\/h2>\n        <ChildComponent \/>\n      <\/GlobalStateProvider>\n    );\n\n    ReactDOM.render(<App \/>, document.getElementById('root'));\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131, uygulaman\u0131zdaki herhangi bir bile\u015fenin <code>GlobalStateContext<\/code>'ten state'e ve <code>GlobalDispatchContext<\/code>'ten <code>dispatch<\/code> fonksiyonuna eri\u015fmesini sa\u011flar. B\u00f6ylece, bile\u015fenleriniz temiz kal\u0131r ve global state'i y\u00f6netmek i\u00e7in ayr\u0131 bir k\u00fct\u00fcphaneye ihtiya\u00e7 duymazs\u0131n\u0131z.<\/p>\n<h3>Performans Optimizasyonu<\/h3>\n<p><code>useReducer<\/code>, <code>useState<\/code>'e k\u0131yasla baz\u0131 performans avantajlar\u0131 sunabilir, \u00f6zellikle \u00e7ok s\u0131k g\u00fcncellenen veya karma\u015f\u0131k state yap\u0131lar\u0131na sahip uygulamalarda. Ancak yine de dikkatli olmak gerekir. Reducer her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda yeni bir state nesnesi d\u00f6nd\u00fcrd\u00fc\u011f\u00fc i\u00e7in, React bu yeni state'i kar\u015f\u0131la\u015ft\u0131rarak ilgili bile\u015fenleri yeniden render eder. A\u015f\u0131r\u0131 yeniden render'lar\u0131 \u00f6nlemek i\u00e7in:<\/p>\n<ul>\n<li>\n      <strong>Memoizasyon (<code>React.memo<\/code>, <code>useCallback<\/code>, <code>useMemo<\/code>):<\/strong> Alt bile\u015fenlerinizi <code>React.memo<\/code> ile sarmalayarak, sadece prop'lar\u0131 de\u011fi\u015fti\u011finde yeniden render olmalar\u0131n\u0131 sa\u011flayabilirsiniz. <code>dispatch<\/code> fonksiyonu referans olarak sabit oldu\u011fu i\u00e7in, bu optimizasyonu yaparken sorun ya\u015famazs\u0131n\u0131z. Ancak reducer'\u0131n d\u00f6nd\u00fcrd\u00fc\u011f\u00fc state'in baz\u0131 k\u0131s\u0131mlar\u0131 de\u011fi\u015fmese bile, t\u00fcm state objesi de\u011fi\u015fiyorsa, bile\u015fenleriniz yine de yeniden render olabilir. Bu durumda, <code>useSelector<\/code> benzeri \u00f6zel hook'lar yazarak sadece ihtiya\u00e7 duyulan state par\u00e7alar\u0131n\u0131 \u00e7ekebilirsiniz.\n    <\/li>\n<li>\n      <strong>Reducer'\u0131 D\u0131\u015far\u0131da Tan\u0131mlamak:<\/strong> Reducer fonksiyonunu bile\u015fen d\u0131\u015f\u0131nda tan\u0131mlamak, her render'da yeniden olu\u015fturulmas\u0131n\u0131 engeller ve dolay\u0131s\u0131yla performans\u0131 art\u0131r\u0131r.\n    <\/li>\n<li>\n      <strong>Ba\u015flang\u0131\u00e7 State'ini Lazy Y\u00fcklemek:<\/strong> E\u011fer ba\u015flang\u0131\u00e7 state'i pahal\u0131 bir hesaplama gerektiriyorsa, <code>useReducer<\/code>'\u0131n \u00fc\u00e7\u00fcnc\u00fc arg\u00fcman\u0131 olan <code>init<\/code> fonksiyonunu kullanarak bu hesaplamay\u0131 sadece ilk render'da yapabilirsiniz.<\/p>\n<pre><code>\n        const init = (initialCount) => ({ count: initialCount });\n        const [state, dispatch] = React.useReducer(reducer, 0, init); \/\/ 0, initialCount'a d\u00f6n\u00fc\u015f\u00fcr\n      <\/pre>\n<p><\/code>\n    <\/li>\n<\/ul>\n<div style=\"background-color: #e0f2f7; border-left: 5px solid #2196f3; padding: 15px; margin: 20px 0;\">\n<p style=\"margin: 0;\"><strong>Uzman \u0130pucu:<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k state a\u011fa\u00e7lar\u0131nda, reducer'lar\u0131 mant\u0131ksal olarak daha k\u00fc\u00e7\u00fck par\u00e7alara (\u00f6rne\u011fin, <code>combineReducers<\/code> mant\u0131\u011f\u0131yla) b\u00f6lmek, her bir reducer'\u0131n yaln\u0131zca kendi ilgilendi\u011fi state k\u0131sm\u0131n\u0131 y\u00f6netmesini sa\u011flar. Bu, hem kodu daha mod\u00fcler hale getirir hem de olas\u0131 performans sorunlar\u0131n\u0131 azalt\u0131r, \u00e7\u00fcnk\u00fc bir action yaln\u0131zca belirli bir state par\u00e7as\u0131n\u0131 etkilerken di\u011fer reducer'lar daha az hesaplama yapar.<\/p>\n<\/p><\/div>\n<p>Bu ileri d\u00fczey teknikler, <code>useReducer<\/code>'\u0131 uygulaman\u0131z\u0131n omurgas\u0131 haline getirme potansiyeline sahiptir ve b\u00fcy\u00fck projelerde kar\u015f\u0131la\u015f\u0131lan zorluklar\u0131n \u00fcstesinden gelmenize yard\u0131mc\u0131 olur.<\/p>\n<h2>useReducer ile Test Edilebilirlik ve Bak\u0131m Kolayl\u0131\u011f\u0131 Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirmenin \u00f6nemli bir boyutu, yazd\u0131\u011f\u0131m\u0131z kodun sadece \u00e7al\u0131\u015f\u0131r olmas\u0131 de\u011fil, ayn\u0131 zamanda kolayca test edilebilir ve uzun vadede bak\u0131m\u0131 yap\u0131labilir olmas\u0131d\u0131r. <code>useReducer<\/code>, bu iki konuda <code>useState<\/code>'e k\u0131yasla belirgin avantajlar sunar, \u00f6zellikle uygulaman\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a bu avantajlar daha da \u00f6nem kazan\u0131r.<\/p>\n<h3>Test Edilebilirlik<\/h3>\n<p><code>useReducer<\/code>'\u0131n temelindeki reducer fonksiyonlar\u0131, saf fonksiyonlar olma prensibine dayan\u0131r. Saf fonksiyonlar, belirli input'lar (mevcut state ve action) verildi\u011finde her zaman ayn\u0131 output'u (yeni state) d\u00f6nd\u00fcr\u00fcrler ve d\u0131\u015f d\u00fcnya ile hi\u00e7bir yan etkiye sahip de\u011fillerdir (API \u00e7a\u011fr\u0131lar\u0131, konsol loglar\u0131 vb. gibi). Bu \u00f6zellik, reducer'lar\u0131 test etmeyi inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r. Bir reducer'\u0131 test etmek i\u00e7in, ona belirli bir ba\u015flang\u0131\u00e7 state'i ve bir action nesnesi verir, ard\u0131ndan beklenen yeni state ile d\u00f6nen state'i kar\u015f\u0131la\u015ft\u0131r\u0131rs\u0131n\u0131z. Bu i\u015flem, herhangi bir UI bile\u015fenini render etmeye veya bir taray\u0131c\u0131 ortam\u0131 olu\u015fturmaya gerek kalmadan, tamamen izole bir \u015fekilde yap\u0131labilir.<\/p>\n<pre><code>\n    \/\/ Daha \u00f6nceki todosReducer fonksiyonumuz\n    const todosReducer = (state, action) => {\n      switch (action.type) {\n        case 'ADD_TODO':\n          return {\n            ...state,\n            todos: [\n              ...state.todos,\n              {\n                id: state.nextId,\n                text: action.payload.text,\n                completed: false,\n              },\n            ],\n            nextId: state.nextId + 1,\n          };\n        case 'TOGGLE_TODO':\n          return {\n            ...state,\n            todos: state.todos.map((todo) =>\n              todo.id === action.payload.id\n                ? { ...todo, completed: !todo.completed }\n                : todo\n            ),\n          };\n        case 'REMOVE_TODO':\n          return {\n            ...state,\n            todos: state.todos.filter((todo) => todo.id !== action.payload.id),\n          };\n        default:\n          return state;\n      }\n    };\n\n    \/\/ Reducer i\u00e7in \u00f6rnek bir test senaryosu (\u00f6rne\u011fin Jest ile)\n    \/\/ describe('todosReducer', () => {\n    \/\/   test('should add a todo', () => {\n    \/\/     const initialState = { todos: [], nextId: 1 };\n    \/\/     const action = { type: 'ADD_TODO', payload: { text: 'Test Todo' } };\n    \/\/     const newState = todosReducer(initialState, action);\n    \/\/     expect(newState.todos.length).toBe(1);\n    \/\/     expect(newState.todos[0].text).toBe('Test Todo');\n    \/\/     expect(newState.nextId).toBe(2);\n    \/\/   });\n\n    \/\/   test('should toggle a todo', () => {\n    \/\/     const initialState = { todos: [{ id: 1, text: 'Test Todo', completed: false }], nextId: 2 };\n    \/\/     const action = { type: 'TOGGLE_TODO', payload: { id: 1 } };\n    \/\/     const newState = todosReducer(initialState, action);\n    \/\/     expect(newState.todos[0].completed).toBe(true);\n    \/\/   });\n\n    \/\/   test('should remove a todo', () => {\n    \/\/     const initialState = { todos: [{ id: 1, text: 'Test Todo', completed: false }], nextId: 2 };\n    \/\/     const action = { type: 'REMOVE_TODO', payload: { id: 1 } };\n    \/\/     const newState = todosReducer(initialState, action);\n    \/\/     expect(newState.todos.length).toBe(0);\n    \/\/   });\n    \/\/ });\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu testler, reducer'\u0131n beklenen davran\u0131\u015flar\u0131 sergileyip sergilemedi\u011fini h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde kontrol etmemizi sa\u011flar. <code>useState<\/code> ile kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, <code>useState<\/code>'in g\u00fcncelleyici fonksiyonlar\u0131 do\u011frudan bir bile\u015fenin i\u00e7inde yer ald\u0131\u011f\u0131 i\u00e7in, bunlar\u0131 izole bir \u015fekilde test etmek daha zordur ve genellikle UI render etmeyi gerektirir.<\/p>\n<h3>Bak\u0131m Kolayl\u0131\u011f\u0131<\/h3>\n<p>Uygulamalar b\u00fcy\u00fcd\u00fck\u00e7e, state y\u00f6netim mant\u0131\u011f\u0131n\u0131n da karma\u015f\u0131kl\u0131\u011f\u0131 artar. <code>useReducer<\/code>, bu karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in harika bir yap\u0131 sa\u011flar:<\/p>\n<ol>\n<li>\n      <strong>Merkezi State Mant\u0131\u011f\u0131:<\/strong> T\u00fcm state de\u011fi\u015fim mant\u0131\u011f\u0131 tek bir yerde (reducer fonksiyonunda) bulunur. Bu, bir bug'\u0131 izlemek veya yeni bir \u00f6zellik eklemek istedi\u011finizde, state'in nas\u0131l de\u011fi\u015fti\u011fini anlamak i\u00e7in farkl\u0131 dosyalara veya bile\u015fenlere bakmak yerine do\u011frudan reducer'a odaklanabilece\u011finiz anlam\u0131na gelir.\n    <\/li>\n<li>\n      <strong>Action'lar ile A\u00e7\u0131k \u0130leti\u015fim:<\/strong> Action nesneleri, uygulaman\u0131zda neyin ger\u00e7ekle\u015fti\u011fini a\u00e7\u0131k\u00e7a belirtir. Bir action'\u0131n <code>type<\/code> \u00f6zelli\u011fi, state'i neyin de\u011fi\u015ftirdi\u011fini hemen anlaman\u0131z\u0131 sa\u011flar. Bu a\u00e7\u0131k ileti\u015fim, hem yeni geli\u015ftiricilerin projeye adaptasyonunu kolayla\u015ft\u0131r\u0131r hem de mevcut ekibin farkl\u0131 bile\u015fenler aras\u0131ndaki etkile\u015fimleri daha iyi anlamas\u0131na yard\u0131mc\u0131 olur.\n    <\/li>\n<li>\n      <strong>Mod\u00fclerlik ve Yeniden Kullan\u0131labilirlik:<\/strong> Reducer fonksiyonlar\u0131n\u0131 ve ilgili action t\u00fcrlerini ayr\u0131 dosyalarda tan\u0131mlayarak, state mant\u0131\u011f\u0131n\u0131z\u0131 mod\u00fcler hale getirebilirsiniz. Bu reducer'lar, farkl\u0131 bile\u015fenler veya hatta farkl\u0131 uygulamalar aras\u0131nda kolayca yeniden kullan\u0131labilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131 kimlik do\u011frulama reducer'\u0131, uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmlerinde veya di\u011fer projelerde de i\u015fe yarayabilir.\n    <\/li>\n<li>\n      <strong>Geli\u015ftirici Ara\u00e7lar\u0131 Deste\u011fi:<\/strong> Redux DevTools gibi ara\u00e7lar, <code>useReducer<\/code> ile birlikte kullan\u0131ld\u0131\u011f\u0131nda (k\u00fc\u00e7\u00fck bir adaptasyonla), dispatch edilen her action'\u0131 ve her state de\u011fi\u015fimini g\u00f6rselle\u015ftirmeyi sa\u011flar. Bu, hata ay\u0131klama s\u00fcrecini inan\u0131lmaz derecede h\u0131zland\u0131r\u0131r ve state'in zaman i\u00e7indeki ak\u0131\u015f\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r.\n    <\/li>\n<\/ol>\n<p>Sonu\u00e7 olarak, <code>useReducer<\/code> sadece karma\u015f\u0131k state'leri y\u00f6netmekle kalmaz, ayn\u0131 zamanda uygulaman\u0131z\u0131n genel kalitesini ve geli\u015ftirici deneyimini de iyile\u015ftirir. Kodunuz daha \u00f6ng\u00f6r\u00fclebilir, daha kolay test edilebilir ve dolay\u0131s\u0131yla uzun vadede bak\u0131m\u0131 \u00e7ok daha kolay hale gelir. Bu, \u00f6zellikle s\u00fcrekli geli\u015fen ve b\u00fcy\u00fcyen b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in kritik bir avantajd\u0131r.<\/p>\n<h2>Mobil Uyumlu Tasar\u0131mlarda State Y\u00f6netimi ve useReducer<\/h2>\n<p>Modern web uygulamalar\u0131, sadece masa\u00fcst\u00fc bilgisayarlarda de\u011fil, ayn\u0131 zamanda tabletler ve ak\u0131ll\u0131 telefonlar gibi \u00e7e\u015fitli mobil cihazlarda da sorunsuz bir deneyim sunmal\u0131d\u0131r. Bu durum, mobil uyumlu (responsive) tasar\u0131mlar\u0131n \u00f6nemini art\u0131rmaktad\u0131r. Peki, <code>useReducer<\/code> gibi bir state y\u00f6netim arac\u0131, mobil uyumlu tasar\u0131mlarla nas\u0131l bir ili\u015fki i\u00e7indedir ve bu iki konuyu bir araya getirerek daha g\u00fc\u00e7l\u00fc uygulamalar nas\u0131l in\u015fa edebiliriz?<\/p>\n<p><code>useReducer<\/code> do\u011frudan CSS veya HTML layout ile ilgili bir ara\u00e7 olmasa da, uygulaman\u0131n UI durumunu (\u00f6rne\u011fin, bir men\u00fcn\u00fcn a\u00e7\u0131k\/kapal\u0131 olmas\u0131, bir \u00f6\u011fenin g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc, farkl\u0131 ekran boyutlar\u0131na g\u00f6re de\u011fi\u015fen veri yap\u0131lar\u0131) y\u00f6neterek responsive tasar\u0131m\u0131n dinamiklerini destekleyebilir. \u00d6rne\u011fin, bir mobil g\u00f6r\u00fcn\u00fcmde bir navigasyon men\u00fcs\u00fcn\u00fcn kapal\u0131 ba\u015flamas\u0131, ancak bir butona t\u0131klan\u0131nca a\u00e7\u0131lmas\u0131 gibi durumlar, <code>useReducer<\/code> ile y\u00f6netilebilecek tipik senaryolard\u0131r. Kullan\u0131c\u0131n\u0131n hangi cihaz t\u00fcr\u00fcnde oldu\u011funa veya ekran boyutuna g\u00f6re farkl\u0131 bile\u015fenlerin veya veri setlerinin g\u00f6sterilmesi gerekti\u011finde, bu bilgiyi state'e kaydedip <code>useReducer<\/code> ile y\u00f6netmek, UI'\u0131n tutarl\u0131 ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde davranmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>A\u015fa\u011f\u0131da, responsive bir navigasyon men\u00fcs\u00fcn\u00fcn state y\u00f6netimini <code>useReducer<\/code> ile nas\u0131l yapabilece\u011fimize dair basit bir \u00f6rnek verilmi\u015ftir. Bu \u00f6rnekte, men\u00fcn\u00fcn mobil g\u00f6r\u00fcn\u00fcmde nas\u0131l a\u00e7\u0131l\u0131p kapanaca\u011f\u0131n\u0131 state ile y\u00f6netiyoruz. Ard\u0131ndan, mobil uyumlu HTML\/CSS i\u00e7in genel bir <code>media query<\/code> \u00f6rne\u011fi sunaca\u011f\u0131z, bu <code>useReducer<\/code> ile y\u00f6netti\u011fimiz UI durumunu g\u00f6rsel olarak nas\u0131l etkileyebilece\u011fimizi g\u00f6steriyor.<\/p>\n<pre><code>\n    \/\/ Men\u00fc State Y\u00f6netimi i\u00e7in Reducer\n    const menuReducer = (state, action) => {\n      switch (action.type) {\n        case 'TOGGLE_MENU':\n          return { ...state, isOpen: !state.isOpen };\n        case 'CLOSE_MENU':\n          return { ...state, isOpen: false };\n        case 'OPEN_MENU':\n          return { ...state, isOpen: true };\n        default:\n          return state;\n      }\n    };\n\n    const ResponsiveNav = () => {\n      const [state, dispatch] = React.useReducer(menuReducer, { isOpen: false });\n\n      \/\/ Ekran boyutu de\u011fi\u015fimini dinlemek i\u00e7in bir hook kullan\u0131labilir (\u00f6rne\u011fin, useWindowSize)\n      \/\/ Bu \u00f6rnekte, basitlik ad\u0131na sadece bir toggle butonu ile men\u00fcy\u00fc kontrol ediyoruz.\n      \/\/ Ger\u00e7ek bir responsive uygulamada, CSS media query'lerine ek olarak\n      \/\/ JavaScript ile viewport geni\u015fli\u011fini takip edip, belirli bir e\u015fi\u011fin alt\u0131na d\u00fc\u015f\u00fcld\u00fc\u011f\u00fcnde\n      \/\/ dispatch({ type: 'CLOSE_MENU' }) gibi bir action g\u00f6nderebiliriz.\n\n      return (\n        <nav>\n          <button\n            onClick={() => dispatch({ type: 'TOGGLE_MENU' })}\n            className=\"menu-toggle-button\" \/\/ CSS ile sadece mobil g\u00f6r\u00fcn\u00fcmde g\u00f6sterilebilir\n          >\n            \u2630\n          <\/button>\n          <ul className={<code>nav-links ${state.isOpen ? &#039;open&#039; : &#039;&#039;}<\/code>}>\n            <li><a href=\"#\">Anasayfa<\/a><\/li>\n            <li><a href=\"#\">Hizmetler<\/a><\/li>\n            <li><a href=\"#\">Hakk\u0131m\u0131zda<\/a><\/li>\n            <li><a href=\"#\">\u0130leti\u015fim<\/a><\/li>\n          <\/ul>\n        <\/nav>\n      );\n    };\n\n    \/\/ Bu HTML dosyas\u0131n\u0131n <head> k\u0131sm\u0131na eklenebilecek stil \u00f6rnekleri:\n    \/\/ <style>\n    \/\/   .nav-links {\n    \/\/     display: flex;\n    \/\/     list-style: none;\n    \/\/     padding: 0;\n    \/\/     margin: 0;\n    \/\/   }\n    \/\/   .nav-links li {\n    \/\/     margin: 0 15px;\n    \/\/   }\n    \/\/   .menu-toggle-button {\n    \/\/     display: none; \/* Masa\u00fcst\u00fcnde gizle *\/\n    \/\/   }\n\n    \/\/   \/* Mobil Uyumlu HTML i\u00e7in Media Query \u00d6rne\u011fi *\/\n    \/\/   @media (max-width: 768px) {\n    \/\/     .nav-links {\n    \/\/       flex-direction: column;\n    \/\/       position: absolute;\n    \/\/       top: 60px; \/* Navigasyon bar\u0131 y\u00fcksekli\u011fi *\/\n    \/\/       left: 0;\n    \/\/       width: 100%;\n    \/\/       background-color: #f0f0f0;\n    \/\/       display: none; \/* Mobil g\u00f6r\u00fcn\u00fcmde ba\u015flang\u0131\u00e7ta gizle *\/\n    \/\/     }\n    \/\/     .nav-links.open {\n    \/\/       display: flex; \/* A\u00e7\u0131k oldu\u011funda g\u00f6ster *\/\n    \/\/     }\n    \/\/     .menu-toggle-button {\n    \/\/       display: block; \/* Mobil g\u00f6r\u00fcn\u00fcmde g\u00f6ster *\/\n    \/\/       background: none;\n    \/\/       border: none;\n    \/\/       font-size: 24px;\n    \/\/       cursor: pointer;\n    \/\/     }\n    \/\/   }\n    \/\/ <\/style>\n\n    ReactDOM.render(<ResponsiveNav \/>, document.getElementById('root'));\n  <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>ResponsiveNav<\/code> bile\u015feni, men\u00fcn\u00fcn a\u00e7\u0131k\/kapal\u0131 durumunu <code>useReducer<\/code> ile y\u00f6netir. CSS <code>media query<\/code>'leri, belirli bir ekran geni\u015fli\u011finin alt\u0131nda men\u00fc d\u00fc\u011fmesini g\u00f6sterirken, ba\u011flant\u0131 listesini gizler ve dikey olarak d\u00fczenler. Men\u00fc d\u00fc\u011fmesine t\u0131kland\u0131\u011f\u0131nda, <code>dispatch({ type: 'TOGGLE_MENU' })<\/code> action'\u0131 ile state g\u00fcncellenir ve <code>.nav-links.open<\/code> s\u0131n\u0131f\u0131 eklenerek men\u00fc g\u00f6r\u00fcn\u00fcr hale gelir. Bu yakla\u015f\u0131m, state y\u00f6netimini UI'\u0131n g\u00f6rsel de\u011fi\u015fimlerinden ay\u0131rarak, daha temiz ve s\u00fcrd\u00fcr\u00fclebilir bir kod taban\u0131 olu\u015fturmaya yard\u0131mc\u0131 olur. Ayr\u0131ca, bu state bilgisi, di\u011fer bile\u015fenlerin (\u00f6rne\u011fin, men\u00fc a\u00e7\u0131ld\u0131\u011f\u0131nda ana i\u00e7eri\u011fin kayd\u0131r\u0131lmas\u0131n\u0131 engelleyen bir overlay) davran\u0131\u015f\u0131n\u0131 da etkileyebilir.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>React'\u0131n <code>useReducer<\/code> hook'u, sadece quiz sorular\u0131nda kar\u015f\u0131m\u0131za \u00e7\u0131kan basit bir kavram olman\u0131n \u00f6tesinde, \u00f6zellikle orta ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda karma\u015f\u0131k state y\u00f6netimi sorunlar\u0131na zarif ve g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. <code>useState<\/code>'in yetersiz kald\u0131\u011f\u0131 durumlarda, merkezi state mant\u0131\u011f\u0131, test edilebilirlik ve bak\u0131m kolayl\u0131\u011f\u0131 gibi avantajlar\u0131yla \u00f6ne \u00e7\u0131kar. Bu makalede, <code>useReducer<\/code>'\u0131n temellerinden ba\u015flayarak, g\u00f6rev y\u00f6netim uygulamas\u0131 gibi ger\u00e7ek d\u00fcnya senaryolar\u0131na, asenkron i\u015flemlerin y\u00f6netimine, performans optimizasyonlar\u0131na ve hatta mobil uyumlu tasar\u0131mlarla entegrasyonuna kadar geni\u015f bir yelpazeyi ele ald\u0131k. Unutmay\u0131n ki, <code>useReducer<\/code>'\u0131 <code>useContext<\/code> ile birle\u015ftirmek, Redux benzeri bir global state y\u00f6netim sistemi kurman\u0131za olanak tan\u0131yarak uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini art\u0131r\u0131r. Kodunuzu daha d\u00fczenli, \u00f6ng\u00f6r\u00fclebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek i\u00e7in <code>useReducer<\/code>'\u0131 ara\u00e7 kutunuza eklemek, sizi kesinlikle daha yetkin bir React geli\u015ftiricisi yapacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. useReducer ne zaman useState yerine tercih edilmelidir?<\/strong><\/p>\n<p><code>useReducer<\/code>, state mant\u0131\u011f\u0131 karma\u015f\u0131k oldu\u011funda, birden fazla alt state'in birbiriyle ili\u015fkili oldu\u011fu durumlarda, state g\u00fcncellemelerinin \u00f6nceki state'e ba\u011fl\u0131 oldu\u011fu senaryolarda veya global state y\u00f6netimi i\u00e7in <code>useContext<\/code> ile birle\u015ftirilmesi gerekti\u011finde <code>useState<\/code> yerine tercih edilmelidir. \u00d6zellikle, state g\u00fcncellemeleri belirli bir s\u0131ray\u0131 takip ediyorsa veya birden fazla farkl\u0131 action t\u00fcr\u00fc ayn\u0131 state'i etkiliyorsa <code>useReducer<\/code> daha temiz bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p><strong>2. Redux ile useReducer aras\u0131ndaki temel farklar nelerdir?<\/strong><\/p>\n<p>Hem Redux hem de <code>useReducer<\/code>, Reducer prensibine dayan\u0131r. Ancak Redux, global state y\u00f6netimi i\u00e7in daha kapsaml\u0131 bir ekosistem (middleware'ler, geli\u015ftirici ara\u00e7lar\u0131, k\u00fct\u00fcphane entegrasyonlar\u0131) sunarken, <code>useReducer<\/code> React'\u0131n kendi i\u00e7inde gelen basit bir hook'tur. <code>useReducer<\/code>, <code>useContext<\/code> ile birle\u015ftirildi\u011finde Redux'a benzer bir yap\u0131 olu\u015fturabilir ancak Redux'un sundu\u011fu baz\u0131 geli\u015fmi\u015f \u00f6zelliklerden (\u00f6rn. kolay time-travel debugging) yoksundur. Genellikle, Redux'un getirdi\u011fi ek y\u00fckten ka\u00e7\u0131nmak isteniyorsa veya uygulaman\u0131n state y\u00f6netimi ihtiya\u00e7lar\u0131 Redux kadar karma\u015f\u0131k de\u011filse <code>useReducer<\/code> tercih edilebilir.<\/p>\n<p><strong>3. useReducer ile asenkron i\u015flemleri (API \u00e7a\u011fr\u0131lar\u0131 gibi) nas\u0131l y\u00f6netebilirim?<\/strong><\/p>\n<p>Reducer'lar saf fonksiyonlar olmal\u0131 ve yan etkileri (side effects) i\u00e7ermemelidir. Bu nedenle, asenkron i\u015flemleri do\u011frudan reducer i\u00e7inde yapamay\u0131z. Bunun yerine, <code>dispatch<\/code> fonksiyonunu alan \"thunk\" benzeri ara katman fonksiyonlar\u0131 olu\u015fturarak asenkron i\u015flemleri y\u00f6netiriz. Bu fonksiyonlar, asenkron i\u015flemin farkl\u0131 a\u015famalar\u0131nda (ba\u015flama, ba\u015far\u0131l\u0131 olma, hata) ilgili action'lar\u0131 <code>dispatch<\/code> ederek reducer'\u0131n state'i g\u00fcncellemesini sa\u011flar.<\/p>\n<p><strong>4. useReducer performans sorunlar\u0131na yol a\u00e7ar m\u0131? Nas\u0131l optimize edebilirim?<\/strong><\/p>\n<p>Do\u011fru kullan\u0131lmad\u0131\u011f\u0131nda her hook gibi <code>useReducer<\/code> da performans\u0131 etkileyebilir. \u00d6zellikle her state de\u011fi\u015fiminde t\u00fcm component a\u011fac\u0131n\u0131n gereksiz yere render edilmesinden ka\u00e7\u0131nmak \u00f6nemlidir. Optimizasyon i\u00e7in \u015fu y\u00f6ntemleri kullanabilirsiniz: reducer fonksiyonunu bile\u015fen d\u0131\u015f\u0131nda tan\u0131mlamak, ba\u015flang\u0131\u00e7 state'ini lazy y\u00fcklemek (\u00fc\u00e7\u00fcnc\u00fc arg\u00fcman olarak <code>init<\/code> fonksiyonu ile), alt bile\u015fenleri <code>React.memo<\/code> ile memoize etmek ve <code>useCallback<\/code> veya <code>useMemo<\/code> kullanarak pahal\u0131 hesaplamalar\u0131 ve fonksiyon referanslar\u0131n\u0131 \u00f6nbelle\u011fe almak.<\/p>\n<p><strong>5. Birden fazla reducer'\u0131 nas\u0131l birle\u015ftirebilirim?<\/strong><\/p>\n<p>Redux'taki <code>combineReducers<\/code> mant\u0131\u011f\u0131na benzer \u015fekilde, <code>useReducer<\/code> ile de birden fazla reducer'\u0131 birle\u015ftirebilirsiniz. Bunun i\u00e7in, ana bir reducer olu\u015fturup bu reducer i\u00e7inde alt reducer'lar\u0131 \u00e7a\u011f\u0131rarak her birinin kendi ilgili state par\u00e7as\u0131n\u0131 y\u00f6netmesini sa\u011flayabilirsiniz. \u00d6rne\u011fin, <code>todosReducer<\/code> ve <code>authReducer<\/code> gibi farkl\u0131 reducer'lar\u0131n\u0131z varsa, ana reducer, action'\u0131 her ikisine de g\u00f6nderip d\u00f6nd\u00fcr\u00fclen yeni state par\u00e7alar\u0131n\u0131 birle\u015ftirerek ana state'i olu\u015fturabilir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de useState hook&#8217;unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale,&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[128],"tags":[],"class_list":{"0":"post-34380","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 useReducer Derin Dal\u0131\u015f: Quiz&#039;den K\u0131demli Desenlere<\/title>\n<meta name=\"description\" content=\"React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de useState hook&#039;unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale, useReducer&#039;\u0131n temel prensiplerinden ileri d\u00fczey kullan\u0131m kal\u0131plar\u0131na kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak, sizi bir ba\u015flang\u0131\u00e7 seviyesinden k\u0131demli bir React geli\u015ftirici seviyesine ta\u015f\u0131yacak.\" \/>\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-usereducer-derin-dalis-quizden-kidemli-desenlere\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React useReducer Derin Dal\u0131\u015f: Quiz&#039;den K\u0131demli Desenlere\" \/>\n<meta property=\"og:description\" content=\"React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de useState hook&#039;unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale, useReducer&#039;\u0131n temel prensiplerinden ileri d\u00fczey kullan\u0131m kal\u0131plar\u0131na kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak, sizi bir ba\u015flang\u0131\u00e7 seviyesinden k\u0131demli bir React geli\u015ftirici seviyesine ta\u015f\u0131yacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-15T20:31:07+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React useReducer Derin Dal\u0131\u015f: Quiz&#8217;den K\u0131demli Desenlere\",\"datePublished\":\"2025-11-15T20:31:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/\"},\"wordCount\":3440,\"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-usereducer-derin-dalis-quizden-kidemli-desenlere\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/\",\"name\":\"React useReducer Derin Dal\u0131\u015f: Quiz'den K\u0131demli Desenlere\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-15T20:31:07+00:00\",\"description\":\"React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de useState hook'unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale, useReducer'\u0131n temel prensiplerinden ileri d\u00fczey kullan\u0131m kal\u0131plar\u0131na kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak, sizi bir ba\u015flang\u0131\u00e7 seviyesinden k\u0131demli bir React geli\u015ftirici seviyesine ta\u015f\u0131yacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React useReducer Derin Dal\u0131\u015f: Quiz&#8217;den K\u0131demli Desenlere\"}]},{\"@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 useReducer Derin Dal\u0131\u015f: Quiz'den K\u0131demli Desenlere","description":"React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de useState hook'unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale, useReducer'\u0131n temel prensiplerinden ileri d\u00fczey kullan\u0131m kal\u0131plar\u0131na kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak, sizi bir ba\u015flang\u0131\u00e7 seviyesinden k\u0131demli bir React geli\u015ftirici seviyesine ta\u015f\u0131yacak.","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-usereducer-derin-dalis-quizden-kidemli-desenlere\/","og_locale":"tr_TR","og_type":"article","og_title":"React useReducer Derin Dal\u0131\u015f: Quiz'den K\u0131demli Desenlere","og_description":"React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de useState hook'unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale, useReducer'\u0131n temel prensiplerinden ileri d\u00fczey kullan\u0131m kal\u0131plar\u0131na kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak, sizi bir ba\u015flang\u0131\u00e7 seviyesinden k\u0131demli bir React geli\u015ftirici seviyesine ta\u015f\u0131yacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-15T20:31:07+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React useReducer Derin Dal\u0131\u015f: Quiz&#8217;den K\u0131demli Desenlere","datePublished":"2025-11-15T20:31:07+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/"},"wordCount":3440,"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-usereducer-derin-dalis-quizden-kidemli-desenlere\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/","url":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/","name":"React useReducer Derin Dal\u0131\u015f: Quiz'den K\u0131demli Desenlere","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-15T20:31:07+00:00","description":"React uygulamalar\u0131n\u0131zda karma\u015f\u0131k durum y\u00f6netimi mi yapmaya \u00e7al\u0131\u015f\u0131yorsunuz? Belki de useState hook'unun yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015f\u0131yorsunuzdur. Bu makale, useReducer'\u0131n temel prensiplerinden ileri d\u00fczey kullan\u0131m kal\u0131plar\u0131na kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak, sizi bir ba\u015flang\u0131\u00e7 seviyesinden k\u0131demli bir React geli\u015ftirici seviyesine ta\u015f\u0131yacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-usereducer-derin-dalis-quizden-kidemli-desenlere\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React useReducer Derin Dal\u0131\u015f: Quiz&#8217;den K\u0131demli Desenlere"}]},{"@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\/34380","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=34380"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34380\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}