国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 web前端 js教程 可存取的元件:分頁

可存取的元件:分頁

Nov 03, 2024 am 12:46 AM

今天我們將了解如何從頭開始建立分頁並使其可存取和可重複使用。希望對(duì)您有幫助,歡迎在文末留言評(píng)論!

Github:https://github.com/micaavigliano/accessible-pagination
項(xiàng)目:https://accessible-pagination.vercel.app/

自訂鉤子來獲取數(shù)據(jù)

const useFetch = <T,>(url: string, currentPage: number = 0, pageSize: number = 20) => {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState<boolean>(true);
  const [error, setError] = useState<boolean>(false);

  useEffect(() => {
    const fetchData = async() => {
      setLoading(true);
      setError(false);

      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error('network response failed')
        }
        const result: T = await response.json() as T;
        setData(result)
      } catch (error) {
        setError(true)
      } finally {
        setLoading(false);
      }
    };

    fetchData()
  }, [url, currentPage, pageSize]);

  return {
    data,
    loading,
    error,
  }
};
  1. 我們將產(chǎn)生一個(gè)具有通用類型的自訂鉤子。這將允許我們指定使用此鉤子時(shí)期望的資料類型
  2. 讓我們等待3個(gè)參數(shù)。一個(gè)用於url,我們將在其中獲取數(shù)據(jù),currentPage 是我們所在的頁面,默認(rèn)情況下它是0,pageSize 是數(shù)字我們每頁將包含的項(xiàng)目數(shù),預(yù)設(shè)為20(您可以變更此值)。
  3. 在我們的狀態(tài)const [data, setData] = useState(空);我們將其傳遞給通用類型T,因?yàn)楫?dāng)我們將它用於不同的資料請(qǐng)求時(shí),我們將期望不同類型的數(shù)據(jù)。

分頁

為了使頁面可訪問,我們必須考慮以下幾點(diǎn):

  • 焦點(diǎn)必須穿過頁面的所有互動(dòng)元素,並有一個(gè)可見的指示器
  • 為了確保與螢?zāi)婚喿x器的良好交互,我們必須正確使用區(qū)域、屬性和狀態(tài)
  • 頁面必須分組在標(biāo)籤內(nèi),並包含將其標(biāo)識(shí)為頁面本身的 aria-label。
  • 分頁中的每個(gè)項(xiàng)目都必須包含 aria-setsize 和 aria-pointset。現(xiàn)在,它們是做什麼用的? aria-setsize 用於計(jì)算分頁清單中的項(xiàng)目總數(shù)。螢?zāi)婚喿x器將如下宣布:

Componentes accesibles: Paginación

aria-pointset 用於計(jì)算該項(xiàng)目在頁面上所有項(xiàng)目中的位置。螢?zāi)婚喿x器將如下宣布:

Componentes accesibles: Paginación

  • 每個(gè)項(xiàng)目都必須有一個(gè) aria-label,以便能夠識(shí)別單擊該按鈕時(shí)我們將轉(zhuǎn)到哪個(gè)頁面。
  • 有按鈕可以轉(zhuǎn)到下一個(gè)/上一個(gè)元素,而且每個(gè)按鈕都必須有其對(duì)應(yīng)的 aria-label
  • 如果我們的分頁包含省略號(hào),則必須使用 aria-label 正確標(biāo)記它
  • 每次我們進(jìn)入新頁面時(shí),螢?zāi)婚喿x器都必須宣布我們所在的頁面以及有多少個(gè)新項(xiàng)目,如下所示。

Componentes accesibles: Paginación

為了實(shí)現(xiàn)這一點(diǎn),我們將對(duì)其進(jìn)行如下編碼:

const useFetch = <T,>(url: string, currentPage: number = 0, pageSize: number = 20) => {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState<boolean>(true);
  const [error, setError] = useState<boolean>(false);

  useEffect(() => {
    const fetchData = async() => {
      setLoading(true);
      setError(false);

      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error('network response failed')
        }
        const result: T = await response.json() as T;
        setData(result)
      } catch (error) {
        setError(true)
      } finally {
        setLoading(false);
      }
    };

    fetchData()
  }, [url, currentPage, pageSize]);

  return {
    data,
    loading,
    error,
  }
};

當(dāng)頁面停止載入時(shí),我們將使用 currentPage 和我們正在載入的新陣列的長(zhǎng)度來設(shè)定一條新訊息。

現(xiàn)在是的!讓我們看看檔案 pagination.tsx

中的程式碼結(jié)構(gòu)如何

此組件需要五個(gè)道具

const [statusMessage, setStatusMessage] = useState<string>("");

useEffect(() => {
    window.scrollTo({ top: 0, behavior: 'smooth' });
    if (!loading) {
      setStatusMessage(`Page ${currentPage} loaded. Displaying ${data?.near_earth_objects.length || 0} items.`);
    }
  }, [currentPage, loading]);
  • currentPage 將引用目前頁。我們將透過在要使用分頁的元件中來處理此問題,如下所示: const [currentPage, setCurrentPage] = useState(1);
  • totalPages 是指 API
  • 包含的要顯示的項(xiàng)目總數(shù)。
  • nextPage 此函數(shù)將允許我們轉(zhuǎn)到下一頁並更新 currentPage 狀態(tài),如下所示:
