106 votes

bouton de réaction onClick redirige la page

Je travaille sur une application web utilisant React et bootstrap. Quand il s'agit d'appliquer le bouton onClick, cela me prend du temps pour laisser ma page être redirigée vers une autre. Si après un href , je ne peux pas aller sur une autre page.

Pouvez-vous me dire s'il est nécessaire d'utiliser react-navigation ou autre pour naviguer dans la page en utilisant le bouton onClick ?

import React, { Component } from 'react';
import { Button, Card, CardBody, CardGroup, Col, Container, Input, InputGroup, InputGroupAddon, InputGroupText, Row, NavLink  } from 'reactstrap';

class LoginLayout extends Component {

  render() {
    return (
 <div className="app flex-row align-items-center">
        <Container>
     ...
                    <Row>
                      <Col xs="6">                      
                        <Button color="primary" className="px-4">
                            Login
                         </Button>
                      </Col>
                      <Col xs="6" className="text-right">
                        <Button color="link" className="px-0">Forgot password?</Button>
                      </Col>
                    </Row>
               ...
        </Container>
      </div>
    );
  }
}

1 votes

133voto

aravind_reddy Points 1994

mise à jour :

React Router v6 :

import React from 'react';
import { useNavigate } from "react-router-dom";
function LoginLayout() {

  let navigate = useNavigate(); 
  const routeChange = () =>{ 
    let path = `newPath`; 
    navigate(path);
  }

  return (
     <div className="app flex-row align-items-center">
      <Container>
      ...          
          <Button color="primary" className="px-4"
            onClick={routeChange}
              >
              Login
            </Button>
      ...
       </Container>
    </div>
  );
}}

React Router v5 avec crochets :

import React from 'react';
import { useHistory } from "react-router-dom";
function LoginLayout() {

  const history = useHistory();

  const routeChange = () =>{ 
    let path = `newPath`; 
    history.push(path);
  }

  return (
      <div className="app flex-row align-items-center">
        <Container>
          ...
          <Row>
            <Col xs="6">                      
              <Button color="primary" className="px-4"
                onClick={routeChange}
                  >
                  Login
                </Button>
            </Col>
            <Col xs="6" className="text-right">
              <Button color="link" className="px-0">Forgot password?</Button>
            </Col>
          </Row>
          ...
        </Container>
      </div>
  );
}
export default LoginLayout;

avec React Router v5 :

import { useHistory } from 'react-router-dom';
import { Button, Card, CardBody, CardGroup, Col, Container, Input, InputGroup, InputGroupAddon, InputGroupText, Row, NavLink  } from 'reactstrap';

class LoginLayout extends Component {

  routeChange=()=> {
    let path = `newPath`;
    let history = useHistory();
    history.push(path);
  }

  render() {
    return (
      <div className="app flex-row align-items-center">
        <Container>
          ...
          <Row>
            <Col xs="6">                      
              <Button color="primary" className="px-4"
                onClick={this.routeChange}
                  >
                  Login
                </Button>
            </Col>
            <Col xs="6" className="text-right">
              <Button color="link" className="px-0">Forgot password?</Button>
            </Col>
          </Row>
          ...
        </Container>
      </div>
    );
  }
}

export default LoginLayout;

avec React Router v4 :

import { withRouter } from 'react-router-dom';
import { Button, Card, CardBody, CardGroup, Col, Container, Input, InputGroup, InputGroupAddon, InputGroupText, Row, NavLink  } from 'reactstrap';

class LoginLayout extends Component {
  constuctor() {
    this.routeChange = this.routeChange.bind(this);
  }

  routeChange() {
    let path = `newPath`;
    this.props.history.push(path);
  }

  render() {
    return (
      <div className="app flex-row align-items-center">
        <Container>
          ...
          <Row>
            <Col xs="6">                      
              <Button color="primary" className="px-4"
                onClick={this.routeChange}
                  >
                  Login
                </Button>
            </Col>
            <Col xs="6" className="text-right">
              <Button color="link" className="px-0">Forgot password?</Button>
            </Col>
          </Row>
          ...
        </Container>
      </div>
    );
  }
}

