Как создать форму с пошаговым заполнением?
Основа такая:
<form>
<label>Заголовок</label>
<input type="text" name="title">
<label>Дата публикации</label>
<input type="date" name="date">
<label>Текст записи</label>
<textarea></textarea>
<input type="submit" name="send" value="Отправить">
</form>
А как сделать так, чтобы эту форму разбить на несколько экранов, и при этом на каждом экране было одно поле под заполнение?
Ответы (1 шт):
Автор решения: Faraday
→ Ссылка
Ваша задача скрыть все шаги регистрации кроме текущего. Это можно сделать при помощи свойства css display: none
и комбинации с JavaScript
, а все шаги должны быть разделены на "блоки", который можно скрыть. На первом этапе вам стоит показывать заполнение только заголовка. При нажатии на кнопку "Далее", этот блок скрыть и показать следующий. Вот подобная реализация, которая выполняется ваши требования:
"use client"
import React, { useState } from 'react';
import '../../styles/styles.css';
interface FormData {
title: string;
date: string;
text: string;
}
export default function MyForm() {
const [formData, setFormData] = useState<FormData>({
title: '',
date: '',
text: ''
});
const [currentStep, setCurrentStep] = useState(0);
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
const { name, value } = e.target;
setFormData(prevData => ({
...prevData,
[name]: value
}));
};
const handlePrevClick = () => {
setCurrentStep(prevStep => prevStep - 1);
};
const handleNextClick = () => {
if (currentStep === 2) {
return;
}
setCurrentStep(prevStep => prevStep + 1);
};
return (
<form id="multiStepForm">
<div className={currentStep === 0 ? 'step active' : 'step'}>
<label>Заголовок</label>
<input type="text" name="title" value={formData.title} onChange={handleInputChange} required />
</div>
<div className={currentStep === 1 ? 'step active' : 'step'}>
<label>Дата публикации</label>
<input type="date" name="date" value={formData.date} onChange={handleInputChange} required />
</div>
<div className={currentStep === 2 ? 'step active' : 'step'}>
<label>Текст записи</label>
<textarea name="text" value={formData.text} onChange={handleInputChange} required></textarea>
</div>
<div className="navigation">
{currentStep !== 0 && <button type="button" id="prevBtn" onClick={handlePrevClick}>Назад</button>}
{currentStep !== 2 ? <button type="button" id="nextBtn" onClick={handleNextClick}>Далее</button> :
<input type="submit" name="send" value="Отправить" />}
</div>
</form>
)
}
UPD: Изменил код под Next.js + TypeScript
, на котором как раз проект открыт. Всё проверил, всё работает отлично.