Как я могу остановить отображение react-router-dom при отправке формы?

#javascript #reactjs #react-router-dom

#javascript #reactjs #react-router-dom

Вопрос:

Я реализую диалоговое окно с предупреждением, когда пользователь пытается перейти от формы после ввода информации. При переходе на страницу, использующую react-router, у меня появляется диалоговое окно с пользовательским предупреждением. При переходе на страницы, не связанные с react-router, или с помощью кнопок возврата / перезагрузки браузера у меня установлено отображение стандартного диалогового окна предупреждения браузера.

Все работает как ожидалось, ЗА исключением того, что вы нажимаете кнопку отправки в форме. Поскольку диалоговое окно генерируется, когда форма загрязнена, оно все еще отображается при отправке. Я ищу способ указать, что при отправке пользователем приглашение не активируется.

Я пытался использовать некоторые другие условные обозначения, которые запускают диалоговое окно (или нет), например, formIsDirty amp;amp; formIsSubmitting , но это заставляет диалоговое окно появляться всякий раз, когда форма не отправляется.

Я использую: react 16.13.1 и react-router-dom 5.2.0

Это целый компонент. Когда я использую его в форме, я использую !isPristine from redux-form в качестве условия для when реквизита <Prompt>

 import React, { useEffect, useState, useRef } from 'react';
import { useHistory, Prompt } from 'react-router-dom';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import WarningDialog from 'src/components/WarningDialog';

export default function ExitDialog({ isDirty }) {
  const history = useHistory();
  const nextLocation = useRef();
  const [showExitDialog, setShowExitDialog] = useState(false);

  const cancelNavigation = () => { setShowExitDialog(false); };

  const handleBlockedNavigation = (location) => {
    setShowExitDialog(true);
    nextLocation.current = location;
    return false;
  };

  const confirmNavigation = () => {
    setShowExitDialog(false);
    if (nextLocation.current) { // Navigate to the previous blocked location
      history.push(nextLocation.current);
    }
  };

  useEffect(() => {
    // to handle navigation to Plan10 pages, using the back/forward or refresh in the browser
    function navHandler(e) {
      // Cancel the event
      e.preventDefault();
      // Chrome requires returnValue to be set
      e.returnValue = '';
    }
    if (isDirty) {
      window.addEventListener('beforeunload', navHandler);
    }
    return () => {
      window.removeEventListener('beforeunload', navHandler);
    };
  }, [isDirty]);

  return (
    <>
      <Prompt when={isDirty amp;amp; !showExitDialog} message={handleBlockedNavigation} />
      <WarningDialog
        alertMessage={<FormattedMessage id="admin_home.smartReports.exit_without_saving_title" />}
        applyLabel={<FormattedMessage id="buttons.exit" />}
        cancelLabel={<FormattedMessage id="buttons.continue_editing" />}
        open={showExitDialog}
        data-test-id="exitDialog"
        handleClose={cancelNavigation}
        handleApply={confirmNavigation}
        disableBackdropClick
      >
        <FormattedMessage id="admin_home.smartReports.exit_without_saving_contents" />
      </WarningDialog>
    </>
  );
}

ExitDialog.propTypes = {
  isDirty: PropTypes.bool.isRequired,
};