FAQ компонент
Обзор
FAQ (Часто задаваемые вопросы) компонент используется на лендинге для отображения часто задаваемых вопросов и ответов в формате аккордеона. Этот компонент позволяет организовать информацию в компактном формате, где пользователи могут раскрывать только интересующие их вопросы.
Компонент состоит из трех основных частей:
FAQ.tsx
- основной контейнер, который включает заголовок, описание и список вопросовFAQList.tsx
- компонент-обертка для организации списка вопросов в аккордеонFAQItem.tsx
- отдельный элемент вопрос-ответ
Структура компонентов
1. FAQ.tsx
Основной контейнерный компонент, который содержит секцию FAQ, заголовок, описание и массив вопросов с ответами.
"use client";
import FAQList from "./FAQList";
import { Button } from "@/components/ui/button";
export default function FAQ() {
const faqItems = [
{
question: "Что включено в boilerplate?",
answer: "Наш boilerplate включает полноценный фронтенд на Next.js 15...",
},
// Другие вопросы и ответы
];
return (
<section id="faq" className="section py-20 bg-gray-900">
<div className="container">
<div className="text-center mb-16">
<h2 className="mb-4">Часто задаваемые вопросы</h2>
<p className="text-xl text-gray-400 max-w-3xl mx-auto">
Все, что вам нужно знать о нашем boilerplate.
</p>
</div>
<FAQList items={faqItems} defaultValue="item-0" />
<div className="mt-16 text-center">
<p className="mb-6">Остались вопросы?</p>
<Button asChild>
<a href="mailto:support@example.com">Связаться с нами</a>
</Button>
</div>
</div>
</section>
);
}
2. FAQList.tsx
Компонент, который принимает массив вопросов и ответов и выводит их в виде аккордеона. Использует компонент Accordion
из библиотеки Shadcn UI.
import { Accordion } from "@/components/ui/accordion";
import FAQItem from "./FAQItem";
interface FAQListProps {
items: Array<{
question: string;
answer: string;
}>;
defaultValue?: string;
}
export default function FAQList({ items, defaultValue }: FAQListProps) {
return (
<Accordion
type="single"
collapsible
defaultValue={defaultValue}
className="max-w-3xl mx-auto"
>
{items.map((item, index) => (
<FAQItem
key={index}
question={item.question}
answer={item.answer}
value={`item-${index}`}
/>
))}
</Accordion>
);
}
3. FAQItem.tsx
Компонент для отдельного элемента вопрос-ответ. Использует компоненты AccordionItem
,AccordionTrigger
и AccordionContent
из Shadcn UI.
import {
AccordionItem,
AccordionTrigger,
AccordionContent,
} from "@/components/ui/accordion";
interface FAQItemProps {
question: string;
answer: string;
value: string;
}
export default function FAQItem({ question, answer, value }: FAQItemProps) {
return (
<AccordionItem value={value} className="border-b border-gray-800 py-2">
<AccordionTrigger className="text-xl font-semibold hover:no-underline">
{question}
</AccordionTrigger>
<AccordionContent className="text-gray-400">
<p>{answer}</p>
</AccordionContent>
</AccordionItem>
);
}
Использование
Для добавления секции FAQ на страницу, импортируйте и используйте компонент FAQ
:
import FAQ from "@/app/(landing)/_components/FAQ";
export default function LandingPage() {
return (
<main>
{/* Другие секции страницы */}
<FAQ />
</main>
);
}
Если вам нужно использовать компонент FAQ с собственными вопросами в другом месте, вы можете создать собственный экземпляр с другими данными:
import FAQList from "@/app/(landing)/_components/FAQList";
export default function CustomFAQSection() {
const customFaqItems = [
{
question: "Вопрос 1?",
answer: "Ответ на вопрос 1.",
},
{
question: "Вопрос 2?",
answer: "Ответ на вопрос 2.",
},
// Другие вопросы
];
return (
<section className="my-section">
<h2>Наши FAQ</h2>
<FAQList items={customFaqItems} defaultValue="item-0" />
</section>
);
}
Кастомизация
Изменение стилей
Вы можете настроить внешний вид компонентов FAQ, изменяя классы Tailwind CSS в соответствующих компонентах. Основные места для изменения стилей:
- В
FAQ.tsx
- для изменения секции, заголовков и общего контейнера - В
FAQList.tsx
- для изменения аккордеона и его размеров - В
FAQItem.tsx
- для изменения стилей отдельных вопросов и ответов
Примеры изменения стилей:
// Изменение стиля вопроса в FAQItem.tsx
<AccordionTrigger className="text-xl font-bold text-primary hover:text-primary-dark hover:no-underline">
{question}
</AccordionTrigger>
// Изменение стиля ответа в FAQItem.tsx
<AccordionContent className="text-gray-600 dark:text-gray-300 text-base">
<p>{answer}</p>
</AccordionContent>
Добавление расширенного контента
В ответах вы также можете использовать расширенный контент, например, ссылки, списки или другие HTML-элементы:
// Модифицированный FAQItem для поддержки HTML в ответах
import {
AccordionItem,
AccordionTrigger,
AccordionContent,
} from "@/components/ui/accordion";
interface FAQItemProps {
question: string;
answer: React.ReactNode; // Изменено с string на ReactNode
value: string;
}
export default function FAQItem({ question, answer, value }: FAQItemProps) {
return (
<AccordionItem value={value} className="border-b border-gray-800 py-2">
<AccordionTrigger className="text-xl font-semibold hover:no-underline">
{question}
</AccordionTrigger>
<AccordionContent className="text-gray-400">
{typeof answer === 'string' ? <p>{answer}</p> : answer}
</AccordionContent>
</AccordionItem>
);
}
Используя модифицированный компонент:
const faqItems = [
{
question: "Как установить проект?",
answer: (
<div>
<p>Следуйте этим шагам:</p>
<ol className="list-decimal ml-5 mt-2 space-y-1">
<li>Клонируйте репозиторий</li>
<li>Выполните команду `npm install`</li>
<li>Запустите проект с помощью `npm run dev`</li>
</ol>
<p className="mt-2">
Дополнительную информацию можно найти в
<a href="/docs" className="text-blue-500 hover:underline"> документации</a>.
</p>
</div>
),
},
// Другие вопросы
];
Рекомендации по использованию
- Формулируйте вопросы четко и конкретно
- Располагайте наиболее важные и часто задаваемые вопросы в начале списка
- Оптимальное количество вопросов - от 5 до 10, чтобы не перегружать страницу
- Для ответов используйте краткие, но информативные формулировки
- Если ответ слишком длинный, рассмотрите возможность разбить его на несколько вопросов
- Периодически обновляйте FAQ на основе обратной связи от пользователей и поддержки
Использование без аккордеона
Если вам нужно отобразить FAQ без аккордеона, вы можете создать альтернативный компонент:
export function SimpleFAQList({ items }: { items: Array<{ question: string; answer: string }> }) {
return (
<div className="space-y-8 max-w-3xl mx-auto">
{items.map((item, index) => (
<div key={index} className="border-b border-gray-800 pb-6">
<h3 className="text-xl font-semibold mb-3">{item.question}</h3>
<p className="text-gray-400">{item.answer}</p>
</div>
))}
</div>
);
}
Заключение
Компонент FAQ - это удобный способ организации ответов на часто задаваемые вопросы на вашем сайте. Используя аккордеон, вы можете представить большой объем информации в компактном и удобном для пользователей формате.
Не забывайте, что хорошо составленный раздел FAQ может значительно снизить нагрузку на службу поддержки и повысить удовлетворенность пользователей.