pagination

Jak stworzyć Pagination na stronie ?

Wprowadzenie do Pagination z React Material UI

Witajcie na naszym blogu! Dziś chciałbym poruszyć temat paginacji w React Material UI. Jeśli kiedykolwiek pracowałeś nad stroną internetową lub aplikacją internetową, gdzie potrzebujesz podzielić dużą ilość zawartości na mniejsze części, być może zetknąłeś się z koniecznością implementacji paginacji. React Material UI, popularna biblioteka komponentów interfejsu użytkownika dla Reacta, oferuje wygodne rozwiązania dla tego problemu.

Pagination: Co to właściwie jest?

Paginacja to technika podziału dużej ilości danych na mniejsze części, które są łatwiejsze do przeglądania. Jest to szczególnie przydatne, gdy masz dużą listę elementów, takich jak posty na blogu czy produkty w sklepie internetowym. Zamiast wyświetlać wszystkie elementy na raz, paginacja umożliwia wyświetlanie ich w porcjach, z opcją nawigacji między poszczególnymi stronami.

Link do odcinka: https://www.youtube.com/watch?v=bSHN6q7vzX4

Pagination z React Material UI

Implementacja paginacji za pomocą React Material UI jest stosunkowo prosta i wygodna. Wykorzystujemy komponent Pagination, który oferuje nam wiele opcji dostosowania do naszych potrzeb.

Implementacja w React:

Poniższy kod prezentuje implementację części w React:

1. App.js

import React from 'react'

import OurBlogs from './Components/OurBlogs'

export const App = () => {
  return (
    <>
      <OurBlogs/>
    </>
  )
}

export default App

Poniższy kod prezentuje implementację części w React:

2. OurBlogs.js

import React from 'react'
import PropTypes from 'prop-types'

import { Box, Grid, Typography, Pagination } from '@mui/material'

import ourPost1 from './ourPost1.jpg'
import ourPost2 from './ourPost2.jpg'
import ourPost3 from './ourPost3.jpg'

import theme from '../../theme'

const blogsArray = [
  {
    id: 0,
    title: 'Exploring New Horizons: Discover, Inspire, Transform',
    image: ourPost1,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 1,
    title: 'The Art of Living: Uncover Passions and Find Joy in the Everyday',
    image: ourPost2,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 2,
    title: 'Tech Trends Unleashed: Navigating the Future of Innovation',
    image: ourPost3,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 3,
    title: 'Exploring New Horizons: Discover, Inspire, Transform',
    image: ourPost1,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 4,
    title: 'The Art of Living: Uncover Passions and Find Joy in the Everyday',
    image: ourPost2,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 5,
    title: 'Tech Trends Unleashed: Navigating the Future of Innovation',
    image: ourPost3,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 6,
    title: 'Exploring New Horizons: Discover, Inspire, Transform',
    image: ourPost1,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 7,
    title: 'The Art of Living: Uncover Passions and Find Joy in the Everyday',
    image: ourPost2,
    author: 'Jhon',
    date: '28/02/2024'
  },
  {
    id: 8,
    title: 'Tech Trends Unleashed: Navigating the Future of Innovation',
    image: ourPost3,
    author: 'Jhon',
    date: '28/02/2024'
  }
]

export const OurBlogs = (props) => {
  const {
    sx,
    ...otherProps
  } = props

  // eslint-disable-next-line no-unused-vars
  const [paginationPerPage, setPaginationPerPage] = React.useState(6)
  const [currentPage, setCurrentPage] = React.useState(1)

  const indexOfLastBlog = currentPage * paginationPerPage
  const indexOfFirstBlog = indexOfLastBlog - paginationPerPage

  const onChangePagination = (e, p) => {
    setCurrentPage(p)
  }

  const numOfTotalPages = Math.ceil(blogsArray.length / paginationPerPage)

  const visibleBlogs = blogsArray.slice(indexOfFirstBlog, indexOfLastBlog)

  return (
    <Box
      sx={{
        ...sx,
        display: 'flex',
        alignItems: 'center',
        justifyContent: 'center',
        flexDirection: 'column',
        height: '100vh',
        backgroundColor: 'white',
        padding: '40px'
      }}
      {...otherProps}
    >
      <Typography
        variant={'h1'}
        sx={{
          marginBottom: '40px'
        }}
      >
        PAGINATION
      </Typography>
      <Grid
        spacing={{ xs: 2, md: 2 }}
        container
      >
        {
        visibleBlogs && visibleBlogs.map((blog) => {
          return (
            <Grid
              key={blog.id}
              item
              xs={12}
              sm={6}
              md={4}
            >
              <Box
                color={'black'}
                sx={{
                  display: 'flex',
                  cursor: 'pointer'
                }}
              >
                <Box>
                  <img
                    src={blog.image}
                    alt={'something'}
                    style={{
                      height: '95px',
                      objectFit: 'cover',
                      width: '108px'
                    }}
                  />
                </Box>
                <Box
                  sx={{
                    padding: '0px 10px 30px'
                  }}
                >
                  <Typography
                    variant={'body2'}
                    fontWeight={theme.typography.fontWeightBold}
                  >
                    {blog.title}
                  </Typography>
                  <Box
                    sx={{
                      display: 'flex',
                      alignItems: 'cetner',
                      justifyContent: 'space-between',
                      width: '100%'
                    }}
                  >
                    <Typography
                      variant={'caption'}
                    >
                      {blog.author}
                    </Typography>
                    <Typography
                      variant={'caption'}
                    >
                      {blog.date}
                    </Typography>
                  </Box>
                </Box>
              </Box>
            </Grid>
          )
        })
      }
      </Grid>
      <Box
        sx={{
          display: 'flex',
          alignItems: 'center',
          justifyContent: 'center',
          marginTop: '30px'
        }}
      >
        <Pagination
          count={numOfTotalPages}
          onChange={onChangePagination}
        />
      </Box>
    </Box>
  )
}

OurBlogs.propTypes = {
  sx: PropTypes.object
}

export default OurBlogs

Jak to działa?

  1. Dane: Najpierw definiujemy zestaw danych, których dotyczy nasza paginacja. W tym przypadku są to posty na blogu, zdefiniowane w tablicy blogsArray.
  2. Obliczenia: Następnie wykonujemy obliczenia, aby określić, które elementy będą widoczne na aktualnej stronie. Mamy również obliczenia dotyczące łącznej liczby stron.
  3. Renderowanie: Renderujemy tylko te elementy, które powinny być widoczne na aktualnej stronie.
  4. Paginacja: W końcowej części komponentu dodajemy komponent Pagination, który umożliwia użytkownikowi nawigację między stronami.

Podsumowanie

Paginacja jest ważnym elementem interfejsu użytkownika, szczególnie gdy mamy do czynienia z dużymi zbiorami danych. Dzięki React Material UI możemy łatwo i wygodnie implementować paginację w naszych projektach React. Mam nadzieję, że ten krótki wpis był dla Ciebie pomocny! Jeśli masz jakieś pytania lub uwagi, nie wahaj się ich podzielić w komentarzach poniżej. Dziękuję za lekturę!

pagination

Zobacz więcej blogów

Scroll to Top