interface PaginationProps {
  currentPage: number;
  totalPages: number;
  nextPage: () => void;
  prevPage: () => void;
  goToPage: (page: number) => void;
}
  • prevPage 此函數(shù)將允許我們轉(zhuǎn)到目前頁面的上一頁並更新 currentPage 狀態(tài)
const handlePageChange = (newPage: number) => {
    setCurrentPage(newPage); 
  };

  const nextPage = () => {
    if (currentPage < totalPages) {
      handlePageChange(currentPage + 1);
    }
  };
  • goToPage 這個(gè)函數(shù)需要一個(gè)數(shù)字參數(shù),它是每個(gè)項(xiàng)目必須能夠轉(zhuǎn)到所需頁面的函數(shù)。讓我們按如下方式使其工作:
const prevPage = () => {
    if (currentPage > 1) {
      handlePageChange(currentPage - 1);
    }
  };

為了使我們的分頁變得生動(dòng),我們還需要一步,創(chuàng)建我們將在列表中迭代的數(shù)組!為此,我們必須遵循以下步驟:

  1. 建立一個(gè)函數(shù),在本例中我將其命名為 getPageNumbers
  2. 為清單中的第一個(gè)和最後一個(gè)項(xiàng)目建立變數(shù)。
  3. 為左邊的省略號(hào)建立一個(gè)變數(shù)。根據(jù)我自己的決定,我的省略號(hào)將位於清單的第四個(gè)元素之後。
  4. 為右邊的省略號(hào)建立一個(gè)變數(shù)。根據(jù)我自己的決定,我的省略號(hào)將放在清單中的三個(gè)項(xiàng)目之前。
  5. 建立一個(gè)函數(shù),傳回一個(gè)數(shù)組,其中 5 個(gè)項(xiàng)目始終居中,即當(dāng)前頁面、前兩個(gè)項(xiàng)目和後兩個(gè)項(xiàng)目。如果需要,我們將排除第一頁和最後一頁 const pagesAroundCurrent = [currentPage - 2, currentPage - 1, currentPage, currentPage 1, currentPage 2].filter(page => page >firstPage && page
  6. 對(duì)於最後一個(gè)變量,我們將建立一個(gè)包含所有先前建立的變數(shù)的數(shù)組。
  7. 最後,我們將過濾掉空元素並傳回陣列。

我們將透過該數(shù)組來獲取頁面中的項(xiàng)目列表,如下所示:

const useFetch = <T,>(url: string, currentPage: number = 0, pageSize: number = 20) => {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState<boolean>(true);
  const [error, setError] = useState<boolean>(false);

  useEffect(() => {
    const fetchData = async() => {
      setLoading(true);
      setError(false);

      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error('network response failed')
        }
        const result: T = await response.json() as T;
        setData(result)
      } catch (error) {
        setError(true)
      } finally {
        setLoading(false);
      }
    };

    fetchData()
  }, [url, currentPage, pageSize]);

  return {
    data,
    loading,
    error,
  }
};

以下是如何製作可重複使用且易於存取的分頁!就我個(gè)人而言,我學(xué)習(xí)瞭如何從頭開始創(chuàng)建頁面,因?yàn)槲冶仨氃诩磿r(shí)編碼中實(shí)現(xiàn)它,我希望我的經(jīng)驗(yàn)對(duì)您的職業(yè)生涯有所幫助,並且您可以實(shí)現(xiàn)甚至改進(jìn)它!

您好,
雲(yún)母

以上是可存取的元件:分頁的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用於不同的應(yīng)用場(chǎng)景。 Java用於大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用於網(wǎng)頁開發(fā)。

掌握J(rèn)avaScript評(píng)論:綜合指南 掌握J(rèn)avaScript評(píng)論:綜合指南 Jun 14, 2025 am 12:11 AM

評(píng)論arecrucialinjavascriptformaintainingclarityclarityandfosteringCollaboration.1)heelpindebugging,登機(jī),andOnderStandingCodeeVolution.2)使用林格forquickexexplanations andmentmentsmmentsmmentsmments andmmentsfordeffordEffordEffordEffordEffordEffordEffordEffordEddeScriptions.3)bestcractices.3)bestcracticesincracticesinclud

JavaScript評(píng)論:簡(jiǎn)短說明 JavaScript評(píng)論:簡(jiǎn)短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript:探索用於高效編碼的數(shù)據(jù)類型 JavaScript:探索用於高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

Java和JavaScript有什麼區(qū)別? Java和JavaScript有什麼區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。 1.Java是靜態(tài)類型、編譯型語言,適用於企業(yè)應(yīng)用和大型系統(tǒng)。 2.JavaScript是動(dòng)態(tài)類型、解釋型語言,主要用於網(wǎng)頁交互和前端開發(fā)。

See all articles