Понедельник, 27 марта 2023 19:53

Клиентское приложение The Cat API на реакте

Оцените материал
(17 голосов)

Сразу скажу, решение это неоднозначное, имеет как свои плюсы, так и минусы.

 

Клиентское приложение TheCatAPI на реакте
Клиентское приложение TheCatAPI на реакте

 

Главный минус в том, что, даже если в версии для разработки (я работаю в create-react-app, вся инфо в модуле левого сайдбара) вы используете файл .env для хранения токена доступа к The Cat API, в продакшне это не поможет, разумеется, скрыть токен: js есть js, выполняется он в браузере пользователя, а не на сервере. Поэтому - только! - если токен доступа у вас бесплатный, который The Cat API - Cats as a Service выдает по первому же запросу в течение нескольких секунд. Зато в числе несомненных плюсов - возможность бесплатно опубликовать статический сайт на гитхабе, ну и еще удовольствие от нестандартного решения. Таким образом, масштабируемым и многообещающим этот клиент The Cat API React App можно назвать с очень большой натяжкой, но, чтобы набить руку на reactjs, он сгодится.

 

Увидеть на гитхабе.

 

Приложение доступно в репозитории гитхаба, его в любой момент возможно клонировать, запустить локально либо запушить на свой сервер / в свою учетку. В этом кратком обзоре остановлюсь только на одном из компонентов.

 

Dev banner 1

 

BreedsComponent.js

import React, { useState, useEffect } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import Table from "react-bootstrap/Table";
import urid from "urid";

function Breeds() {
  const url = `https://api.thecatapi.com/v1/breeds`;
  const api_key = process.env.REACT_APP_THECAT_API_KEY;
  const [apiData, setApiData] = useState({});

  useEffect(() => {
    fetch(url, {
      headers: {
        "Content-Type": "application/json",
        "x-api-key": api_key,
      },
    })
      .then((res) => res.json())
      .then((data) => setApiData(data.filter((img) => img.image?.url != null)));
  });

  return (
    <div className="App">
      <Table
        className="text-center align-middle md-no-table caption-top"
        bordered
        striped
        hover
        variant="dark"
        size="sm"
      >
        <caption>
          <button type="button" className="btn btn-info position-relative">
            Cat Breeds
            <span className="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">
              {apiData.length}
            </span>
          </button>
        </caption>
        <thead className="align-middle">
          <tr>
            <th scope="col">Name</th>
            <th scope="col">Temperament</th>
            <th scope="col">Description</th>
            <th scope="col">Life Span</th>
            <th scope="col">Child Friendly</th>
            <th scope="col">Dog Friendly</th>
            <th scope="col">Stranger Friendly</th>
            <th scope="col">Energy Level</th>
            <th scope="col">Grooming</th>
            <th scope="col">Origin</th>
            <th scope="col">Image</th>
          </tr>
        </thead>
        <tbody>
          {Array.from(apiData).map((item) => (
            <tr key={urid()}>
              <td data-title="Name" key={urid()}>
                <a href={item.wikipedia_url} target="_blank" rel="noreferrer">
                  {item.name}
                </a>
              </td>
              <td data-title="Temperament" key={urid()}>
                {item.temperament}
              </td>
              <td data-title="Description" key={urid()}>
                {item.description}
              </td>
              <td data-title="Life Span" key={urid()}>
                {item.life_span}
              </td>
              <td data-title="Child Friendly" key={urid()}>
                {item.child_friendly}
              </td>
              <td data-title="Dog Friendly" key={urid()}>
                {item.dog_friendly}
              </td>
              <td data-title="Stranger Friendly" key={urid()}>
                {item.stranger_friendly}
              </td>
              <td data-title="Energy Level" key={urid()}>
                {item.energy_level}
              </td>
              <td data-title="Grooming" key={urid()}>
                {item.grooming}
              </td>
              <td data-title="Origin" key={urid()}>
                {item.origin}
              </td>
              <td data-title="Image" key={urid()}>
                <img
                  src={item.image.url}
                  alt={item.name}
                  title={item.name}
                  className="image_cats_collection"
                />
              </td>
            </tr>
          ))}
        </tbody>
      </Table>
    </div>
  );
}

export default Breeds;

 

Понадобится доустановить:

npm i bootstrap react-bootstrap react-scroll-to-top urid

 

Кроме того, чтобы развернуть готовое приложение на бесплатном хостинге гитхаба, воспользуйтесь рекомендациями статьи Glide.js. Слайдер на Реакте.

Самое сложное, когда речь идет о программном коде - не повторять чужих решений. Ну вот я и подумал, возможно, хорошей идеей окажется не только и не столько показ рандомного кота, что, как правило, принято реализовывать в контексте The Cat API, а - публикация энциклопедии кошачьих (сейчас их 65 в этом API) пород, что способно стать вполне себе полезным приложением. Сказано - сделано; взгляните, глобальная кошатизация может выглядеть как-то так, в репо гитхаба присутствует ссылка на демку. Не стесняйтесь изменять, дописывать, доделывать и переделывать это.

 

Добавляем Lightbox2 в галерею изображений на Reactjs.

Последнее изменениеПятница, 31 марта 2023 16:27

Оставить комментарий

Добавьте ваш комментарий

Tic-Tac-Toe with a Neural Network

ReactJS

Заказать сайт

Веб-разработка. Заказать сайт

Вы можете заказать сайт-визитку, блог, корпоративный сайт, интернет-магазин или коммерческий web-портал.