Создать в src/app/(site) на bootstrsap окно поиска из api

Создание окна поиска на Bootstrap с использованием API в src/app/(site) в Next.js

Давайте создадим окно поиска, которое будет использовать Bootstrap для стилизации и API для получения данных. Мы будем использовать Next.js и разместим компонент в папке src/app/(site).


1. Установка Bootstrap

Сначала установим Bootstrap в ваш проект Next.js:

bash

npm install bootstrap

Затем подключите CSS Bootstrap в файле src/app/globals.css:

css

@import "bootstrap/dist/css/bootstrap.min.css";


2. Создание компонента поиска

Создайте файл SearchBox.js в папке src/app/(site):

javascript

"use client";

import { useState } from "react";

export default function SearchBox() {
  const [query, setQuery] = useState(""); // Состояние для ввода
  const [results, setResults] = useState([]); // Состояние для результатов поиска
  const [loading, setLoading] = useState(false); // Состояние загрузки

  // Функция для выполнения поиска
  const handleSearch = async (e) => {
    e.preventDefault();
    setLoading(true);

    try {
      // Пример API-запроса (замените URL на ваш API)
      const response = await fetch(`https://api.example.com/search?q=${query}`);
      const data = await response.json();
      setResults(data.results || []); // Предполагаем, что API возвращает массив результатов
    } catch (error) {
      console.error("Ошибка при выполнении поиска:", error);
    } finally {
      setLoading(false);
    }
  };

  return (
    <div className="container mt-5">
      <h1 className="mb-4">Поиск</h1>
      <form onSubmit={handleSearch} className="mb-4">
        <div className="input-group">
          <input
            type="text"
            className="form-control"
            placeholder="Введите запрос..."
            value={query}
            onChange={(e) => setQuery(e.target.value)}
          />
          <button className="btn btn-primary" type="submit" disabled={loading}>
            {loading ? "Поиск..." : "Искать"}
          </button>
        </div>
      </form>

      {/* Отображение результатов */}
      <div>
        {results.length > 0 ? (
          <ul className="list-group">
            {results.map((result, index) => (
              <li key={index} className="list-group-item">
                {result.title || "Результат"} - {result.description || "Описание"}
              </li>
            ))}
          </ul>
        ) : (
          !loading && <p>Нет результатов</p>
        )}
      </div>
    </div>
  );
}


3. Добавление компонента в page.js

Теперь подключим компонент SearchBox в файл src/app/(site)/page.js:

javascript

import SearchBox from "./SearchBox";

export default function Page() {
  return (
    <div>
      <SearchBox />
    </div>
  );
}


4. Пример API

Если у вас еще нет API, вы можете использовать публичный API для тестирования, например:

  • JSONPlaceholderhttps://jsonplaceholder.typicode.com/posts?q=
  • Open Library APIhttps://openlibrary.org/search.json?q=

Пример изменения API-запроса в SearchBox.js:

javascript

const response = await fetch(`https://openlibrary.org/search.json?q=${query}`);
const data = await response.json();
setResults(data.docs || []); // Open Library возвращает массив `docs`


5. Запуск проекта

Запустите проект с помощью команды:

bash

npm run dev

Откройте браузер и перейдите на http://localhost:3000. Вы увидите окно поиска, которое отправляет запросы к API и отображает результаты.


6. Дополнительные улучшения

  • Обработка ошибок: Добавьте пользовательские сообщения об ошибках, если API недоступен.
  • Скелетон загрузки: Вместо текста «Поиск…» можно добавить анимацию загрузки.
  • Пагинация: Если API поддерживает пагинацию, добавьте кнопки «Следующая страница» и «Предыдущая страница».

Если у вас есть дополнительные вопросы или проблемы, дайте знать! 😊