1
votes

Existe-t-il un moyen de bloquer la navigation de l'utilisateur sans aucune invite de réaction

Nous avons implémenté notre navigation applicative à l'aide de react-router.

Existe-t-il un moyen de bloquer la navigation de l'utilisateur (y compris les boutons avant et arrière) sans aucune invite de réaction.

Fonction d'abonnement au bloc d'historique de react-router que je ne peux pas utiliser car elle lancera une invite par défaut. Dans mon cas, je souhaite afficher ma boîte de dialogue personnalisée.


5 commentaires

Vous voulez dire le navigateur natif back / forw?


Oui. Je veux que les deux navigations soient arrêtées sur booléen. et ils ne devraient afficher aucune invite. je veux montrer notre propre boîte de dialogue personnalisée pour cela.


Ce n'est pas possible pour des raisons de sécurité


avez-vous essayé routerWillLeave de routerWillLeave -router?


Si vous avez besoin d'afficher une invite personnalisée, vous pouvez utiliser "react-router-navigation-prompt"


5 Réponses :


1
votes

Vous pouvez ajouter un écouteur d'événement popState pour figer la navigation.

Démo de travail

const Home = ({ history }) => {
  useEffect(() => {
    const browserNavigationHandle = () =>
      window.history.pushState(null, null, document.URL);
    window.history.pushState(null, null, document.URL);
    window.addEventListener("popstate", browserNavigationHandle);
    return () =>
      window.removeEventListener("popstate", browserNavigationHandle);
  }, []);
  return <div>Home</div>;
};

export default Home;


2 commentaires

mais cela semble altérer l'histoire. Existe-t-il un moyen légitime de le faire pour les grandes applications d'entreprise sans casser aucune autre fonctionnalité standard?


Je pense qu'il est possible d'utiliser history.replaceState au lieu de history.pushState



0
votes

Pour désactiver le bouton de retour, vous pouvez faire le code ci-dessous dans un composant d'ordre supérieur

componentDidMount() {
const { history } = this.props;

window.addEventListener("popstate", () => {
  history.go(1);
});

}

mais ce composant doit être un composant Route


0 commentaires

1
votes

Il n'y a aucun moyen de bloquer la navigation du navigateur d'un utilisateur, car cela enlèverait tout contrôle d'un utilisateur et pourrait être utilisé de manière très malveillante. Ce que vous pouvez faire, c'est empêcher votre application de changer.

Une façon pourrait être d'écouter les modifications de l'historique et de revenir à la page sur laquelle l'utilisateur devrait se trouver. Le problème avec cela est le rendu et vous pourriez perdre des états, en fonction de votre application.

Une autre façon pourrait être (comme je n'ai pas essayé cela auparavant) d'utiliser un objet d'historique personnalisé. Découvrez comment configurer le routeur avec l'historique. Comme on le voit dans leur exemple:

import React from "react";
import ReactDOM from "react-dom";
import { Router } from "react-router";
import { createBrowserHistory } from "history";

const history = createBrowserHistory();

ReactDOM.render(
  <Router history={history}>
    <App />
  </Router>,
  node
);

Il peut y avoir un moyen de personnaliser cet objet d'historique afin que vous puissiez contrôler sa modification et la réponse des applications.


0 commentaires

0
votes

Ajoutez simplement useHistory().go(1) fonctionne pour moi.


0 commentaires

0
votes

utilisez ceci pour empêcher le routage

 window.addEventListener('beforeunload', (event) => {
        event.preventDefault();
        event.stopPropagation();}


0 commentaires