Я использую Prompt отact-router-dom, чтобы создать свой пользовательский компонент для предотвращения выхода пользователей из формы Popup.
const SignUpForm = () => {
const { fields, onChange, onSubmit } = useFormState();
const isEmpty = Object.keys(fields).length === 0;
usePreventReload(!isEmpty);
const promptMessage = useMemo(() => JSON.stringify({ fields }), [fields]);
return (
<form
onSubmit={onSubmit}
noValidate
autoComplete="off"
>
<h2>Sign Up</h2>
<Prompt when={!isEmpty} message={promptMessage} />
<TextField
label="First Name"
name="firstName"
onChange={onChange}
/>
...
<Button type="submit" variant="contained" color="secondary">
Send
</Button>
</form>
);
};
Если вы ничего не вводите в форму, всплывающее окно можно закрыть без проблем. И когда вы заполните какое-либо значение в любом поле и затем попытаетесь закрыть всплывающее окно, вы увидите всплывающее окно с предупреждением о том, что вы можете потерять данные. Это прекрасно работает, за исключением одного случая - перезагрузка страницы. Для этого я использую слушатель «beforeunload», но в этом случае мы можем использовать только системный диалог. Но возможно ли в этом случае использовать пользовательский компонент?
Я создал простую демонстрацию, чтобы вы лучше поняли - https://sin9k.com/custom-prompt
Кто-нибудь знает Обходной путь для этого случая?