export default withRouter(LoginLayout);

2 votes

Après avoir utilisé le code ci-dessus, je suis toujours sur la même page. Dois-je faire d'autres travaux que ceux-là ?

0 votes

Je suppose que non Avez-vous entouré votre composant de withRouter ?

0 votes

J'ai enveloppé mon composant avec withRouter . Il fonctionne parfaitement si j'utilise une seule ressource, par exemple pour l'itinéraire. /MyProfile . Mais cela n'a pas fonctionné lorsque j'ai utilisé /MyProfile/edit . Comment puis-je rediriger vers une ressource imbriquée ?

57voto

Waleed Qidan Points 85

N'utilisez pas un bouton comme lien. Utilisez plutôt un lien stylisé comme un bouton.

<Link to="/signup" className="btn btn-primary">Sign up</Link>

0 votes

J'ai eu une erreur, mais je ne sais pas si c'est lié, link is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.

4 votes

Mais ce n'est pas la question.

40voto

May Noppadol Points 56

React Router v5.1.2 :

import { useHistory } from 'react-router-dom';
const App = () => {
   const history = useHistory()
   <i className="icon list arrow left"
      onClick={() => {
        history.goBack()
   }}></i>
}

3 votes

J'ai déjà échoué sur la ligne 'const history = useHistory()' à cause de 'TypeError : Cannot read property 'history' of undefined'. Avez-vous utilisé quelque chose de react-router-dom dans votre index.js ?

19voto

J'ai essayé de trouver un moyen avec Redirect mais j'ai échoué. Rediriger onClick est plus simple qu'on ne le pense. Il suffit de placer le JavaScript de base suivant au sein de votre fonction onClick, pas d'entourloupe :

window.location.href="pagelink"

9 votes

Attention : Cela va recharger la page.

1 votes

Oui, cela va à l'encontre de l'objectif de l'utilisation de react pour faire une application à page unique, cela fera que tout votre code react devra être renvoyé etc etc (les choses comme l'historique seront probablement réinitialisées)

1voto

ouni Points 1671

Un simple gestionnaire de clic sur le bouton, et la mise en place de window.location.hash fera l'affaire, en supposant que votre destination se trouve également dans l'application.

Vous pouvez écouter le hashchange événement sur window analyse l'URL que vous obtenez, appelle this.setState() et vous avez votre propre routeur simple, aucune bibliothèque n'est nécessaire .

class LoginLayout extends Component {
    constuctor() {
      this.handlePageChange = this.handlePageChange.bind(this);
      this.handleRouteChange = this.handleRouteChange.bind(this);
      this.state = { page_number: 0 }
    }

  handlePageChange() {
    window.location.hash = "#/my/target/url";
  }

  handleRouteChange(event) {
    const destination = event.newURL;
    // check the URL string, or whatever other condition, to determine
    // how to set internal state.
    if (some_condition) {
      this.setState({ page_number: 1 });
    }
  }

  componentDidMount() {
    window.addEventListener('hashchange', this.handleRouteChange, false);
  }

  render() {
    // @TODO: check this.state.page_number and render the correct page.
    return (
      <div className="app flex-row align-items-center">
        <Container>
          ...
                <Row>
                  <Col xs="6">                      
                    <Button 
                       color="primary"
                       className="px-4"
                       onClick={this.handlePageChange}
                    >
                        Login
                     </Button>
                  </Col>
                  <Col xs="6" className="text-right">
                    <Button color="link" className="px-0">Forgot password </Button>
                  </Col>
                </Row>
           ...
        </Container>
      </div>
    );
  }
}

2 votes

L'utilisation de window.location n'est pas préférable pour quiconque cherche à maintenir une forme quelconque de SPA (single page application). Vous avez changé l'url du navigateur et effacé tout état, etc.

0 votes

Quand vous dites "anéantir n'importe quel état", qu'avez-vous à l'esprit, spécifiquement ? J'utilise location.hash ce qui n'entraînera pas de rechargement de la page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X