#reactjs #next.js
Вопрос:
Мой Next.js многоступенчатая форма работает просто отлично, переключаясь между шагами на одной странице index.js
return (
<div>
<Head>
<title>Next.js Multi Step Form</title>
</Head>
< Navbar />
<div className={styles.container}>
<FormCard>
{formStep >= 0 amp;amp; (
<ContractInfo
formStep={formStep}
prevFormStep={prevFormStep}
nextFormStep={nextFormStep}
/>
)}
{formStep >= 1 amp;amp; (
<PersonalInfo
formStep={formStep}
prevFormStep={prevFormStep}
formStepToLast={formStepToLast}
/>
)}
{formStep >= 2 amp;amp; (
<ConfirmPurchase
formStep={formStep}
prevFormStep={prevFormStep}
nextFormStep={nextFormStep}
/>
)}
</FormCard>
</div>
</div>
);
Обновить
Опробовав приведенные ниже предложения, я в конечном итоге обновил свой путь. Я также упрощаю свой код (жестко закодированный), так как у меня всего два шага. Текущий код для index.js выглядит следующим образом:
const App = () => {
const router = useRouter();
const [formStep, setFormStep] = useState(0);
const { setFormValues } = useContext(FormContext);
useEffect(() => { router.push(`/?step=${formStep}`), setFormStep(formStep) }, [formStep]);
const nextFormStep = (contract='') => {
setFormStep(1);
setFormValues({ contract });
};
const prevFormStep = () => {
setFormStep((formStep) => formStep - 1);
};
const formStepToLast = () => {
setFormStep(2);
};
return (
<div>
<Head>
<title>Next.js Multi Step Form</title>
</Head>
< Navbar />
<div className={styles.container}>
{formStep >= 0 amp;amp; (
<ContractInfo
formStep={formStep}
prevFormStep={prevFormStep}
nextFormStep={nextFormStep}
/>
)}
{formStep >= 1 amp;amp; (
<PersonalInfo
formStep={formStep}
prevFormStep={prevFormStep}
formStepToLast={formStepToLast}
/>
)}
{formStep >= 2 amp;amp; (
<ConfirmPurchase
formStep={formStep}
prevFormStep={prevFormStep}
nextFormStep={nextFormStep}
/>
)}
</div>
</div>
);
};
export default App;
Тем не менее, мне не удается перемещаться по форме с помощью кнопок браузера Назад / Далее. Это изменит путь, но не будет отображать соответствующий компонент. Я предполагаю, что это произошло. что-то связанное с государством. Если я установлю значение useState равным (1), он отобразит правильный соответствующий компонент в http://localhost:3000/?step=1, так что это действительно спасает государство. Однако навигация с помощью кнопок браузера невозможна.
Ответ №1:
Вы можете использовать параметр запроса для задания formStep
и router.push
обработки шагов формы на одной и той же странице, но с отображением разных URL-адресов.
import { useRouter } from 'next/router';
export default function IndexPage() {
const router = useRouter();
const formStep = router.query.step ?? 0;
// Remaining JSX code
}
Затем в действии для перехода к первому шагу формы вы можете вызвать что-то вроде следующего.
router.push('/?step=1', '/personal_info');
Это приведет к обновлению URL-адреса в браузере и повторному отображению страницы с formStep >= 1
видимыми компонентами.
Вот кодовое поле с упрощенной версией вашей логики.
Комментарии:
1. Я говорю то же самое в комментариях
2. Это работает потрясающе, пока я не попробую кнопки назад и вперед в браузере. В вашей песочнице они работают, у меня проблема в том, что мои шаги являются частью государства. const [formStep, setFormStep] = useState(0); Я думаю, именно поэтому браузер на самом деле не будет двигаться вперед/назад
3. Установите начальное состояние в
const [formStep, setFormStep] = useState(router.query.step ?? 0);
, которое должно справиться с этим.4. Кнопка «Назад» браузера приводит меня к localhost/3000, но по-прежнему отображает шаг 1, а не шаг 0, как это звучит
5. Вы можете использовать
useEffect
для проверки изменений маршрутизатора и изменения состояния