Создание окна поиска на 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 для тестирования, например:
- JSONPlaceholder:
https://jsonplaceholder.typicode.com/posts?q=
- Open Library API:
https://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 поддерживает пагинацию, добавьте кнопки «Следующая страница» и «Предыдущая страница».
Если у вас есть дополнительные вопросы или проблемы, дайте знать! 😊