{"id":34494,"date":"2025-11-17T09:31:12","date_gmt":"2025-11-17T06:31:12","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/"},"modified":"2025-11-17T09:31:12","modified_gmt":"2025-11-17T06:31:12","slug":"react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/","title":{"rendered":"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?"},"content":{"rendered":"<p><body><\/p>\n<p>React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ancak, bazen React&#8217;in felsefesi tek ba\u015f\u0131na yeterli gelmeyebilir; \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, karma\u015f\u0131k DOM etkile\u015fimleri veya optimize edilmi\u015f mikro optimizasyonlar gerekti\u011finde. \u0130\u015fte tam da bu noktada, HTML5&#8217;in veri nitelikleri (data attributes) devreye girerek hem React&#8217;in g\u00fcc\u00fcn\u00fc korumam\u0131za hem de spesifik zorluklar\u0131n \u00fcstesinden gelmemize olanak tan\u0131r.<\/p>\n<p>React, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc ve \u00f6ng\u00f6r\u00fclebilir bir yol sunar. Temel felsefesi, uygulaman\u0131n durumunu (state) y\u00f6netmek ve bu duruma g\u00f6re aray\u00fcz\u00fc yeniden render etmek \u00fczerine kuruludur. Bu &#8220;bildirimsel&#8221; (declarative) yakla\u015f\u0131m, geli\u015ftiricilerin DOM manip\u00fclasyonlar\u0131n\u0131n incelikleriyle u\u011fra\u015fmak yerine, aray\u00fcz\u00fcn hangi durumda nas\u0131l g\u00f6r\u00fcnmesi gerekti\u011fini tan\u0131mlamas\u0131na olanak tan\u0131r. Sanal DOM (Virtual DOM) ise, ger\u00e7ek DOM&#8217;a yap\u0131lan gereksiz g\u00fcncellemeleri minimuma indirerek performans\u0131 art\u0131r\u0131r.<\/p>\n<p>Bu felsefe, \u00e7o\u011fu senaryoda harika \u00e7al\u0131\u015f\u0131r ve karma\u015f\u0131k uygulamalar\u0131n y\u00f6netimini kolayla\u015ft\u0131r\u0131r. Ancak, React&#8217;in bu soyutlama katman\u0131, bazen belirli ihtiya\u00e7lar i\u00e7in yetersiz kalabilir. \u00d6zellikle \u015fu durumlarda React&#8217;in felsefesi s\u0131n\u0131rlar\u0131na ula\u015fabilir:<\/p>\n<ul>\n<li><strong>\u00dc\u00e7\u00fcnc\u00fc Taraf K\u00fct\u00fcphanelerle Entegrasyon:<\/strong> React d\u0131\u015f\u0131ndaki k\u00fct\u00fcphanelerin \u00e7o\u011fu, DOM \u00fczerinde do\u011frudan manip\u00fclasyon yaparak \u00e7al\u0131\u015f\u0131r. \u00d6rne\u011fin, bir jQuery tabanl\u0131 slider, g\u00f6rsel grafik k\u00fct\u00fcphanesi veya karma\u015f\u0131k bir takvim arac\u0131 kullanmak istedi\u011finizde, React&#8217;in sanal DOM&#8217;u bu k\u00fct\u00fcphanelerin DOM \u00fczerindeki de\u011fi\u015fikliklerini fark edemez ve \u00e7ak\u0131\u015fmalar ya\u015fanabilir. Bu durumda, React&#8217;in kendi state y\u00f6netimi d\u0131\u015f\u0131ndaki bir mekanizmaya ihtiya\u00e7 duyulur.<\/li>\n<li><strong>Do\u011frudan DOM API&#8217;sine Eri\u015fim Gereksinimi:<\/strong> Bazen, \u00e7ok spesifik ve performans kritik DOM etkile\u015fimlerine ihtiya\u00e7 duyulur. \u00d6rne\u011fin, bir \u00f6\u011fenin boyutunu veya konumunu anl\u0131k olarak almak, \u00e7ok h\u0131zl\u0131 kayd\u0131rma olaylar\u0131na tepki vermek veya belirli bir legacy kod par\u00e7as\u0131n\u0131 entegre etmek i\u00e7in do\u011frudan taray\u0131c\u0131n\u0131n DOM API&#8217;sine eri\u015fmek gerekebilir. React, bu t\u00fcr senaryolar i\u00e7in <code>ref<\/code> mekanizmas\u0131n\u0131 sunsa da, verileri y\u00f6netmek i\u00e7in daha esnek bir yol aranabilir.<\/li>\n<li><strong>Performans Kritik Alanlarda State G\u00fcncellemesinin Maliyeti:<\/strong> Her ne kadar React ak\u0131ll\u0131 bir g\u00fcncelleme mekanizmas\u0131na sahip olsa da, \u00e7ok s\u0131k veya b\u00fcy\u00fck state g\u00fcncellemeleri, \u00f6zellikle d\u00fc\u015f\u00fck performansl\u0131 cihazlarda veya \u00e7ok say\u0131da bile\u015fenin oldu\u011fu durumlarda performans\u0131 etkileyebilir. Bazen, bir bile\u015fenin sadece g\u00f6rsel bir \u00f6zelli\u011fini de\u011fi\u015ftirmek i\u00e7in t\u00fcm React render d\u00f6ng\u00fcs\u00fcn\u00fc tetiklemek yerine, do\u011frudan DOM \u00fczerinden h\u0131zl\u0131 bir de\u011fi\u015fiklik yapmak daha verimli olabilir.<\/li>\n<li><strong>SEO ve Eri\u015filebilirlik Optimizasyonlar\u0131:<\/strong> Temel olarak React, i\u00e7eri\u011fi JavaScript ile olu\u015fturdu\u011fu i\u00e7in ilk y\u00fckleme an\u0131nda arama motorlar\u0131 i\u00e7in bo\u015f bir sayfa sunabilir (SSR\/SSG kullan\u0131lm\u0131yorsa). Ayr\u0131ca, \u00f6zel eri\u015filebilirlik (ARIA) nitelikleri gerektiren bile\u015fenlerde, React&#8217;in varsay\u0131lan prop sistemi bazen k\u0131s\u0131tl\u0131 kalabilir veya do\u011frudan DOM \u00fczerinde daha ince ayarlar yapmak isteyebilirsiniz.<\/li>\n<\/ul>\n<p>Bu gibi durumlarda, React&#8217;in temel felsefesinden \u00f6d\u00fcn vermeden, ancak belirli noktalarda DOM ile daha do\u011frudan bir k\u00f6pr\u00fc kurarak sorunlar\u0131 \u00e7\u00f6zebiliriz. \u0130\u015fte bu k\u00f6pr\u00fclerden biri de HTML5&#8217;in bize sundu\u011fu g\u00fc\u00e7l\u00fc bir \u00f6zellik olan &#8220;veri nitelikleri&#8221;dir.<\/p>\n<div class=\"tip\">Uzman \u0130pucu: React\u2019in bildirimsel yap\u0131s\u0131n\u0131 terk etmeden, veri niteliklerini bir &#8220;\u00e7\u0131k\u0131\u015f kap\u0131s\u0131&#8221; gibi kullanarak d\u0131\u015f sistemlerle ileti\u015fim kurabilir, b\u00f6ylece hem React\u2019in avantajlar\u0131ndan faydalan\u0131r hem de esnekli\u011finizi art\u0131r\u0131rs\u0131n\u0131z.<\/div>\n<h2 id=\"veri-nitelikleri-data-attributes-nedir-ve-ne-ise-yarar\">Veri Nitelikleri (Data Attributes) Nedir ve Ne \u0130\u015fe Yarar?<\/h2>\n<p>HTML5, geli\u015ftiricilere DOM \u00f6\u011feleri \u00fczerinde \u00f6zel, standart d\u0131\u015f\u0131 veri depolama yetene\u011fi kazand\u0131rmak i\u00e7in <code>data-*<\/code> niteliklerini tan\u0131tt\u0131. Bir HTML \u00f6\u011fesine <code>data-<\/code> ile ba\u015flayan herhangi bir nitelik ekleyebilirsiniz, \u00f6rne\u011fin <code>data-id=\"123\"<\/code>, <code>data-status=\"active\"<\/code> veya <code>data-user-name=\"John Doe\"<\/code> gibi. Bu nitelikler, taray\u0131c\u0131 taraf\u0131ndan yorumlanmaz veya varsay\u0131lan bir stil ile gelmez; tamamen geli\u015ftiricinin kendi kullan\u0131m\u0131 i\u00e7indir.<\/p>\n<p>Peki, bu nitelikler tam olarak ne i\u015fe yarar?<\/p>\n<ul>\n<li><strong>\u00d6zel Veri Depolama:<\/strong> Bir DOM \u00f6\u011fesiyle ili\u015fkili, ancak sayfan\u0131n g\u00f6rsel i\u00e7eri\u011fine dahil edilmeyen verileri depolamak i\u00e7in m\u00fckemmel bir yoldur. \u00d6rne\u011fin, bir \u00fcr\u00fcn kart\u0131n\u0131n i\u00e7ine \u00fcr\u00fcn ID&#8217;sini veya kategori bilgisini g\u00f6r\u00fcnmez bir \u015fekilde saklayabilirsiniz.<\/li>\n<li><strong>JavaScript ile Veri Al\u0131\u015fveri\u015fi:<\/strong> JavaScript, <code>dataset<\/code> API&#8217;si arac\u0131l\u0131\u011f\u0131yla bu niteliklere kolayca eri\u015febilir ve bunlar\u0131 de\u011fi\u015ftirebilir. Bir \u00f6\u011fenin <code>dataset<\/code> \u00f6zelli\u011fi, t\u00fcm <code>data-*<\/code> niteliklerini i\u00e7eren bir <code>DOMStringMap<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr. \u00d6rne\u011fin, <code>element.dataset.id<\/code> size <code>data-id<\/code> niteli\u011finin de\u011ferini verir.<\/li>\n<li><strong>CSS ile Etkile\u015fim:<\/strong> CSS se\u00e7icileri, <code>data-*<\/code> niteliklerini kullanarak \u00f6\u011feleri hedefleyebilir ve onlara stil uygulayabilir. Bu, JavaScript&#8217;e gerek kalmadan sadece CSS ile g\u00f6rsel durum de\u011fi\u015fiklikleri yapman\u0131n g\u00fc\u00e7l\u00fc bir yoludur. \u00d6rne\u011fin, <code>[data-status=\"active\"] { background-color: green; }<\/code> gibi bir kural yazabilirsiniz.<\/li>\n<li><strong>Mikro-templating ve UI Durum Y\u00f6netimi:<\/strong> Dinamik olarak de\u011fi\u015fen aray\u00fcz durumlar\u0131n\u0131 (\u00f6rne\u011fin, bir sekmenin a\u00e7\u0131k olup olmad\u0131\u011f\u0131n\u0131, bir \u00f6\u011fenin se\u00e7ili olup olmad\u0131\u011f\u0131n\u0131) y\u00f6netmek i\u00e7in kullan\u0131labilir. React&#8217;in state y\u00f6netimi olmadan, bu durumlar\u0131 DOM \u00fczerinde i\u015faretlemek ve hem JavaScript hem de CSS ile bu i\u015faretlere tepki vermek m\u00fcmk\u00fcnd\u00fcr.<\/li>\n<li><strong>Analitik ve \u0130zleme:<\/strong> Kullan\u0131c\u0131 etkile\u015fimlerini veya belirli \u00f6\u011felerin g\u00f6r\u00fcnt\u00fclenme durumunu izlemek i\u00e7in bu nitelikler kullan\u0131labilir. Bir \u00f6\u011fe t\u0131kland\u0131\u011f\u0131nda, <code>data-*<\/code> niteliklerinden bilgi al\u0131p bir analitik servisine g\u00f6ndermek olduk\u00e7a yayg\u0131n bir kullan\u0131m senaryosudur.<\/li>\n<\/ul>\n<p>Veri niteliklerini kullanarak, React&#8217;in kontrol etmedi\u011fi d\u0131\u015f bir sistemle ileti\u015fim kurabilir veya React&#8217;in state y\u00f6netimi yerine daha do\u011frudan ve hafif bir &#8220;i\u015faretleme&#8221; mekanizmas\u0131 olu\u015fturabiliriz. Bu, \u00f6zellikle karma\u015f\u0131k animasyonlar, do\u011frudan DOM manip\u00fclasyonu gerektiren k\u00fct\u00fcphaneler veya performans\u0131 optimize etmek istedi\u011fimiz durumlar i\u00e7in son derece faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-html\"><!-- data-id ve data-status nitelikleri i\u00e7eren bir HTML \u00f6\u011fesi -->\n<div id=\"product-card\" data-id=\"p12345\" data-status=\"in-stock\" data-category=\"electronics\">\n  <h3>Harika \u00dcr\u00fcn<\/h3>\n  <p>Bu, sat\u0131n alabilece\u011finiz en iyi \u00fcr\u00fcn.<\/p>\n<\/div>\n\n<script>\n  const productCard = document.getElementById('product-card');\n\n  \/\/ data-* niteliklerine JavaScript ile eri\u015fim\n  console.log(productCard.dataset.id);          \/\/ \"p12345\"\n  console.log(productCard.dataset.status);       \/\/ \"in-stock\"\n  console.log(productCard.dataset.category);     \/\/ \"electronics\"\n\n  \/\/ Bir niteli\u011fi g\u00fcncelleme\n  productCard.dataset.status = 'sold-out';\n  console.log(productCard.dataset.status);       \/\/ \"sold-out\"\n\n  \/\/ CSS ile stil vermek (\u00f6rnek)\n  \/*\n  [data-status=\"in-stock\"] {\n    border: 2px solid green;\n  }\n  [data-status=\"sold-out\"] {\n    opacity: 0.5;\n    border: 2px solid red;\n  }\n  *\/\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>data-*<\/code> nitelikleri hem JavaScript hem de CSS ile kolayca etkile\u015fime girebilir. Bu esneklik, React felsefesinin s\u0131n\u0131rl\u0131 kald\u0131\u011f\u0131 yerlerde kurtar\u0131c\u0131 bir rol oynayabilir.<\/p>\n<h2 id=\"react-projelerinde-veri-niteliklerini-akillica-kullanmak-adim-adim-rehber\">React Projelerinde Veri Niteliklerini Ak\u0131ll\u0131ca Kullanmak: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>React, varsay\u0131lan olarak <code>data-*<\/code> niteliklerini destekler ve bunlar\u0131 prop olarak bir bile\u015fene ge\u00e7irdi\u011finizde otomatik olarak render edilen HTML \u00f6\u011fesine ekler. Bu, veri niteliklerini React projelerinize entegre etmeyi olduk\u00e7a kolayla\u015ft\u0131r\u0131r. \u015eimdi, ger\u00e7ek d\u00fcnya senaryolar\u0131 \u00fczerinden bu entegrasyonu ad\u0131m ad\u0131m inceleyelim.<\/p>\n<h3 id=\"senaryo-1-eski-bir-javascript-kutuphanesiyle-entegrasyon\">Senaryo 1: Eski Bir JavaScript K\u00fct\u00fcphanesiyle Entegrasyon<\/h3>\n<p>Bir\u00e7ok proje, modern React altyap\u0131s\u0131na ge\u00e7i\u015f yaparken bile eski, jQuery tabanl\u0131 veya ba\u011f\u0131ms\u0131z bir JavaScript k\u00fct\u00fcphanesini kullanmaya devam etmek zorunda kal\u0131r. Bu k\u00fct\u00fcphaneler genellikle do\u011frudan DOM \u00fczerinde \u00e7al\u0131\u015f\u0131r ve elementlerin id'leri veya s\u0131n\u0131flar\u0131 \u00fczerinden belirli verileri bekler. React'in state'ini bu eski k\u00fct\u00fcphanelere do\u011frudan ge\u00e7irmek zor olabilir. \u0130\u015fte burada <code>data-*<\/code> nitelikleri imdada yeti\u015fir.<\/p>\n<p><strong>Problem:<\/strong> Bir React uygulamas\u0131na, eski bir <code>MyLegacySlider.js<\/code> ad\u0131nda, DOM'daki bir <code>div<\/code> elementine ba\u011flanarak \u00e7al\u0131\u015fan bir JavaScript slider k\u00fct\u00fcphanesini entegre etmek istiyoruz. Slider, ba\u015flang\u0131\u00e7 resimlerini ve h\u0131z\u0131n\u0131 <code>data-*<\/code> niteliklerinden okuyor.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> React bile\u015fenimizde, slider'\u0131n ihtiya\u00e7 duydu\u011fu verileri <code>data-*<\/code> nitelikleri olarak render edece\u011fimiz <code>div<\/code> elementine ekleyece\u011fiz. Ard\u0131ndan, <code>useEffect<\/code> hook'unu kullanarak bile\u015fen mount edildi\u011finde veya g\u00fcncellendi\u011finde bu eski k\u00fct\u00fcphaneyi initialize edece\u011fiz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ public\/legacy-slider.js (Eski slider k\u00fct\u00fcphanemiz)\n\/\/ Bu dosyan\u0131n React uygulaman\u0131z\u0131n public klas\u00f6r\u00fcne veya bir CDN'den y\u00fcklendi\u011fini varsayal\u0131m.\n(function() {\n  window.initLegacySlider = function(elementId) {\n    const el = document.getElementById(elementId);\n    if (!el) {\n      console.error('Legacy Slider: Element not found!', elementId);\n      return;\n    }\n\n    const images = JSON.parse(el.dataset.images || '[]');\n    const speed = parseInt(el.dataset.speed || '3000', 10);\n\n    let currentIndex = 0;\n    \n    \/\/ Basit bir slider sim\u00fclasyonu\n    setInterval(() => {\n      if (images.length === 0) return;\n      el.style.backgroundImage = <code>url(${images[currentIndex]})<\/code>;\n      el.style.backgroundSize = 'cover';\n      el.style.transition = 'background-image 1s ease-in-out';\n      currentIndex = (currentIndex + 1) % images.length;\n    }, speed);\n\n    console.log(<code>Legacy Slider initialized on ${elementId} with images: ${images.join(&#039;, &#039;)} and speed: ${speed}ms<\/code>);\n  };\n})();\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-jsx\"><\/pre>\n<p><\/code>\/\/ React Componenti: LegacySliderWrapper.jsx<br \/>\nimport React, { useEffect, useRef } from 'react';<\/p>\n<p>const LegacySliderWrapper = ({ sliderId, images, speed }) => {<br \/>\n  const sliderRef = useRef(null);<\/p>\n<p>  useEffect(() => {<br \/>\n    \/\/ Legacy slider k\u00fct\u00fcphanesinin y\u00fcklenmesini bekleyelim<br \/>\n    \/\/ Ger\u00e7ek bir uygulamada, bu y\u00fckleme i\u015flemini daha dikkatli y\u00f6netmek gerekebilir.<br \/>\n    const script = document.createElement('script');<br \/>\n    script.src = '\/legacy-slider.js'; \/\/ public klas\u00f6r\u00fcndeki dosya<br \/>\n    script.onload = () => {<br \/>\n      \/\/ Script y\u00fcklendikten sonra global fonksiyonu \u00e7a\u011f\u0131r<br \/>\n      if (window.initLegacySlider) {<br \/>\n        window.initLegacySlider(sliderId);<br \/>\n      }<br \/>\n    };<br \/>\n    document.body.appendChild(script);<\/p>\n<p>    \/\/ Component unmount edildi\u011finde script'i temizleyebiliriz (iste\u011fe ba\u011fl\u0131)<br \/>\n    return () => {<br \/>\n      document.body.removeChild(script);<br \/>\n    };<br \/>\n  }, [sliderId]); \/\/ sliderId de\u011fi\u015fti\u011finde tekrar \u00e7al\u0131\u015f\u0131r<\/p>\n<p>  \/\/ images ve speed prop'lar\u0131n\u0131 data-* nitelikleri olarak HTML'e ge\u00e7iriyoruz<br \/>\n  return (<\/p>\n<div\n      id={sliderId}\n      ref={sliderRef}\n      data-images={JSON.stringify(images)}\n      data-speed={speed}\n      style={{\n        width: '100%',\n        height: '300px',\n        backgroundColor: '#eee',\n        display: 'flex',\n        justifyContent: 'center',\n        alignItems: 'center',\n        color: '#333',\n        fontSize: '1.5em',\n        border: '1px solid #ddd'\n      }}\n    ><br \/>\n      Legacy Slider Y\u00fckleniyor...\n    <\/div>\n<p>  );<br \/>\n};<\/p>\n<p>export default LegacySliderWrapper;<br \/>\n<\/code><\/p>\n<p>Bu senaryoda, React bile\u015feni <code>LegacySliderWrapper<\/code>, d\u0131\u015far\u0131dan ald\u0131\u011f\u0131 <code>images<\/code> ve <code>speed<\/code> prop'lar\u0131n\u0131 do\u011frudan DOM'daki <code>data-images<\/code> ve <code>data-speed<\/code> niteliklerine aktar\u0131r. Eski JavaScript k\u00fct\u00fcphanesi ise bu <code>div<\/code> elementini se\u00e7erek gerekli verileri bu niteliklerden okur ve kendi i\u015fini yapar. B\u00f6ylece, React'in state y\u00f6netimi ile eski k\u00fct\u00fcphane aras\u0131nda temiz ve basit bir k\u00f6pr\u00fc kurmu\u015f oluruz.<\/p>\n<h3 id=\"senaryo-2-kullanici-arayuzu-durumunu-yonetmek-expandable-card\">Senaryo 2: Kullan\u0131c\u0131 Aray\u00fcz\u00fc Durumunu Y\u00f6netmek (Expandable Card)<\/h3>\n<p>Bazen, bir \u00f6\u011fenin sadece g\u00f6rsel durumunu (\u00f6rne\u011fin, a\u00e7\u0131k\/kapal\u0131, se\u00e7ili\/se\u00e7ili de\u011fil) React state'i \u00fczerinden y\u00f6netmek yerine, do\u011frudan DOM \u00fczerindeki bir <code>data-*<\/code> niteli\u011fi ile y\u00f6netmek daha basit veya daha performansl\u0131 olabilir. Bu, \u00f6zellikle CSS ile durum de\u011fi\u015fikliklerini y\u00f6netirken faydal\u0131d\u0131r.<\/p>\n<p><strong>Problem:<\/strong> Geni\u015fleyebilir bir kart bile\u015feni olu\u015fturmak istiyoruz. Kart\u0131n i\u00e7eri\u011fi, \"Geni\u015flet\" d\u00fc\u011fmesine t\u0131kland\u0131\u011f\u0131nda g\u00f6r\u00fcn\u00fcr hale gelecek. Bu durumu, React state'i yerine <code>data-expanded<\/code> niteli\u011fi ile y\u00f6neterek CSS tabanl\u0131 animasyonlar\u0131 tetiklemek istiyoruz.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Kart bile\u015fenimizin ana <code>div<\/code> elementine bir <code>data-expanded<\/code> niteli\u011fi ekleyece\u011fiz. Bu niteli\u011fin de\u011feri, kart\u0131n geni\u015fletilmi\u015f olup olmad\u0131\u011f\u0131n\u0131 belirleyecek. Bir d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda bu niteli\u011fi do\u011frudan DOM \u00fczerinden g\u00fcncelleyece\u011fiz. CSS ise bu niteli\u011fin de\u011ferine g\u00f6re kart\u0131n g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc de\u011fi\u015ftirecek.<\/p>\n<pre><code class=\"language-jsx\">\/\/ ExpandableCard.jsx\nimport React, { useRef } from 'react';\n\nconst ExpandableCard = ({ title, content }) => {\n  const cardRef = useRef(null);\n\n  const toggleExpand = () => {\n    if (cardRef.current) {\n      const isExpanded = cardRef.current.dataset.expanded === 'true';\n      cardRef.current.dataset.expanded = String(!isExpanded); \/\/ Durumu tersine \u00e7evir\n    }\n  };\n\n  return (\n    <div\n      ref={cardRef}\n      data-expanded=\"false\" \/\/ Ba\u015flang\u0131\u00e7ta kapal\u0131\n      style={{\n        border: '1px solid #ccc',\n        padding: '15px',\n        margin: '10px',\n        maxWidth: '400px',\n        boxShadow: '0 2px 5px rgba(0,0,0,0.1)'\n      }}\n    >\n      <h3>{title}<\/h3>\n      <p>{content.substring(0, 100)}...<\/p>\n      <button onClick={toggleExpand}>Geni\u015flet \/ Daralt<\/button>\n      <div\n        style={{\n          maxHeight: cardRef.current &#038;&#038; cardRef.current.dataset.expanded === 'true' ? '200px' : '0',\n          overflow: 'hidden',\n          transition: 'max-height 0.3s ease-out'\n        }}\n      >\n        <p>{content.substring(100)}<\/p>\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default ExpandableCard;\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-css\"><\/pre>\n<p><\/code>\/\/ app.css veya componentin i\u00e7inde<br \/>\n\/* CSS ile de benzer bir ge\u00e7i\u015f sa\u011flayabiliriz *\/<br \/>\n.expandable-content {<br \/>\n  max-height: 0;<br \/>\n  overflow: hidden;<br \/>\n  transition: max-height 0.3s ease-out;<br \/>\n}<\/p>\n<p>div[data-expanded=\"true\"] .expandable-content {<br \/>\n  max-height: 200px; \/* Ya da content y\u00fcksekli\u011fine g\u00f6re ayarlan\u0131r *\/<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Bu \u00f6rnekte, React'in state'i yerine do\u011frudan <code>cardRef.current.dataset.expanded<\/code> de\u011ferini de\u011fi\u015ftirerek kart\u0131n durumunu y\u00f6netiyoruz. Bu, k\u00fc\u00e7\u00fck ve ba\u011f\u0131ms\u0131z g\u00f6rsel durumlar i\u00e7in hafif bir \u00e7\u00f6z\u00fcm olabilir. Ancak, bu durumun React'in di\u011fer bile\u015fenleri veya uygulama geneli i\u00e7in bir anlam\u0131 varsa, yine de React state'ini kullanmak daha uygun olacakt\u0131r.<\/p>\n<h3 id=\"senaryo-3-gelismis-filtreleme-ve-arama-mekanizmalari\">Senaryo 3: Geli\u015fmi\u015f Filtreleme ve Arama Mekanizmalar\u0131<\/h3>\n<p>B\u00fcy\u00fck ve dinamik listelerde (\u00f6rne\u011fin, bir e-ticaret sitesindeki \u00fcr\u00fcn listesi), kullan\u0131c\u0131lar\u0131n \u00e7e\u015fitli kriterlere g\u00f6re filtreleme yapmas\u0131 gerekir. React state'i ile her bir filtre de\u011fi\u015fikli\u011finde t\u00fcm listeyi yeniden render etmek, performans sorunlar\u0131na yol a\u00e7abilir. <code>data-*<\/code> nitelikleri, bu durumda daha do\u011frudan bir filtreleme mekanizmas\u0131 sunabilir.<\/p>\n<p><strong>Problem:<\/strong> \u00c7ok say\u0131da \u00fcr\u00fcn i\u00e7eren bir liste var. Kullan\u0131c\u0131lar \u00fcr\u00fcnleri kategoriye, fiyata veya pop\u00fclerli\u011fe g\u00f6re filtreleyebiliyor. Her filtre de\u011fi\u015fikli\u011finde React'in listeyi yeniden render etmesinin \u00f6n\u00fcne ge\u00e7mek ve daha h\u0131zl\u0131 bir UI tepkisi sa\u011flamak istiyoruz.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Her bir \u00fcr\u00fcn \u00f6\u011fesine filtreleme kriterlerini <code>data-*<\/code> nitelikleri olarak ekleyece\u011fiz. Filtreleme mant\u0131\u011f\u0131n\u0131 React'in d\u0131\u015f\u0131na, do\u011frudan DOM manip\u00fclasyonu yapan bir JavaScript fonksiyonuna ta\u015f\u0131yaca\u011f\u0131z. Bu fonksiyon, filtre kriterlerine g\u00f6re \u00f6\u011feleri g\u00f6sterip gizleyecek.<\/p>\n<pre><code class=\"language-jsx\">\/\/ ProductList.jsx\nimport React, { useRef, useEffect } from 'react';\n\nconst products = [\n  { id: 1, name: 'Laptop', category: 'electronics', price: 1200, popularity: 5 },\n  { id: 2, name: 'T-Shirt', category: 'clothing', price: 30, popularity: 8 },\n  { id: 3, name: 'Coffee Maker', category: 'home', price: 80, popularity: 6 },\n  { id: 4, name: 'Jeans', category: 'clothing', price: 60, popularity: 7 },\n  { id: 5, name: 'Smartphone', category: 'electronics', price: 900, popularity: 9 },\n];\n\nconst ProductList = () => {\n  const listRef = useRef(null);\n\n  const applyFilters = () => {\n    if (!listRef.current) return;\n\n    const categoryFilter = document.getElementById('category-filter').value;\n    const priceFilter = parseInt(document.getElementById('price-filter').value, 10);\n\n    const productElements = listRef.current.querySelectorAll('.product-item');\n\n    productElements.forEach(item => {\n      const itemCategory = item.dataset.category;\n      const itemPrice = parseInt(item.dataset.price, 10);\n\n      const categoryMatch = categoryFilter === 'all' || itemCategory === categoryFilter;\n      const priceMatch = isNaN(priceFilter) || itemPrice <= priceFilter;\n\n      if (categoryMatch &#038;&#038; priceMatch) {\n        item.style.display = ''; \/\/ G\u00f6ster\n      } else {\n        item.style.display = 'none'; \/\/ Gizle\n      }\n    });\n  };\n\n  useEffect(() => {\n    \/\/ \u0130lk render'da filtreleri uygula\n    applyFilters();\n  }, []);\n\n  return (\n    <div>\n      <div style={{ marginBottom: '20px' }}>\n        <label htmlFor=\"category-filter\">Kategori:<\/label>\n        <select id=\"category-filter\" onChange={applyFilters} style={{ marginRight: '10px' }}>\n          <option value=\"all\">T\u00fcm\u00fc<\/option>\n          <option value=\"electronics\">Elektronik<\/option>\n          <option value=\"clothing\">Giyim<\/option>\n          <option value=\"home\">Ev<\/option>\n        <\/select>\n\n        <label htmlFor=\"price-filter\">Max Fiyat:<\/label>\n        <input type=\"number\" id=\"price-filter\" onChange={applyFilters} placeholder=\"Max Fiyat\" \/>\n      <\/div>\n\n      <div ref={listRef}>\n        {products.map(product => (\n          <div\n            key={product.id}\n            className=\"product-item\"\n            data-id={product.id}\n            data-category={product.category}\n            data-price={product.price}\n            data-popularity={product.popularity}\n            style={{\n              border: '1px solid #eee',\n              padding: '10px',\n              margin: '5px',\n              backgroundColor: '#f9f9f9'\n            }}\n          >\n            <h4>{product.name}<\/h4>\n            <p>Kategori: {product.category}, Fiyat: ${product.price}<\/p>\n          <\/div>\n        ))}\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default ProductList;\n<\/pre>\n<p><\/code><\/p>\n<div class=\"tip\">Uzman \u0130pucu: \u00c7ok b\u00fcy\u00fck listelerde veya s\u0131k de\u011fi\u015fen filtrelerde, React'in state g\u00fcncellemelerini tetiklemek yerine <code>data-*<\/code> tabanl\u0131 DOM manip\u00fclasyonu, g\u00f6zle g\u00f6r\u00fcl\u00fcr bir performans art\u0131\u015f\u0131 sa\u011flayabilir. Ancak, bu y\u00f6ntem React'in kontrol\u00fcn\u00fc azaltt\u0131\u011f\u0131 i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r.<\/div>\n<p>Bu senaryoda, React sadece ilk render i\u015flemini yapar ve her bir \u00fcr\u00fcn i\u00e7in gerekli <code>data-*<\/code> niteliklerini ekler. Filtreleme i\u015flemi ise do\u011frudan DOM'daki elementleri se\u00e7ip <code>display<\/code> stilini de\u011fi\u015ftirerek yap\u0131l\u0131r. Bu, \u00f6zellikle binlerce \u00fcr\u00fcn\u00fcn oldu\u011fu durumlarda React'in state g\u00fcncellemelerinin neden olabilece\u011fi potansiyel performans darbo\u011fazlar\u0131n\u0131 a\u015fmak i\u00e7in g\u00fc\u00e7l\u00fc bir yakla\u015f\u0131md\u0131r. Ancak, bu yakla\u015f\u0131m React'in felsefesinden biraz uzakla\u015f\u0131r ve daha dikkatli y\u00f6netim gerektirir.<\/p>\n<h2 id=\"performans-seo-ve-erisebilirlik-acisindan-veri-nitelikleri\">Performans, SEO ve Eri\u015filebilirlik A\u00e7\u0131s\u0131ndan Veri Nitelikleri<\/h2>\n<p>Veri niteliklerini kullanmak, belirli durumlarda faydal\u0131 olsa da, bunun performans, SEO ve eri\u015filebilirlik (Accessibility) \u00fczerindeki potansiyel etkilerini anlamak \u00f6nemlidir.<\/p>\n<h3 id=\"performans\">Performans<\/h3>\n<p>Veri niteliklerini kullanarak do\u011frudan DOM manip\u00fclasyonu yapmak, React'in sanal DOM mekanizmas\u0131n\u0131 atlayabilir. Bu, baz\u0131 senaryolarda performans\u0131 art\u0131rabilir:<\/p>\n<ul>\n<li><strong>React State G\u00fcncellemelerinden Ka\u00e7\u0131nma:<\/strong> E\u011fer bir UI de\u011fi\u015fikli\u011fi sadece g\u00f6rsel bir etkiye sahipse ve uygulaman\u0131n global state'ini etkilemiyorsa, <code>data-*<\/code> niteliklerini do\u011frudan de\u011fi\u015ftirmek, React'in render d\u00f6ng\u00fcs\u00fcn\u00fc tetiklemekten daha h\u0131zl\u0131 olabilir. \u00d6zellikle s\u0131k ger\u00e7ekle\u015fen mikro-etkile\u015fimler (\u00f6rne\u011fin, bir s\u00fcr\u00fckle-b\u0131rak i\u015flemi s\u0131ras\u0131nda anl\u0131k pozisyon g\u00fcncellemeleri) i\u00e7in bu \u00f6nemlidir.<\/li>\n<li><strong>Do\u011frudan DOM Eri\u015fiminin Maliyeti:<\/strong> Her ne kadar do\u011frudan DOM manip\u00fclasyonu bazen daha h\u0131zl\u0131 olsa da, a\u015f\u0131r\u0131 veya verimsiz kullan\u0131m\u0131n\u0131n maliyeti de vard\u0131r. Taray\u0131c\u0131, DOM \u00fczerinde yap\u0131lan her de\u011fi\u015fikli\u011fi yeniden d\u00fczenlemek (reflow) ve yeniden boyamak (repaint) zorunda kalabilir. React'in sanal DOM'u, bu de\u011fi\u015fiklikleri optimize ederek toplu hale getirir. Bu nedenle, <code>data-*<\/code> kullan\u0131m\u0131n\u0131n ger\u00e7ekten performans iyile\u015ftirmesi sa\u011flay\u0131p sa\u011flamad\u0131\u011f\u0131na dair dikkatli \u00f6l\u00e7\u00fcm yapmak \u00f6nemlidir.<\/li>\n<\/ul>\n<p>Genel kural olarak, e\u011fer bir durum de\u011fi\u015fikli\u011fi React bile\u015feninin yap\u0131s\u0131n\u0131 veya di\u011fer bile\u015fenlerle olan ili\u015fkisini etkiliyorsa React state'ini kullan\u0131n. E\u011fer sadece tek bir DOM \u00f6\u011fesinin lokal, g\u00f6rsel bir \u00f6zelli\u011fini de\u011fi\u015ftiriyorsan\u0131z ve bu durumun uygulama geneli i\u00e7in bir anlam\u0131 yoksa, <code>data-*<\/code> bir se\u00e7enek olabilir.<\/p>\n<h3 id=\"seo\">SEO<\/h3>\n<p>Arama motoru optimizasyonu (SEO) a\u00e7\u0131s\u0131ndan <code>data-*<\/code> niteliklerinin do\u011frudan bir etkisi yoktur. Arama motorlar\u0131 genellikle bu niteliklerin i\u00e7eri\u011fini indexlemez veya s\u0131ralama fakt\u00f6r\u00fc olarak kullanmaz. Ancak, dolayl\u0131 etkileri olabilir:<\/p>\n<ul>\n<li><strong>G\u00f6r\u00fcn\u00fcr \u0130\u00e7erik \u0130\u00e7in Kullanmaktan Ka\u00e7\u0131nma:<\/strong> Asla bir web sayfas\u0131n\u0131n ana i\u00e7eri\u011fini veya arama motorlar\u0131 i\u00e7in \u00f6nemli olan metinleri <code>data-*<\/code> niteliklerinin i\u00e7ine koymay\u0131n. Bu i\u00e7eriklerin do\u011frudan HTML'de g\u00f6r\u00fcn\u00fcr olmas\u0131 gerekir.<\/li>\n<li><strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> <code>data-*<\/code> nitelikleri sayesinde geli\u015ftirilen h\u0131zl\u0131 ve dinamik aray\u00fczler, kullan\u0131c\u0131 deneyimini iyile\u015ftirebilir. \u0130yi bir kullan\u0131c\u0131 deneyimi, sayfa i\u00e7i kalma s\u00fcresini art\u0131rabilir ve hemen \u00e7\u0131kma oran\u0131n\u0131 d\u00fc\u015f\u00fcrebilir, bu da arama motorlar\u0131 i\u00e7in olumlu bir sinyal olabilir.<\/li>\n<\/ul>\n<h3 id=\"erisebilirlik-accessibility\">Eri\u015filebilirlik (Accessibility)<\/h3>\n<p>Eri\u015filebilirlik (A11y), veri niteliklerini kullan\u0131rken \u00f6zellikle dikkat etmeniz gereken bir aland\u0131r. Taray\u0131c\u0131lar ve yard\u0131mc\u0131 teknolojiler (ekran okuyucular gibi), <code>data-*<\/code> niteliklerini do\u011frudan kullan\u0131c\u0131ya a\u00e7\u0131klamaz.<\/p>\n<ul>\n<li><strong><code>data-*<\/code> yerine <code>aria-*<\/code> Kullan\u0131m\u0131:<\/strong> E\u011fer bir HTML \u00f6\u011fesinin anlamsal veya eri\u015filebilirlik durumunu (\u00f6rne\u011fin, bir d\u00fc\u011fmenin 'bas\u0131l\u0131' olup olmad\u0131\u011f\u0131n\u0131, bir sekmenin 'se\u00e7ili' olup olmad\u0131\u011f\u0131n\u0131) belirtmek istiyorsan\u0131z, <code>data-*<\/code> nitelikleri yerine WAI-ARIA (Web Accessibility Initiative - Accessible Rich Internet Applications) standard\u0131n\u0131n <code>aria-*<\/code> niteliklerini kullanmal\u0131s\u0131n\u0131z. \u00d6rne\u011fin, <code>data-expanded=\"true\"<\/code> yerine <code>aria-expanded=\"true\"<\/code> kullanmak \u00e7ok daha do\u011frudur. <code>aria-*<\/code> nitelikleri, yard\u0131mc\u0131 teknolojiler taraf\u0131ndan anla\u015f\u0131l\u0131r ve yorumlan\u0131r.<\/li>\n<li><strong>Birlikte Kullan\u0131m:<\/strong> Baz\u0131 durumlarda her iki nitelik setini birlikte kullanmak m\u00fcmk\u00fcn olabilir. \u00d6rne\u011fin, bir \u00f6\u011fenin g\u00f6rsel durumunu <code>data-*<\/code> ile CSS \u00fczerinden y\u00f6netirken, ayn\u0131 zamanda eri\u015filebilirlik durumunu <code>aria-*<\/code> ile yard\u0131mc\u0131 teknolojilere bildirebilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-html\"><!-- Mobil uyumlu HTML ve media query \u00f6rne\u011fi -->\n<style>\n  \/* Varsay\u0131lan masa\u00fcst\u00fc stili *\/\n  .product-card {\n    display: flex;\n    flex-direction: row;\n    padding: 20px;\n    border: 1px solid #ddd;\n    margin-bottom: 15px;\n  }\n\n  \/* data-view-mode ile g\u00f6r\u00fcn\u00fcm modunu de\u011fi\u015ftirme *\/\n  .product-card[data-view-mode=\"compact\"] {\n    padding: 10px;\n  }\n\n  \/* Mobil cihazlar i\u00e7in media query *\/\n  @media (max-width: 768px) {\n    .product-card {\n      flex-direction: column; \/* Mobil'de dikey s\u0131ralama *\/\n    }\n    .product-card[data-view-mode=\"compact\"] {\n      \/* Mobil'e \u00f6zel compact g\u00f6r\u00fcn\u00fcm *\/\n      font-size: 0.9em;\n      background-color: #f0f0f0;\n    }\n  }\n<\/style>\n\n<!-- React render'\u0131ndan gelen bir \u00f6rnek div -->\n<div class=\"product-card\" data-id=\"p101\" data-view-mode=\"default\">\n  <!-- \u00dcr\u00fcn i\u00e7eri\u011fi -->\n<\/div>\n\n<!-- JavaScript ile dinamik olarak data-view-mode de\u011fi\u015ftirilebilir -->\n<script>\n  \/\/ \u00d6rne\u011fin, bir buton ile g\u00f6r\u00fcn\u00fcm modunu de\u011fi\u015ftirme\n  const toggleViewMode = () => {\n    const card = document.querySelector('.product-card');\n    if (card) {\n      const currentMode = card.dataset.viewMode;\n      card.dataset.viewMode = currentMode === 'default' ? 'compact' : 'default';\n    }\n  };\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki mobil uyumluluk \u00f6rne\u011finde, <code>data-view-mode<\/code> niteli\u011fi, CSS ile birlikte \u00e7al\u0131\u015farak hem masa\u00fcst\u00fc hem de mobil cihazlarda kart\u0131n farkl\u0131 g\u00f6rsel modlar\u0131n\u0131 y\u00f6netmemize olanak tan\u0131r. Media query'ler, mobil cihazlarda ayn\u0131 <code>data-view-mode=\"compact\"<\/code> niteli\u011fine sahip kart i\u00e7in farkl\u0131 stiller uygulayarak responsive bir tasar\u0131m sa\u011flar. Bu, veri niteliklerinin sadece JavaScript ile de\u011fil, CSS ile de ne kadar entegre \u00e7al\u0131\u015fabildi\u011finin g\u00fczel bir g\u00f6stergesidir.<\/p>\n<p>Sonu\u00e7 olarak, veri nitelikleri g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r ancak performans, SEO ve eri\u015filebilirlik \u00fczerindeki etkileri dikkatlice de\u011ferlendirilmelidir. Do\u011fru senaryoda kullan\u0131ld\u0131\u011f\u0131nda b\u00fcy\u00fck faydalar sa\u011flarken, yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda potansiyel sorunlara yol a\u00e7abilirler.<\/p>\n<h2 id=\"uzman-ipuclari-ve-en-iyi-uygulamalar-react-ve-data-attributes\">Uzman \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar: React ve Data Attributes<\/h2>\n<p>React ortam\u0131nda veri niteliklerini kullan\u0131rken, projenizin s\u00fcrd\u00fcr\u00fclebilirli\u011fini, okunabilirli\u011fini ve performans\u0131n\u0131 art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir.<\/p>\n<ul>\n<li>\n<p><strong><code>ref<\/code> Kullan\u0131m\u0131 ile <code>data-*<\/code> Etkile\u015fimi:<\/strong> React componentleri i\u00e7inde do\u011frudan DOM elementine eri\u015fmek i\u00e7in <code>useRef<\/code> hook'unu kullan\u0131n. Bu, g\u00fcvenli ve React'in ya\u015fam d\u00f6ng\u00fcs\u00fcne uygun bir yakla\u015f\u0131md\u0131r. Daha sonra <code>ref.current.dataset<\/code> \u00fczerinden veri niteliklerine eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-jsx\">import React, { useRef, useEffect } from 'react';\n\nfunction MyComponent() {\n  const myDivRef = useRef(null);\n\n  useEffect(() => {\n    if (myDivRef.current) {\n      \/\/ data-value niteli\u011fini oku\n      const value = myDivRef.current.dataset.value;\n      console.log('Div de\u011feri:', value);\n\n      \/\/ data-status niteli\u011fini g\u00fcncelle\n      myDivRef.current.dataset.status = 'processed';\n    }\n  }, []);\n\n  return <div ref={myDivRef} data-value=\"123\" data-status=\"pending\">Merhaba D\u00fcnya<\/div>;\n}\n<\/pre>\n<p><\/code>\n    <\/li>\n<li>\n<p><strong>Temiz Kod Yaz\u0131m\u0131 ve <code>data-*<\/code> Niteliklerini Organize Etme:<\/strong> Veri niteliklerini isimlendirirken anlaml\u0131 ve tutarl\u0131 olun. CamelCase yerine Kebab-Case (\u00f6rne\u011fin, <code>data-user-id<\/code>) kullanmak, HTML standartlar\u0131na daha uygundur ve JavaScript'teki <code>dataset<\/code> eri\u015fiminde (<code>element.dataset.userId<\/code>) otomatik d\u00f6n\u00fc\u015f\u00fcm sa\u011flar. Ayr\u0131ca, ilgili nitelikleri bir arada tutmaya \u00e7al\u0131\u015f\u0131n.<\/p>\n<\/li>\n<li>\n<p><strong>Ne Zaman <code>data-*<\/code> Yerine React State\/Props Kullanmal\u0131?<\/strong> Bu \u00f6nemli bir ayr\u0131m noktas\u0131d\u0131r.<\/p>\n<div class=\"table-container\">\n<table>\n<thead>\n<tr>\n<th>Senaryo<\/th>\n<th><code>data-*<\/code> Nitelikleri<\/th>\n<th>React State\/Props<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Uygulama genelinde durumu etkileyen veri<\/td>\n<td>\u274c Genellikle uygun de\u011fil<\/td>\n<td>\u2705 Tercih edilen y\u00f6ntem<\/td>\n<\/tr>\n<tr>\n<td>Sadece g\u00f6rsel\/stil de\u011fi\u015fikli\u011fi<\/td>\n<td>\u2705 M\u00fcmk\u00fcn ve bazen daha performansl\u0131<\/td>\n<td>\u2705 Uygulanabilir, bazen daha temiz<\/td>\n<\/tr>\n<tr>\n<td>\u00dc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphane entegrasyonu<\/td>\n<td>\u2705 S\u0131k\u00e7a kullan\u0131l\u0131r, k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr<\/td>\n<td>\u274c Genellikle do\u011frudan ge\u00e7i\u015f zordur<\/td>\n<\/tr>\n<tr>\n<td>S\u0131k ve mikro DOM manip\u00fclasyonlar\u0131<\/td>\n<td>\u2705 Performans kazanc\u0131 sa\u011flayabilir<\/td>\n<td>\u274c Yeniden render maliyeti olabilir<\/td>\n<\/tr>\n<tr>\n<td>Eri\u015filebilirlik (ARIA) durumlar\u0131<\/td>\n<td>\u274c Yanl\u0131\u015f kullan\u0131m (<code>aria-*<\/code> tercih edilmeli)<\/td>\n<td>\u2705 Uygulanabilir, ancak yine <code>aria-*<\/code> \u00f6nceliklidir<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n<\/li>\n<li>\n<p><strong>Custom Hooks ile <code>data-*<\/code> Mant\u0131\u011f\u0131n\u0131 Kaps\u00fclleme:<\/strong> Tekrar eden <code>data-*<\/code> manip\u00fclasyon mant\u0131klar\u0131n\u0131 custom React hook'lar\u0131 i\u00e7inde kaps\u00fclleyebilirsiniz. Bu, kodunuzu daha mod\u00fcler ve yeniden kullan\u0131labilir hale getirir.<\/p>\n<pre><code class=\"language-jsx\">import { useRef, useEffect } from 'react';\n\nfunction useDataAttributeToggle(initialState = false) {\n  const ref = useRef(null);\n\n  useEffect(() => {\n    if (ref.current) {\n      ref.current.dataset.toggled = String(initialState);\n    }\n  }, [initialState]);\n\n  const toggle = () => {\n    if (ref.current) {\n      const current = ref.current.dataset.toggled === 'true';\n      ref.current.dataset.toggled = String(!current);\n    }\n  };\n\n  return [ref, toggle];\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi:\nfunction ToggleableComponent() {\n  const [divRef, toggleDiv] = useDataAttributeToggle(false);\n\n  return (\n    <div ref={divRef} style={{ border: '1px solid black', padding: '10px' }}>\n      <p>Durum: {divRef.current?.dataset.toggled === 'true' ? 'A\u00e7\u0131k' : 'Kapal\u0131'}<\/p>\n      <button onClick={toggleDiv}>De\u011fi\u015ftir<\/button>\n    <\/div>\n  );\n}\n<\/pre>\n<p><\/code>\n    <\/li>\n<li>\n<p><strong>G\u00fcvenlik:<\/strong> Kullan\u0131c\u0131 taraf\u0131ndan sa\u011flanan veya d\u0131\u015far\u0131dan gelen verileri <code>data-*<\/code> nitelikleri olarak depolarken dikkatli olun. E\u011fer bu veriler temizlenmeden veya do\u011frulanmadan HTML'e enjekte edilirse, XSS (Cross-Site Scripting) sald\u0131r\u0131lar\u0131na yol a\u00e7abilir. Her zaman kullan\u0131c\u0131 giri\u015flerini sterilize edin.<\/p>\n<\/li>\n<\/ul>\n<div class=\"tip\">Uzman \u0130pucu: Karma\u015f\u0131k form elemanlar\u0131n\u0131n veya tablolar\u0131n durumunu (\u00f6rne\u011fin, s\u0131ralama s\u0131ras\u0131, filtre durumu) DOM \u00fczerinde tutmak yerine, bu bilgiyi do\u011frudan <code>data-*<\/code> niteliklerine ekleyerek, React'in kontrol etmedi\u011fi d\u0131\u015f sistemlerle kolayca etkile\u015fim kurabilirsiniz. Bu, \u00f6zellikle eski sistemlerle entegrasyon veya mikro optimizasyonlar i\u00e7in kritik \u00f6neme sahip olabilir.<\/div>\n<p>Bu ipu\u00e7lar\u0131 ve en iyi uygulamalar, React projelerinizde veri niteliklerini daha bilin\u00e7li, g\u00fcvenli ve etkili bir \u015fekilde kullanman\u0131za yard\u0131mc\u0131 olacakt\u0131r. React'in felsefesine ba\u011fl\u0131 kal\u0131rken, gerekti\u011finde DOM'un sundu\u011fu bu esnek arac\u0131 ak\u0131ll\u0131ca kullanmak, daha robust ve performansl\u0131 uygulamalar geli\u015ftirmenizi sa\u011flayacakt\u0131r.<\/p>\n<h2 id=\"sonuc\">Sonu\u00e7<\/h2>\n<p>React'in deklaratif ve bile\u015fen tabanl\u0131 felsefesi, modern web geli\u015ftirmenin b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131 m\u00fckemmel bir \u015fekilde kapsar. Ancak, web d\u00fcnyas\u0131n\u0131n dinamik ve \u00e7e\u015fitli do\u011fas\u0131 gere\u011fi, bazen bu felsefenin s\u0131n\u0131rlar\u0131na tak\u0131labiliriz. \u00dc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, do\u011frudan DOM etkile\u015fimi gerektiren mikro optimizasyonlar veya sadece React'in karma\u015f\u0131k state y\u00f6netimini atlamak istedi\u011fimiz anlarda veri nitelikleri (<code>data-*<\/code> attributes) imdad\u0131m\u0131za yeti\u015fir.<\/p>\n<p>Veri nitelikleri, HTML elementlerine \u00f6zel veri eklememizi sa\u011flayan basit ama g\u00fc\u00e7l\u00fc bir mekanizma sunar. Bu nitelikler sayesinde React state'ini kullanmadan, do\u011frudan DOM \u00fczerinde bilgi depolayabilir, JavaScript ile bu bilgilere eri\u015febilir ve hatta CSS ile g\u00f6rsel durumlar\u0131 tetikleyebiliriz. Bu, React'in temel prensiplerinden sapmadan, projemize ekstra esneklik ve baz\u0131 durumlarda \u00f6nemli performans art\u0131\u015flar\u0131 katabilir.<\/p>\n<p>Ancak, bu g\u00fc\u00e7l\u00fc arac\u0131 kullan\u0131rken performans, SEO ve \u00f6zellikle eri\u015filebilirlik (<code>aria-*<\/code> nitelikleri) konular\u0131nda dikkatli olmak \u00f6nemlidir. Do\u011fru senaryoda, bilin\u00e7li bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131nda, veri nitelikleri React uygulamalar\u0131n\u0131z\u0131 bir \u00fcst seviyeye ta\u015f\u0131yabilir ve karma\u015f\u0131k entegrasyon zorluklar\u0131n\u0131n \u00fcstesinden gelmenize yard\u0131mc\u0131 olabilir. Unutmay\u0131n, en iyi geli\u015ftirme yakla\u015f\u0131m\u0131, eldeki arac\u0131 en uygun problemle e\u015fle\u015ftirmektir.<\/p>\n<h2 id=\"sikca-sorulan-sorular\">S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<ul>\n<li>\n<h3>S1: <code>data-*<\/code> nitelikleri React state'in yerini alabilir mi?<\/h3>\n<p>C1: Hay\u0131r, <code>data-*<\/code> nitelikleri React state'in tam bir alternatifi de\u011fildir. React state, bile\u015fenler aras\u0131 veri ak\u0131\u015f\u0131n\u0131, ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc ve uygulaman\u0131n genel durumunu y\u00f6netmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>data-*<\/code> nitelikleri ise daha \u00e7ok DOM \u00f6\u011feleriyle ili\u015fkili lokal ve genellikle g\u00f6rsel verileri depolamak veya \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle ileti\u015fim kurmak i\u00e7in kullan\u0131l\u0131r. B\u00fcy\u00fck \u00f6l\u00e7ekli ve merkezi durum y\u00f6netimi i\u00e7in her zaman React state'i tercih edilmelidir.<\/p>\n<\/li>\n<li>\n<h3>S2: <code>data-*<\/code> kullan\u0131m\u0131 performans\u0131 nas\u0131l etkiler?<\/h3>\n<p>C2: Do\u011frudan DOM manip\u00fclasyonu, React'in sanal DOM fark mekanizmas\u0131n\u0131 atlad\u0131\u011f\u0131 i\u00e7in baz\u0131 k\u00fc\u00e7\u00fck ve s\u0131k g\u00fcncellemelerde (\u00f6rne\u011fin, fare hareketine g\u00f6re pozisyon g\u00fcncelleme) daha h\u0131zl\u0131 olabilir. Ancak, a\u015f\u0131r\u0131 veya verimsiz kullan\u0131m, taray\u0131c\u0131n\u0131n reflow ve repaint i\u015flemlerini art\u0131rarak genel performans\u0131 d\u00fc\u015f\u00fcrebilir. Her durumda, performans etkisini \u00f6l\u00e7erek karar vermek en do\u011frusudur.<\/p>\n<\/li>\n<li>\n<h3>S3: <code>data-*<\/code> nitelikleri SEO i\u00e7in \u00f6nemli mi?<\/h3>\n<p>C3: Hay\u0131r, <code>data-*<\/code> nitelikleri arama motorlar\u0131 taraf\u0131ndan do\u011frudan s\u0131ralama fakt\u00f6r\u00fc olarak kullan\u0131lmaz veya i\u00e7erikleri indexlenmez. Bu nitelikler geli\u015ftiriciye \u00f6zel veri depolamak i\u00e7indir. \u00d6nemli i\u00e7erikleriniz her zaman do\u011frudan HTML i\u00e7inde bulunmal\u0131d\u0131r. Ancak, iyi bir kullan\u0131c\u0131 deneyimi sa\u011flad\u0131\u011f\u0131 i\u00e7in dolayl\u0131 yoldan SEO'ya katk\u0131da bulunabilir.<\/p>\n<\/li>\n<li>\n<h3>S4: Ne zaman <code>data-*<\/code> yerine <code>aria-*<\/code> kullanmal\u0131y\u0131m?<\/h3>\n<p>C4: Bir HTML \u00f6\u011fesinin anlamsal veya eri\u015filebilirlik durumunu belirtmek istedi\u011finizde (\u00f6rne\u011fin, bir \u00f6\u011fenin se\u00e7ili, geni\u015fletilmi\u015f veya devre d\u0131\u015f\u0131 oldu\u011funu), her zaman <code>data-*<\/code> yerine <code>aria-*<\/code> niteliklerini kullanmal\u0131s\u0131n\u0131z. <code>aria-*<\/code> nitelikleri, yard\u0131mc\u0131 teknolojiler (ekran okuyucular gibi) taraf\u0131ndan okunur ve yorumlan\u0131r, b\u00f6ylece engelli kullan\u0131c\u0131lar i\u00e7in daha iyi bir deneyim sa\u011flan\u0131r. <code>data-*<\/code> genellikle g\u00f6rsel durum veya JavaScript i\u00e7in dahili veri tutar.<\/p>\n<\/li>\n<li>\n<h3>S5: React'te <code>data-*<\/code> kullanmak \"anti-pattern\" midir?<\/h3>\n<p>C5: React'in genel felsefesine ayk\u0131r\u0131 gibi g\u00f6r\u00fcnse de, <code>data-*<\/code> kullanmak her zaman bir \"anti-pattern\" de\u011fildir. \u00d6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, belirli mikro optimizasyonlar veya React'in karma\u015f\u0131k state y\u00f6netimini basitle\u015ftirmek istedi\u011finiz durumlar gibi spesifik senaryolarda son derece faydal\u0131 ve gerekli olabilir. \u00d6nemli olan, ne zaman ve neden kulland\u0131\u011f\u0131n\u0131z\u0131 anlamak ve React'in deklaratif yap\u0131s\u0131ndan gereksiz yere sapmamakt\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde&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-34494","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 Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?<\/title>\n<meta name=\"description\" content=\"React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ancak, bazen React&#039;in felsefesi tek ba\u015f\u0131na yeterli gelmeyebilir; \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, karma\u015f\u0131k DOM etkile\u015fimleri veya optimize edilmi\u015f mikro optimizasyonlar gerekti\u011finde. \u0130\u015fte tam da bu noktada, HTML5&#039;in veri nitelikleri (data attributes) devreye girerek hem React&#039;in g\u00fcc\u00fcn\u00fc korumam\u0131za hem de spesifik zorluklar\u0131n \u00fcstesinden gelmemize olanak tan\u0131r.\" \/>\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-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?\" \/>\n<meta property=\"og:description\" content=\"React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ancak, bazen React&#039;in felsefesi tek ba\u015f\u0131na yeterli gelmeyebilir; \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, karma\u015f\u0131k DOM etkile\u015fimleri veya optimize edilmi\u015f mikro optimizasyonlar gerekti\u011finde. \u0130\u015fte tam da bu noktada, HTML5&#039;in veri nitelikleri (data attributes) devreye girerek hem React&#039;in g\u00fcc\u00fcn\u00fc korumam\u0131za hem de spesifik zorluklar\u0131n \u00fcstesinden gelmemize olanak tan\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-17T06:31:12+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?\",\"datePublished\":\"2025-11-17T06:31:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/\"},\"wordCount\":3663,\"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-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/\",\"name\":\"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-17T06:31:12+00:00\",\"description\":\"React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ancak, bazen React'in felsefesi tek ba\u015f\u0131na yeterli gelmeyebilir; \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, karma\u015f\u0131k DOM etkile\u015fimleri veya optimize edilmi\u015f mikro optimizasyonlar gerekti\u011finde. \u0130\u015fte tam da bu noktada, HTML5'in veri nitelikleri (data attributes) devreye girerek hem React'in g\u00fcc\u00fcn\u00fc korumam\u0131za hem de spesifik zorluklar\u0131n \u00fcstesinden gelmemize olanak tan\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?\"}]},{\"@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 Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?","description":"React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ancak, bazen React'in felsefesi tek ba\u015f\u0131na yeterli gelmeyebilir; \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, karma\u015f\u0131k DOM etkile\u015fimleri veya optimize edilmi\u015f mikro optimizasyonlar gerekti\u011finde. \u0130\u015fte tam da bu noktada, HTML5'in veri nitelikleri (data attributes) devreye girerek hem React'in g\u00fcc\u00fcn\u00fc korumam\u0131za hem de spesifik zorluklar\u0131n \u00fcstesinden gelmemize olanak tan\u0131r.","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-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/","og_locale":"tr_TR","og_type":"article","og_title":"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?","og_description":"React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ancak, bazen React'in felsefesi tek ba\u015f\u0131na yeterli gelmeyebilir; \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, karma\u015f\u0131k DOM etkile\u015fimleri veya optimize edilmi\u015f mikro optimizasyonlar gerekti\u011finde. \u0130\u015fte tam da bu noktada, HTML5'in veri nitelikleri (data attributes) devreye girerek hem React'in g\u00fcc\u00fcn\u00fc korumam\u0131za hem de spesifik zorluklar\u0131n \u00fcstesinden gelmemize olanak tan\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-17T06:31:12+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?","datePublished":"2025-11-17T06:31:12+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/"},"wordCount":3663,"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-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/","url":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/","name":"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-17T06:31:12+00:00","description":"React, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olarak, deklaratif yakla\u015f\u0131m\u0131 ve sanal DOM kullan\u0131m\u0131yla aray\u00fcz geli\u015ftirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ancak, bazen React'in felsefesi tek ba\u015f\u0131na yeterli gelmeyebilir; \u00f6zellikle \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerle entegrasyon, karma\u015f\u0131k DOM etkile\u015fimleri veya optimize edilmi\u015f mikro optimizasyonlar gerekti\u011finde. \u0130\u015fte tam da bu noktada, HTML5'in veri nitelikleri (data attributes) devreye girerek hem React'in g\u00fcc\u00fcn\u00fc korumam\u0131za hem de spesifik zorluklar\u0131n \u00fcstesinden gelmemize olanak tan\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-felsefesi-yetersiz-kaldiginda-veri-nitelikleri-nasil-imdada-yetisir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React Felsefesi Yetersiz Kald\u0131\u011f\u0131nda Veri Nitelikleri Nas\u0131l \u0130mdada Yeti\u015fir?"}]},{"@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\/34494","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=34494"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34494\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}