{"id":33317,"date":"2025-11-01T13:41:02","date_gmt":"2025-11-01T10:41:02","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33317"},"modified":"2025-11-01T13:41:02","modified_gmt":"2025-11-01T10:41:02","slug":"react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/","title":{"rendered":"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p><body><\/p>\n<h2>React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?<\/h2>\n<h3>Giri\u015f: Sayfaland\u0131rma Neden \u00d6nemli?<\/h3>\n<p>Web uygulamalar\u0131nda b\u00fcy\u00fck veri k\u00fcmelerini kullan\u0131c\u0131ya sunarken, t\u00fcm veriyi tek seferde y\u00fcklemek ve g\u00f6stermek hem performans hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan ciddi sorunlara yol a\u00e7abilir. \u0130\u015fte bu noktada sayfaland\u0131rma (pagination) devreye girer. Sayfaland\u0131rma, b\u00fcy\u00fck bir veri setini daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6lerek kullan\u0131c\u0131lar\u0131n bu veriler aras\u0131nda kolayca gezinmesini sa\u011flayan temel bir UI\/UX \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. React gibi modern bir JavaScript k\u00fct\u00fcphanesi ile \u00f6zel sayfaland\u0131rma bile\u015fenleri olu\u015fturmak, uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na tam olarak uyum sa\u011flayan esnek ve g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<h4>Kullan\u0131c\u0131 Deneyimi<\/h4>\n<p>Bir web sayfas\u0131nda binlerce \u00f6\u011fenin ayn\u0131 anda listelendi\u011fini hayal edin. Bu durum, kullan\u0131c\u0131n\u0131n arad\u0131\u011f\u0131 bilgiyi bulmas\u0131n\u0131 zorla\u015ft\u0131r\u0131r, sayfay\u0131 kayd\u0131rma (scrolling) i\u015flemini yorucu hale getirir ve genel kullan\u0131c\u0131 deneyimini olumsuz etkiler. Sayfaland\u0131rma, i\u00e7eri\u011fi mant\u0131ksal sayfalara b\u00f6lerek kullan\u0131c\u0131lar\u0131n daha odakl\u0131 bir \u015fekilde gezinmesine olanak tan\u0131r. Kullan\u0131c\u0131lar hangi sayfada olduklar\u0131n\u0131 bilir, toplam ka\u00e7 sayfa oldu\u011funu g\u00f6r\u00fcr ve belirli bir sayfaya do\u011frudan atlayabilirler. Bu, \u00f6zellikle e-ticaret siteleri, bloglar, forumlar ve veri tablolar\u0131 gibi yo\u011fun i\u00e7erikli uygulamalar i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>Performans Optimizasyonu<\/h4>\n<p>Sayfaland\u0131rman\u0131n en b\u00fcy\u00fck faydalar\u0131ndan biri performans optimizasyonudur. T\u00fcm veriyi veritaban\u0131ndan \u00e7ekip istemciye g\u00f6ndermek ve ard\u0131ndan taray\u0131c\u0131da render etmek, \u00f6zellikle y\u00fcksek boyutlu veri setleri i\u00e7in uzun y\u00fckleme s\u00fcrelerine ve bellek sorunlar\u0131na neden olabilir. Sayfaland\u0131rma sayesinde, sunucudan yaln\u0131zca mevcut sayfa i\u00e7in gerekli olan veri par\u00e7as\u0131 istenir ve render edilir. Bu, hem sunucu y\u00fck\u00fcn\u00fc azalt\u0131r hem de istemci taraf\u0131ndaki sayfa y\u00fckleme s\u00fcresini ve taray\u0131c\u0131 performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Uygulaman\u0131z\u0131n daha h\u0131zl\u0131 ve daha duyarl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Veri Y\u00f6netimi<\/h4>\n<p>Sayfaland\u0131rma, veri y\u00f6netimini daha d\u00fczenli hale getirir. Geli\u015ftiriciler, sunucu taraf\u0131nda veri taban\u0131ndan belirli bir aral\u0131ktaki veriyi (\u00f6rne\u011fin, LIMIT ve OFFSET kullanarak) \u00e7ekerek istemciye g\u00f6nderir. Bu, hem sunucu taraf\u0131nda daha verimli sorgular yaz\u0131lmas\u0131na olanak tan\u0131r hem de istemci taraf\u0131nda gelen verinin boyutunu kontrol alt\u0131nda tutar. Ayr\u0131ca, sayfaland\u0131rma, kullan\u0131c\u0131lar\u0131n belirli filtreler veya s\u0131ralama se\u00e7enekleri uygulad\u0131\u011f\u0131nda da bu se\u00e7eneklerin yaln\u0131zca ilgili sayfa verilerine uygulanmas\u0131n\u0131 sa\u011flayarak veri manip\u00fclasyonunu kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Temel Kavramlar ve Sayfaland\u0131rma Mant\u0131\u011f\u0131<\/h3>\n<p>\u00d6zel bir sayfaland\u0131rma bile\u015feni olu\u015fturmadan \u00f6nce, temel kavramlar\u0131 ve arkas\u0131ndaki mant\u0131\u011f\u0131 anlamak \u00f6nemlidir. Bu kavramlar, sayfaland\u0131rma i\u015flemini do\u011fru bir \u015fekilde uygulamak i\u00e7in birer yap\u0131 ta\u015f\u0131 g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<h4><code>currentPage<\/code> (Mevcut Sayfa)<\/h4>\n<p><code>currentPage<\/code>, kullan\u0131c\u0131n\u0131n o an g\u00f6r\u00fcnt\u00fcledi\u011fi sayfan\u0131n numaras\u0131d\u0131r. Genellikle 1&#8217;den ba\u015flar. Bu de\u011fer, kullan\u0131c\u0131n\u0131n hangi veri blo\u011funu g\u00f6rmesi gerekti\u011fini belirlemede merkezi bir rol oynar. Sayfaland\u0131rma bile\u015fenindeki d\u00fc\u011fmelere t\u0131kland\u0131\u011f\u0131nda bu de\u011fer g\u00fcncellenir.<\/p>\n<h4><code>itemsPerPage<\/code> (Sayfa Ba\u015f\u0131na \u00d6\u011fe Say\u0131s\u0131)<\/h4>\n<p><code>itemsPerPage<\/code>, her bir sayfada ka\u00e7 adet \u00f6\u011fe (veri kayd\u0131) g\u00f6sterilece\u011fini belirleyen sabit bir de\u011ferdir. Bu de\u011fer, uygulaman\u0131n tasar\u0131m\u0131na ve kullan\u0131c\u0131n\u0131n tercihine g\u00f6re ayarlanabilir. \u00d6rne\u011fin, bir blog sayfas\u0131nda 10 yaz\u0131, bir e-ticaret sitesinde 20 \u00fcr\u00fcn g\u00f6sterilebilir. Bu de\u011fer, toplam veri k\u00fcmesinin ka\u00e7 sayfaya b\u00f6l\u00fcnece\u011fini hesaplamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4><code>totalItems<\/code> (Toplam \u00d6\u011fe Say\u0131s\u0131)<\/h4>\n<p><code>totalItems<\/code>, veri k\u00fcmesindeki toplam \u00f6\u011fe say\u0131s\u0131d\u0131r. Bu bilgi genellikle sunucu taraf\u0131ndan sa\u011flan\u0131r ve sayfaland\u0131rma bile\u015feninin ka\u00e7 adet sayfa numaras\u0131 g\u00f6stermesi gerekti\u011fini hesaplamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4><code>totalPages<\/code> (Toplam Sayfa Say\u0131s\u0131)<\/h4>\n<p><code>totalPages<\/code>, <code>totalItems<\/code> ve <code>itemsPerPage<\/code> kullan\u0131larak hesaplanan toplam sayfa say\u0131s\u0131d\u0131r. Bu de\u011fer, sayfaland\u0131rma bile\u015feninin ka\u00e7 adet sayfa numaras\u0131 d\u00fc\u011fmesi olu\u015fturaca\u011f\u0131n\u0131 belirler. Genellikle <code>Math.ceil(totalItems \/ itemsPerPage)<\/code> form\u00fcl\u00fc ile hesaplan\u0131r, \u00e7\u00fcnk\u00fc kalan \u00f6\u011feler i\u00e7in de yeni bir sayfa a\u00e7\u0131lmas\u0131 gerekir.<\/p>\n<h4>Veri Dilimleme Mant\u0131\u011f\u0131<\/h4>\n<p>Sayfaland\u0131rman\u0131n temelinde, b\u00fcy\u00fck veri k\u00fcmesini mevcut sayfa numaras\u0131na ve sayfa ba\u015f\u0131na \u00f6\u011fe say\u0131s\u0131na g\u00f6re dilimleme (slicing) mant\u0131\u011f\u0131 yatar. Bu, genellikle JavaScript&#8217;teki <code>slice()<\/code> dizin metodunu kullanarak yap\u0131l\u0131r.<br \/>\n<em>   <code>indexOfLastItem<\/code>: Mevcut sayfadaki son \u00f6\u011fenin dizinini (index) belirler. Form\u00fcl\u00fc: <code>currentPage <\/em> itemsPerPage<\/code>.<br \/>\n*   <code>indexOfFirstItem<\/code>: Mevcut sayfadaki ilk \u00f6\u011fenin dizinini belirler. Form\u00fcl\u00fc: <code>indexOfLastItem - itemsPerPage<\/code>.<br \/>\n*   <code>currentItems<\/code>: <code>indexOfFirstItem<\/code> ile <code>indexOfLastItem<\/code> aras\u0131ndaki \u00f6\u011feleri i\u00e7eren veri dilimidir. Bu dilim, kullan\u0131c\u0131n\u0131n o an g\u00f6rd\u00fc\u011f\u00fc veriyi temsil eder.<\/p>\n<p>Bu temel kavramlar\u0131 anlad\u0131ktan sonra, React&#8217;ta bir sayfaland\u0131rma bile\u015feni olu\u015fturmaya ba\u015flayabiliriz.<\/p>\n<h3>React&#8217;ta Temel Bir Sayfaland\u0131rma Bile\u015feni Olu\u015fturma<\/h3>\n<p>React&#8217;ta \u00f6zel bir sayfaland\u0131rma bile\u015feni olu\u015fturmak, genellikle bir ana bile\u015fen (\u00f6rne\u011fin, <code>ProductList<\/code> veya <code>BlogPosts<\/code>) ve bir alt bile\u015fen (<code>Pagination<\/code>) kullanarak yap\u0131l\u0131r. Ana bile\u015fen, veriyi y\u00f6netirken, alt bile\u015fen sayfaland\u0131rma kontrollerini render eder ve sayfa de\u011fi\u015fikliklerini ana bile\u015fene bildirir.<\/p>\n<h4>Veri Durumu ve Sayfaland\u0131rma Parametreleri<\/h4>\n<p>\u00d6ncelikle, uygulaman\u0131z\u0131n ana bile\u015feninde (\u00f6rne\u011fin, <code>App.js<\/code> veya <code>ProductList.js<\/code>) sayfaland\u0131rma i\u00e7in gerekli durumlar\u0131 y\u00f6netmemiz gerekir. <code>useState<\/code> hook&#8217;u bu durumlar\u0131 y\u00f6netmek i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-jsx\">import React, { useState, useEffect } from 'react';\n\n\/\/ \u00d6rnek bir veri k\u00fcmesi\nconst allItems = Array.from({ length: 100 }, (_, i) => <code>\u00d6\u011fe ${i + 1}<\/code>);\n\nfunction ProductList() {\n  const [currentPage, setCurrentPage] = useState(1);\n  const [itemsPerPage, setItemsPerPage] = useState(10); \/\/ Her sayfada 10 \u00f6\u011fe g\u00f6ster\n\n  \/\/ Toplam sayfa say\u0131s\u0131n\u0131 hesapla\n  const totalPages = Math.ceil(allItems.length \/ itemsPerPage);\n\n  \/\/ Mevcut sayfada g\u00f6sterilecek \u00f6\u011feleri hesapla\n  const indexOfLastItem = currentPage * itemsPerPage;\n  const indexOfFirstItem = indexOfLastItem - itemsPerPage;\n  const currentItems = allItems.slice(indexOfFirstItem, indexOfLastItem);\n\n  \/\/ Sayfa de\u011fi\u015ftirme fonksiyonu\n  const paginate = (pageNumber) => setCurrentPage(pageNumber);\n\n  return (\n    <div>\n      \n      <ul>\n        {currentItems.map((item, index) => (\n          <li key={index}>{item}<\/li>\n        ))}\n      <\/ul>\n\n      {\/<em> Sayfaland\u0131rma bile\u015feni buraya gelecek <\/em>\/}\n      <Pagination\n        itemsPerPage={itemsPerPage}\n        totalItems={allItems.length}\n        paginate={paginate}\n        currentPage={currentPage}\n        totalPages={totalPages}\n      \/>\n    <\/div>\n  );\n}\n\nexport default ProductList;<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>allItems<\/code>: Uygulaman\u0131n t\u00fcm veri k\u00fcmesini temsil eden basit bir dizi. Ger\u00e7ek bir uygulamada bu veri genellikle bir API&#8217;den \u00e7ekilir.<br \/>\n*   <code>currentPage<\/code>: Mevcut sayfa numaras\u0131n\u0131 tutar. Ba\u015flang\u0131\u00e7ta 1 olarak ayarlanm\u0131\u015ft\u0131r.<br \/>\n*   <code>itemsPerPage<\/code>: Her sayfada ka\u00e7 \u00f6\u011fe g\u00f6sterilece\u011fini belirler.<br \/>\n*   <code>totalPages<\/code>: Toplam sayfa say\u0131s\u0131d\u0131r, <code>allItems.length<\/code> ve <code>itemsPerPage<\/code> kullan\u0131larak hesaplan\u0131r.<br \/>\n*   <code>indexOfFirstItem<\/code>, <code>indexOfLastItem<\/code>, <code>currentItems<\/code>: Mevcut sayfada g\u00f6sterilecek \u00f6\u011feleri dilimlemek i\u00e7in kullan\u0131lan de\u011fi\u015fkenlerdir.<br \/>\n*   <code>paginate<\/code>: <code>currentPage<\/code> durumunu g\u00fcncelleyen bir fonksiyondur.<\/p>\n<h4>Sayfaland\u0131rma Mant\u0131\u011f\u0131n\u0131n Uygulanmas\u0131<\/h4>\n<p><code>Pagination<\/code> bile\u015fenimiz, <code>ProductList<\/code> bile\u015feninden gerekli prop&#8217;lar\u0131 alacak ve sayfa numaras\u0131 d\u00fc\u011fmelerini render edecektir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ Pagination.js\nimport React from 'react';\n\nconst Pagination = ({ itemsPerPage, totalItems, paginate, currentPage, totalPages }) => {\n  const pageNumbers = [];\n\n  for (let i = 1; i <= totalPages; i++) {\n    pageNumbers.push(i);\n  }\n\n  return (\n    <nav>\n      <ul className=\"pagination\">\n        {pageNumbers.map(number => (\n          <li key={number} className={<code>page-item ${currentPage === number ? 'active' : ''}<\/code>}>\n            <a onClick={() => paginate(number)} href=\"#!\" className=\"page-link\">\n              {number}\n            <\/a>\n          <\/li>\n        ))}\n      <\/ul>\n    <\/nav>\n  );\n};\n\nexport default Pagination;<\/code><\/pre>\n<p>Bu temel <code>Pagination<\/code> bile\u015feni:<br \/>\n*   <code>pageNumbers<\/code> dizisini olu\u015fturur. Bu dizi, 1&#8217;den <code>totalPages<\/code>&#8216;a kadar olan t\u00fcm sayfa numaralar\u0131n\u0131 i\u00e7erir.<br \/>\n*   Bu <code>pageNumbers<\/code> dizisini haritalayarak her bir sayfa numaras\u0131 i\u00e7in bir liste \u00f6\u011fesi (<code><\/p>\n<li><\/code>) ve bir ba\u011flant\u0131 (<code><a><\/code>) olu\u015fturur.<br \/>\n*   <code>onClick<\/code> olay\u0131nda, <code>paginate<\/code> prop&#8217;unu \u00e7a\u011f\u0131rarak ana bile\u015fendeki <code>currentPage<\/code> durumunu g\u00fcnceller.<br \/>\n*   Mevcut sayfay\u0131 vurgulamak i\u00e7in <code>active<\/code> s\u0131n\u0131f\u0131n\u0131 ekler.<\/p>\n<p>Bu yap\u0131yla, kullan\u0131c\u0131 sayfa numaralar\u0131na t\u0131klad\u0131k\u00e7a <code>currentPage<\/code> durumu de\u011fi\u015fecek, bu da <code>ProductList<\/code> bile\u015feninin yeniden render edilmesine ve <code>currentItems<\/code>&#8216;\u0131n g\u00fcncellenmesine neden olacakt\u0131r. Sonu\u00e7 olarak, listedeki \u00f6\u011feler mevcut sayfaya g\u00f6re de\u011fi\u015fecektir.<\/p>\n<h4>G\u00f6rsel Bile\u015fenlerin Tasar\u0131m\u0131<\/h4>\n<p>Yukar\u0131daki \u00f6rnekte basit bir <code><\/p>\n<ul><\/code> ve <code><\/p>\n<li><\/code> yap\u0131s\u0131 kulland\u0131k. Ger\u00e7ek bir uygulamada, bu bile\u015fenleri CSS veya bir UI k\u00fct\u00fcphanesi (\u00f6rne\u011fin, Tailwind CSS, Bootstrap, Material-UI) ile stilize ederek daha \u00e7ekici ve kullan\u0131\u015fl\u0131 hale getirebilirsiniz.\n<p>\u00d6rne\u011fin, Tailwind CSS ile basit bir stil:<\/p>\n<pre><code class=\"language-css\">\/<em> index.css veya App.css <\/em>\/\n.pagination {\n  display: flex;\n  list-style: none;\n  padding: 0;\n  margin: 20px 0;\n  justify-content: center;\n}\n\n.page-item {\n  margin: 0 5px;\n}\n\n.page-link {\n  display: block;\n  padding: 8px 12px;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  text-decoration: none;\n  color: #333;\n  cursor: pointer;\n  transition: background-color 0.2s;\n}\n\n.page-link:hover {\n  background-color: #f0f0f0;\n}\n\n.page-item.active .page-link {\n  background-color: #007bff;\n  color: white;\n  border-color: #007bff;\n}<\/code><\/pre>\n<p>Bu CSS ile sayfaland\u0131rma d\u00fc\u011fmeleri daha d\u00fczenli ve interaktif g\u00f6r\u00fcnecektir.<\/p>\n<h3>Geli\u015fmi\u015f Sayfaland\u0131rma \u00d6zellikleri<\/h3>\n<p>Temel bir sayfaland\u0131rma bile\u015feni olu\u015fturmak iyi bir ba\u015flang\u0131\u00e7 olsa da, ger\u00e7ek d\u00fcnya uygulamalar\u0131 genellikle daha geli\u015fmi\u015f \u00f6zellikler gerektirir.<\/p>\n<h4>Sayfa Aral\u0131\u011f\u0131 Y\u00f6netimi (\u00d6rn: 1 2 3 &#8230; 7 8 9)<\/h4>\n<p>\u00c7ok say\u0131da sayfa oldu\u011funda (\u00f6rne\u011fin, 100 sayfa), t\u00fcm sayfa numaralar\u0131n\u0131 listelemek sayfaland\u0131rma bile\u015fenini \u00e7ok uzun ve kullan\u0131\u015fs\u0131z hale getirir. Bu durumda, belirli bir aral\u0131ktaki sayfa numaralar\u0131n\u0131 g\u00f6sterip aradaki sayfalar i\u00e7in &#8220;&#8230;&#8221; (\u00fc\u00e7 nokta) kullanmak yayg\u0131n bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>Bu mant\u0131\u011f\u0131 uygulamak i\u00e7in <code>Pagination<\/code> bile\u015fenimizi g\u00fcncelleyebiliriz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ Pagination.js (Geli\u015fmi\u015f Versiyon)\nimport React from 'react';\n\nconst Pagination = ({ itemsPerPage, totalItems, paginate, currentPage, totalPages, pageRangeDisplayed = 5 }) => {\n  const pageNumbers = [];\n\n  \/\/ Sayfa numaralar\u0131n\u0131 olu\u015fturma mant\u0131\u011f\u0131\n  if (totalPages <= pageRangeDisplayed) {\n    \/\/ Toplam sayfa say\u0131s\u0131 g\u00f6sterilecek aral\u0131ktan k\u00fc\u00e7\u00fckse t\u00fcm\u00fcn\u00fc g\u00f6ster\n    for (let i = 1; i <= totalPages; i++) {\n      pageNumbers.push(i);\n    }\n  } else {\n    \/\/ Dinamik sayfa aral\u0131\u011f\u0131 olu\u015fturma\n    const leftBound = Math.max(1, currentPage - Math.floor(pageRangeDisplayed \/ 2));\n    const rightBound = Math.min(totalPages, currentPage + Math.floor(pageRangeDisplayed \/ 2));\n\n    if (leftBound > 1) {\n      pageNumbers.push(1);\n      if (leftBound > 2) {\n        pageNumbers.push('...');\n      }\n    }\n\n    for (let i = leftBound; i <= rightBound; i++) {\n      pageNumbers.push(i);\n    }\n\n    if (rightBound < totalPages) {\n      if (rightBound < totalPages - 1) {\n        pageNumbers.push('...');\n      }\n      pageNumbers.push(totalPages);\n    }\n  }\n\n  return (\n    <nav>\n      <ul className=\"pagination\">\n        {\/<em> \u00d6nceki Sayfa Butonu <\/em>\/}\n        <li className={<code>page-item ${currentPage === 1 ? 'disabled' : ''}<\/code>}>\n          <a onClick={() => paginate(currentPage - 1)} href=\"#!\" className=\"page-link\">\n            \u00d6nceki\n          <\/a>\n        <\/li>\n\n        {pageNumbers.map((number, index) => (\n          <li key={index} className={<code>page-item ${currentPage === number ? 'active' : ''} ${number === '...' ? 'disabled' : ''}<\/code>}>\n            {number === '...' ? (\n              <span className=\"page-link\">...<\/span>\n            ) : (\n              <a onClick={() => paginate(number)} href=\"#!\" className=\"page-link\">\n                {number}\n              <\/a>\n            )}\n          <\/li>\n        ))}\n\n        {\/<em> Sonraki Sayfa Butonu <\/em>\/}\n        <li className={<code>page-item ${currentPage === totalPages ? 'disabled' : ''}<\/code>}>\n          <a onClick={() => paginate(currentPage + 1)} href=\"#!\" className=\"page-link\">\n            Sonraki\n          <\/a>\n        <\/li>\n      <\/ul>\n    <\/nav>\n  );\n};\n\nexport default Pagination;<\/code><\/pre>\n<p>Bu geli\u015ftirilmi\u015f mant\u0131k, <code>pageRangeDisplayed<\/code> prop&#8217;u sayesinde yaln\u0131zca belirli bir say\u0131da sayfa numaras\u0131n\u0131 g\u00f6sterir ve gerekti\u011finde &#8220;&#8230;&#8221; ekler.<\/p>\n<h4>&#8220;\u0130lk&#8221;, &#8220;\u00d6nceki&#8221;, &#8220;Sonraki&#8221;, &#8220;Son&#8221; D\u00fc\u011fmeleri<\/h4>\n<p>Kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in genellikle sayfa numaralar\u0131n\u0131n yan\u0131 s\u0131ra &#8220;\u0130lk&#8221;, &#8220;\u00d6nceki&#8221;, &#8220;Sonraki&#8221; ve &#8220;Son&#8221; d\u00fc\u011fmeleri eklenir. Bu d\u00fc\u011fmeler, kullan\u0131c\u0131lar\u0131n sayfalar aras\u0131nda daha h\u0131zl\u0131 gezinmesini sa\u011flar.<\/p>\n<p>Yukar\u0131daki geli\u015fmi\u015f <code>Pagination<\/code> bile\u015feni \u00f6rne\u011finde &#8220;\u00d6nceki&#8221; ve &#8220;Sonraki&#8221; d\u00fc\u011fmeleri eklenmi\u015ftir. &#8220;\u0130lk&#8221; ve &#8220;Son&#8221; d\u00fc\u011fmeleri de benzer \u015fekilde eklenebilir:<\/p>\n<pre><code class=\"language-jsx\">\/\/ Pagination.js (\u0130lk\/Son d\u00fc\u011fmeleri eklenmi\u015f)\n\/\/ ... (\u00f6nceki kod)\nconst Pagination = ({ itemsPerPage, totalItems, paginate, currentPage, totalPages, pageRangeDisplayed = 5 }) => {\n  \/\/ ... (pageNumbers olu\u015fturma mant\u0131\u011f\u0131)\n\n  return (\n    <nav>\n      <ul className=\"pagination\">\n        {\/<em> \u0130lk Sayfa Butonu <\/em>\/}\n        <li className={<code>page-item ${currentPage === 1 ? 'disabled' : ''}<\/code>}>\n          <a onClick={() => paginate(1)} href=\"#!\" className=\"page-link\">\n            \u0130lk\n          <\/a>\n        <\/li>\n        {\/<em> \u00d6nceki Sayfa Butonu <\/em>\/}\n        <li className={<code>page-item ${currentPage === 1 ? 'disabled' : ''}<\/code>}>\n          <a onClick={() => paginate(currentPage - 1)} href=\"#!\" className=\"page-link\">\n            \u00d6nceki\n          <\/a>\n        <\/li>\n\n        {\/<em> Sayfa Numaralar\u0131 <\/em>\/}\n        {pageNumbers.map((number, index) => (\n          <li key={index} className={<code>page-item ${currentPage === number ? 'active' : ''} ${number === '...' ? 'disabled' : ''}<\/code>}>\n            {number === '...' ? (\n              <span className=\"page-link\">...<\/span>\n            ) : (\n              <a onClick={() => paginate(number)} href=\"#!\" className=\"page-link\">\n                {number}\n              <\/a>\n            )}\n          <\/li>\n        ))}\n\n        {\/<em> Sonraki Sayfa Butonu <\/em>\/}\n        <li className={<code>page-item ${currentPage === totalPages ? 'disabled' : ''}<\/code>}>\n          <a onClick={() => paginate(currentPage + 1)} href=\"#!\" className=\"page-link\">\n            Sonraki\n          <\/a>\n        <\/li>\n        {\/<em> Son Sayfa Butonu <\/em>\/}\n        <li className={<code>page-item ${currentPage === totalPages ? 'disabled' : ''}<\/code>}>\n          <a onClick={() => paginate(totalPages)} href=\"#!\" className=\"page-link\">\n            Son\n          <\/a>\n        <\/li>\n      <\/ul>\n    <\/nav>\n  );\n};\n\nexport default Pagination;<\/code><\/pre>\n<p>Bu d\u00fc\u011fmelerin <code>disabled<\/code> s\u0131n\u0131flar\u0131, ilgili ko\u015fullar (\u00f6rne\u011fin, ilk sayfadayken &#8220;\u0130lk&#8221; ve &#8220;\u00d6nceki&#8221; d\u00fc\u011fmelerinin pasif olmas\u0131) sa\u011fland\u0131\u011f\u0131nda kullan\u0131c\u0131ya g\u00f6rsel geri bildirim sa\u011flar ve hatal\u0131 t\u0131klamalar\u0131 \u00f6nler.<\/p>\n<h4>Sayfa Boyutunu De\u011fi\u015ftirme<\/h4>\n<p>Kullan\u0131c\u0131lara her sayfada ka\u00e7 \u00f6\u011fe g\u00f6rmek istediklerini se\u00e7me olana\u011f\u0131 sunmak, sayfaland\u0131rma deneyimini daha esnek hale getirir. Bu genellikle bir <code><select><\/code> kutusu ile yap\u0131l\u0131r.<\/p>\n<p><code>ProductList<\/code> bile\u015fenimize <code>itemsPerPage<\/code> de\u011ferini g\u00fcncelleyen bir <code><select><\/code> kutusu ekleyelim:<\/p>\n<pre><code class=\"language-jsx\">\/\/ ProductList.js (itemsPerPage se\u00e7ene\u011fi eklenmi\u015f)\nimport React, { useState, useEffect } from 'react';\n\/\/ ... allItems tan\u0131m\u0131\n\nfunction ProductList() {\n  const [currentPage, setCurrentPage] = useState(1);\n  const [itemsPerPage, setItemsPerPage] = useState(10);\n  const itemsPerPageOptions = [5, 10, 20, 50]; \/\/ Kullan\u0131c\u0131n\u0131n se\u00e7ebilece\u011fi se\u00e7enekler\n\n  const totalPages = Math.ceil(allItems.length \/ itemsPerPage);\n\n  const indexOfLastItem = currentPage * itemsPerPage;\n  const indexOfFirstItem = indexOfLastItem - itemsPerPage;\n  const currentItems = allItems.slice(indexOfFirstItem, indexOfLastItem);\n\n  const paginate = (pageNumber) => setCurrentPage(pageNumber);\n\n  const handleItemsPerPageChange = (e) => {\n    setItemsPerPage(Number(e.target.value));\n    setCurrentPage(1); \/\/ Sayfa boyutunu de\u011fi\u015ftirince ilk sayfaya d\u00f6n\n  };\n\n  return (\n    <div>\n      \n\n      <div style={{ marginBottom: '15px' }}>\n        <label htmlFor=\"itemsPerPageSelect\">Sayfa Ba\u015f\u0131na \u00d6\u011feler: <\/label>\n        <select\n          id=\"itemsPerPageSelect\"\n          value={itemsPerPage}\n          onChange={handleItemsPerPageChange}\n          style={{ marginLeft: '10px', padding: '5px' }}\n        >\n          {itemsPerPageOptions.map(option => (\n            <option key={option} value={option}>\n              {option}\n            <\/option>\n          ))}\n        <\/select>\n      <\/div>\n\n      <ul>\n        {currentItems.map((item, index) => (\n          <li key={index}>{item}<\/li>\n        ))}\n      <\/ul>\n\n      <Pagination\n        itemsPerPage={itemsPerPage}\n        totalItems={allItems.length}\n        paginate={paginate}\n        currentPage={currentPage}\n        totalPages={totalPages}\n      \/>\n    <\/div>\n  );\n}\n\nexport default ProductList;<\/code><\/pre>\n<p><code>handleItemsPerPageChange<\/code> fonksiyonu, <code>itemsPerPage<\/code> durumunu g\u00fcnceller ve ayn\u0131 zamanda <code>currentPage<\/code>&#8216;i 1&#8217;e s\u0131f\u0131rlar. Bu, kullan\u0131c\u0131 farkl\u0131 bir sayfa boyutu se\u00e7ti\u011finde tutarl\u0131 bir deneyim sa\u011flar.<\/p>\n<h4>URL Parametreleri ile Sayfa Durumunu Y\u00f6netme<\/h4>\n<p>Sayfaland\u0131rma durumunu URL&#8217;de saklamak (\u00f6rne\u011fin, <code>?page=2&limit=10<\/code>), kullan\u0131c\u0131lar\u0131n mevcut sayfay\u0131 taray\u0131c\u0131 ge\u00e7mi\u015finde tutmas\u0131n\u0131, yer imi eklemesini veya ba\u011flant\u0131y\u0131 ba\u015fkalar\u0131yla payla\u015fmas\u0131n\u0131 sa\u011flar. Bu, uygulamalar\u0131n daha kullan\u0131c\u0131 dostu ve SEO uyumlu olmas\u0131na yard\u0131mc\u0131 olur. React Router kullan\u0131yorsan\u0131z, <code>useSearchParams<\/code> hook&#8217;u bu i\u015flem i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ ProductList.js (URL parametreleri ile entegrasyon)\nimport React, { useState, useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom'; \/\/ React Router v6+ i\u00e7in\n\n\/\/ ... allItems tan\u0131m\u0131\n\nfunction ProductList() {\n  const [searchParams, setSearchParams] = useSearchParams();\n\n  \/\/ URL'den sayfa ve limit de\u011ferlerini oku, yoksa varsay\u0131lanlar\u0131 kullan\n  const initialPage = Number(searchParams.get('page')) || 1;\n  const initialItemsPerPage = Number(searchParams.get('limit')) || 10;\n\n  const [currentPage, setCurrentPage] = useState(initialPage);\n  const [itemsPerPage, setItemsPerPage] = useState(initialItemsPerPage);\n  const itemsPerPageOptions = [5, 10, 20, 50];\n\n  const totalPages = Math.ceil(allItems.length \/ itemsPerPage);\n\n  \/\/ URL parametreleri de\u011fi\u015fti\u011finde veya bile\u015fen y\u00fcklendi\u011finde durumu g\u00fcncelle\n  useEffect(() => {\n    setCurrentPage(Number(searchParams.get('page')) || 1);\n    setItemsPerPage(Number(searchParams.get('limit')) || 10);\n  }, [searchParams]);\n\n  \/\/ Sayfa veya limit de\u011fi\u015fti\u011finde URL'yi g\u00fcncelle\n  useEffect(() => {\n    const newSearchParams = new URLSearchParams();\n    newSearchParams.set('page', currentPage.toString());\n    newSearchParams.set('limit', itemsPerPage.toString());\n    setSearchParams(newSearchParams);\n  }, [currentPage, itemsPerPage, setSearchParams]);\n\n\n  const indexOfLastItem = currentPage * itemsPerPage;\n  const indexOfFirstItem = indexOfLastItem - itemsPerPage;\n  const currentItems = allItems.slice(indexOfFirstItem, indexOfLastItem);\n\n  const paginate = (pageNumber) => {\n    if (pageNumber < 1 || pageNumber > totalPages) return; \/\/ Ge\u00e7ersiz sayfa numaras\u0131 kontrol\u00fc\n    setCurrentPage(pageNumber);\n  };\n\n  const handleItemsPerPageChange = (e) => {\n    setItemsPerPage(Number(e.target.value));\n    setCurrentPage(1); \/\/ Sayfa boyutunu de\u011fi\u015ftirince ilk sayfaya d\u00f6n\n  };\n\n  return (\n    <div>\n      {\/<em> ... (\u00f6nceki render k\u0131sm\u0131) <\/em>\/}\n    <\/div>\n  );\n}\n\nexport default ProductList;<\/code><\/pre>\n<p>Bu entegrasyonla:<br \/>\n*   <code>useSearchParams<\/code> hook&#8217;u, URL sorgu parametrelerini okumak ve yazmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>initialPage<\/code> ve <code>initialItemsPerPage<\/code> de\u011ferleri URL&#8217;den okunur. E\u011fer URL&#8217;de yoksa varsay\u0131lan de\u011ferler kullan\u0131l\u0131r.<br \/>\n*   <code>useEffect<\/code> hook&#8217;lar\u0131, <code>searchParams<\/code> de\u011fi\u015fti\u011finde React durumunu g\u00fcncellemek ve <code>currentPage<\/code> veya <code>itemsPerPage<\/code> de\u011fi\u015fti\u011finde URL&#8217;yi g\u00fcncellemek i\u00e7in kullan\u0131l\u0131r. Bu, uygulaman\u0131z\u0131n URL ile senkronize kalmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>paginate<\/code> fonksiyonuna eklenen kontrol, ge\u00e7ersiz sayfa numaralar\u0131na (\u00f6rne\u011fin, 0 veya toplam sayfa say\u0131s\u0131ndan b\u00fcy\u00fck) gidilmesini engeller.<\/p>\n<p>Bu kurulum, uygulaman\u0131z\u0131n sayfaland\u0131rma durumunu kal\u0131c\u0131 hale getirir ve kullan\u0131c\u0131lar\u0131n daha iyi bir deneyim ya\u015famas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Performans ve Kullan\u0131c\u0131 Deneyimi \u0130pu\u00e7lar\u0131<\/h3>\n<p>\u00d6zel bir sayfaland\u0131rma bile\u015feni olu\u015ftururken, sadece i\u015flevselli\u011fe de\u011fil, ayn\u0131 zamanda performansa ve kullan\u0131c\u0131 deneyimine de dikkat etmek \u00f6nemlidir.<\/p>\n<h4>Lazy Loading \/ Infinite Scroll Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h4>\n<p>Sayfaland\u0131rma, b\u00fcy\u00fck veri k\u00fcmelerini y\u00f6netmek i\u00e7in harika bir y\u00f6ntemdir, ancak her zaman en iyi \u00e7\u00f6z\u00fcm olmayabilir. Alternatif olarak, &#8220;Lazy Loading&#8221; (tembel y\u00fckleme) veya &#8220;Infinite Scroll&#8221; (sonsuz kayd\u0131rma) gibi teknikler de d\u00fc\u015f\u00fcn\u00fclebilir.<br \/>\n*   <strong>Sayfaland\u0131rma:<\/strong> Kullan\u0131c\u0131ya toplam sayfa say\u0131s\u0131n\u0131 ve mevcut konumunu net bir \u015fekilde g\u00f6sterir. Belirli bir sayfaya do\u011frudan gitme olana\u011f\u0131 sunar. Genellikle arama sonu\u00e7lar\u0131, \u00fcr\u00fcn kataloglar\u0131 gibi yap\u0131land\u0131r\u0131lm\u0131\u015f veriler i\u00e7in uygundur.<br \/>\n*   <strong>Lazy Loading \/ Infinite Scroll:<\/strong> Kullan\u0131c\u0131 sayfay\u0131 a\u015fa\u011f\u0131 kayd\u0131rd\u0131k\u00e7a daha fazla i\u00e7eri\u011fi dinamik olarak y\u00fckler. Kullan\u0131c\u0131lar\u0131n s\u00fcrekli olarak yeni i\u00e7erikle kar\u015f\u0131la\u015fmas\u0131n\u0131 sa\u011flar. Sosyal medya ak\u0131\u015flar\u0131, haber siteleri gibi s\u00fcrekli ak\u0131\u015f halindeki i\u00e7erikler i\u00e7in daha uygundur.<br \/>\nSe\u00e7im, uygulaman\u0131z\u0131n i\u00e7eri\u011finin t\u00fcr\u00fcne ve kullan\u0131c\u0131lar\u0131n bu i\u00e7erikle nas\u0131l etkile\u015fim kurmas\u0131n\u0131 istedi\u011finize ba\u011fl\u0131d\u0131r.<\/p>\n<h4>SEO Dostu Sayfaland\u0131rma<\/h4>\n<p>Arama motorlar\u0131, i\u00e7eri\u011finizi ke\u015ffetmek ve dizine eklemek i\u00e7in sayfaland\u0131rma yap\u0131s\u0131n\u0131 do\u011fru bir \u015fekilde anlamal\u0131d\u0131r.<br \/>\n*   <strong>Anlamsal HTML:<\/strong> Sayfaland\u0131rma ba\u011flant\u0131lar\u0131n\u0131z\u0131n <code><a><\/code> etiketleri oldu\u011fundan ve <code>href<\/code> niteliklerinin do\u011fru URL&#8217;leri i\u015faret etti\u011finden emin olun. \u00d6rne\u011fin, <code><a href=\"\/urunler?page=2\">2<\/a><\/code>.<br \/>\n*   <strong><code>rel=\"prev\"<\/code> ve <code>rel=\"next\"<\/code>:<\/strong> Her sayfan\u0131n <code><head><\/code> b\u00f6l\u00fcm\u00fcne bu etiketleri ekleyerek arama motorlar\u0131na sayfalar\u0131n birbirleriyle ili\u015fkisini bildirin.<\/p>\n<pre><code class=\"language-html\"><link rel=\"prev\" href=\"\/urunler?page=1\" \/>\n    <link rel=\"next\" href=\"\/urunler?page=3\" \/><\/code><\/pre>\n<p>*   <strong>Canonical URL:<\/strong> \u0130lk sayfay\u0131 (veya ana sayfay\u0131) canonical olarak belirtmek, yinelenen i\u00e7erik sorunlar\u0131n\u0131 \u00f6nleyebilir.<br \/>\n*   <strong>URL Parametreleri:<\/strong> Sayfa numaras\u0131n\u0131 ve sayfa ba\u015f\u0131na \u00f6\u011fe say\u0131s\u0131n\u0131 URL parametrelerinde (\u00f6rne\u011fin, <code>?page=2&limit=10<\/code>) tutmak, arama motorlar\u0131n\u0131n her sayfay\u0131 ayr\u0131 bir kaynak olarak g\u00f6rmesine yard\u0131mc\u0131 olur.<\/p>\n<h4>Eri\u015filebilirlik (ARIA)<\/h4>\n<p>Sayfaland\u0131rma bile\u015feninizin t\u00fcm kullan\u0131c\u0131lar i\u00e7in eri\u015filebilir oldu\u011fundan emin olun.<br \/>\n*   <strong>Anlamsal Etiketler:<\/strong> <code>nav<\/code> etiketi, sayfaland\u0131rma navigasyonunu belirtmek i\u00e7in uygundur.<br \/>\n*   <strong>ARIA Nitelikleri:<\/strong> <code>aria-label<\/code> veya <code>aria-current=\"page\"<\/code> gibi ARIA nitelikleri, ekran okuyucular\u0131n\u0131n sayfaland\u0131rma yap\u0131s\u0131n\u0131 daha iyi anlamas\u0131na yard\u0131mc\u0131 olur. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-html\"><nav aria-label=\"Sayfaland\u0131rma Navigasyonu\">\n      <ul className=\"pagination\">\n        <li className=\"page-item active\" aria-current=\"page\">\n          <a href=\"#!\" className=\"page-link\">1<\/a>\n        <\/li>\n        {\/<em> ... <\/em>\/}\n      <\/ul>\n    <\/nav><\/code><\/pre>\n<p>*   <strong>Klavye Navigasyonu:<\/strong> Kullan\u0131c\u0131lar\u0131n klavye ile sayfalar aras\u0131nda gezinebildi\u011finden emin olun. <code>Tab<\/code> tu\u015fu ile d\u00fc\u011fmeler aras\u0131nda ge\u00e7i\u015f yap\u0131labilmeli ve <code>Enter<\/code> tu\u015fu ile sayfa de\u011fi\u015ftirilebilmelidir.<\/p>\n<h4>Stil ve Tasar\u0131m<\/h4>\n<p>Sayfaland\u0131rma bile\u015feninin tasar\u0131m\u0131, uygulaman\u0131z\u0131n genel g\u00f6r\u00fcn\u00fcm ve hissiyle uyumlu olmal\u0131d\u0131r.<br \/>\n*   <strong>Duyarl\u0131 Tasar\u0131m:<\/strong> Sayfaland\u0131rma bile\u015feninin farkl\u0131 ekran boyutlar\u0131nda (mobil, tablet, masa\u00fcst\u00fc) d\u00fczg\u00fcn g\u00f6r\u00fcnmesini ve \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flay\u0131n. \u00d6zellikle k\u00fc\u00e7\u00fck ekranlarda, t\u00fcm sayfa numaralar\u0131n\u0131 g\u00f6stermek yerine &#8220;&#8230;&#8221; yap\u0131s\u0131n\u0131 kullanmak daha \u00f6nemlidir.<br \/>\n*   <strong>G\u00f6rsel Geri Bildirim:<\/strong> T\u0131klanabilir \u00f6\u011felerin \u00fczerine gelindi\u011finde (hover) veya etkin (active) durumdayken g\u00f6rsel geri bildirim (renk de\u011fi\u015fimi, g\u00f6lge vb.) sa\u011flamak, kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<br \/>\n*   <strong>Bo\u015fluk ve Hizalama:<\/strong> D\u00fc\u011fmeler aras\u0131nda yeterli bo\u015fluk b\u0131rak\u0131n ve hizalamay\u0131 do\u011fru yap\u0131n, b\u00f6ylece d\u00fc\u011fmeler net bir \u015fekilde ayr\u0131l\u0131r ve t\u0131klamas\u0131 kolay olur.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>React ile \u00f6zel sayfaland\u0131rma bile\u015fenleri olu\u015fturmak, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rman\u0131n ve kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin g\u00fc\u00e7l\u00fc bir yoludur. Temel mant\u0131\u011f\u0131 anlayarak ve <code>useState<\/code>, <code>useEffect<\/code> gibi React hook&#8217;lar\u0131n\u0131 kullanarak, veri k\u00fcmenizi etkili bir \u015fekilde y\u00f6neten ve kullan\u0131c\u0131lar\u0131n i\u00e7eri\u011finizde rahat\u00e7a gezinmesini sa\u011flayan esnek ve \u00f6zelle\u015ftirilebilir bir \u00e7\u00f6z\u00fcm olu\u015fturabilirsiniz.<\/p>\n<p>Bu makalede, temel sayfaland\u0131rma mant\u0131\u011f\u0131ndan ba\u015flayarak, &#8220;\u0130lk&#8221;, &#8220;\u00d6nceki&#8221;, &#8220;Sonraki&#8221;, &#8220;Son&#8221; d\u00fc\u011fmeleri, sayfa aral\u0131\u011f\u0131 y\u00f6netimi ve URL parametreleri ile entegrasyon gibi geli\u015fmi\u015f \u00f6zelliklere kadar bir\u00e7ok konuyu ele ald\u0131k. Ayr\u0131ca, performans, SEO ve eri\u015filebilirlik gibi kritik hususlara da de\u011findik.<\/p>\n<h4>\u0130leriye D\u00f6n\u00fck Ad\u0131mlar<\/h4>\n<p>*   <strong>Sunucu Taraf\u0131 Sayfaland\u0131rma:<\/strong> Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, <code>allItems<\/code> dizisi genellikle sunucudan gelir. Sunucu taraf\u0131nda <code>page<\/code> ve <code>limit<\/code> parametrelerine g\u00f6re filtrelenmi\u015f veriyi \u00e7ekmek ve <code>totalItems<\/code> bilgisini de API yan\u0131t\u0131nda almak, daha \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcm sunar.<br \/>\n*   <strong>Test Etme:<\/strong> Bile\u015fenlerinizi farkl\u0131 senaryolarla (s\u0131f\u0131r \u00f6\u011fe, tek sayfa, \u00e7ok say\u0131da sayfa) test ederek sa\u011flaml\u0131\u011f\u0131n\u0131 sa\u011flay\u0131n.<br \/>\n*   <strong>UI K\u00fct\u00fcphaneleri:<\/strong> E\u011fer s\u0131f\u0131rdan stil yazmak istemiyorsan\u0131z, Chakra UI, Ant Design veya Material-UI gibi pop\u00fcler UI k\u00fct\u00fcphanelerinin sayfaland\u0131rma bile\u015fenlerini inceleyebilir ve uygulaman\u0131za entegre edebilirsiniz. Bu k\u00fct\u00fcphaneler genellikle eri\u015filebilirlik ve duyarl\u0131l\u0131k gibi konular\u0131 sizin i\u00e7in halleder.<\/p>\n<p>\u00d6zel bir sayfaland\u0131rma bile\u015feni olu\u015fturmak, React becerilerinizi geli\u015ftirirken ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n\u0131za daha iyi bir deneyim sunman\u0131z\u0131 sa\u011flayacak de\u011ferli bir ad\u0131md\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?\nGiri\u015f: Sayfaland\u0131rma Neden \u00d6nemli?\nWeb uygulamalar\u0131nda b\u00fcy\u00fck veri k\u00fcmelerini","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-33317","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 ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur? Giri\u015f: Sayfaland\u0131rma Neden \u00d6nemli? Web uygulamalar\u0131nda b\u00fcy\u00fck veri k\u00fcmelerini\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-01T10:41:02+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=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2025-11-01T10:41:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/\"},\"wordCount\":2493,\"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-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/\",\"name\":\"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-01T10:41:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?\"}]},{\"@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 ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?","og_description":"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur? Giri\u015f: Sayfaland\u0131rma Neden \u00d6nemli? Web uygulamalar\u0131nda b\u00fcy\u00fck veri k\u00fcmelerini","og_url":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-01T10:41:02+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?","datePublished":"2025-11-01T10:41:02+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/"},"wordCount":2493,"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-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/","name":"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-01T10:41:02+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-sayfalandirma-pagination-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React ile \u00d6zel Sayfaland\u0131rma (Pagination) Nas\u0131l Olu\u015fturulur?"}]},{"@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\/33317","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=33317"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33317\/revisions"}],"predecessor-version":[{"id":33318,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33317\/revisions\/33318"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}