Réagir onClick et preventDefault() lien d'actualisation/redirect?

je suis rendu un lien avec le moment de réagir:

render: ->
  `<a className="upvotes" onClick={this.upvote}>upvote</a>`

Alors, j'ai le upvote fonction:

upvote: ->
  // do stuff (ajax)

avant link j'avais span à cet endroit mais j'ai besoin de passer à link et voici le problème - chaque fois que je clique sur .upvotes la page est rafraîchie, ce que j'ai essayé jusqu'à présent:

événement.preventDefault () - ne fonctionne pas.

upvote: (e) ->
  e.preventDefault()
  // do stuff (ajax)

événement.stopPropagation () - Non travailler.

upvote: (e) ->
  e.stopPropagation()
  // do stuff (ajax)

retour faux - pas de travail.

upvote: (e) ->
  // do stuff (ajax)
  return false

j'ai aussi essayé tout ce qui précède en utilisant jQuery dans mon index.html, mais rien ne semble fonctionner. Que dois-je faire ici et ce que je fais mal? J'ai vérifié l'événement.type et c'est click donc je suppose que je devrais être capable d'éviter de rediriger d'une façon ou d'une autre?

Excusez-moi, je suis un novice quand il s'agit de Réagir.

Merci!

41
demandé sur Wordpressor 2016-03-30 21:28:34

11 réponses

les événements React sont en fait des événements synthétiques, pas des événements natifs. Comme il est écrit ici:

délégation D'événement: React ne fixe pas les gestionnaires d'événements aux noeuds eux-mêmes. Lorsque React démarre, il commence à écouter tous les événements au niveau supérieur en utilisant un seul écouteur d'événements. Lorsqu'un composant est monté ou démonté, les gestionnaires d'événements sont simplement ajoutés ou supprimés à partir d'un mappage interne. Lorsqu'un événement se produit, Réagir sait comment expédition à l'aide de cette cartographie. Lorsqu'il ne reste plus de manipulateurs d'événements dans la cartographie, les manipulateurs D'événements de React sont de simples no-ops.

Essayez d'utiliser Utilisez Event.stopImmediatePropagation:

upvote: (e) ->
  e.stopPropagation();
  e.nativeEvent.stopImmediatePropagation();
34
répondu Alexandr Lazarev 2016-03-30 20:42:02

une version complète de la solution enveloppera la méthode upvotes à l'intérieur d'onClick, passer e et utiliser l'E. natif.preventDefault ();

upvotes = (e, arg1, arg2, arg3 ) => {
    e.preventDefault();
    //do something...
}

render(){
    return (<a type="simpleQuery" onClick={ e => this.upvotes(e, arg1, arg2, arg3) }>
      upvote
    </a>);
{
32
répondu Roman 2018-08-31 05:17:04

essayez de lier(ce) de sorte que votre code ressemble à ci-dessous --

 <a className="upvotes" onClick={this.upvote.bind(this)}>upvote</a>

si vous écrivez dans l'es6 réagir composant dans le constructeur, vous pourriez faire ceci

constructor(props){
   super(props);
   this.upvote = this.upvote.bind(this);
}

upvote(e){   // function upvote
   e.preventDefault();
   return false

}
14
répondu deepak prakash 2016-09-22 12:44:33

rendu: -> <a className="upvotes" onClick={(e) => {this.upvote(e); }}>upvote</a>

6
répondu xjinjin 2017-03-07 03:46:36

Le Résumé que j'ai trouvé et qui fonctionne pour moi:

const DummyLink = ({onClick, children, props}) => (
    <a href="#" onClick={evt => {
        evt.preventDefault();
        onClick && onClick();
    }} {...props}>
        {children}
    </a>
);

Crédit pour srph https://gist.github.com/srph/020b5c02dd489f30bfc59138b7c39b53

1
répondu TheFullResolution 2016-11-06 13:17:56

C'est parce que ces gestionnaires ne préservent pas la portée. De la documentation react:réagir documentation

Vérifiez la section "pas d'autobinding". Vous devriez écrire le gestionnaire comme: onClick = () = > {}

0
répondu viktor 2016-09-22 11:49:01

Si vous utilisez la case à cocher

<input 
    type='checkbox'
    onChange={this.checkboxHandler}
/>

stopPropagation et stopImmediatePropagation ne fonctionne pas.

parce que vous devez utiliser onClick={présent.checkboxHandler}

0
répondu роман пономарев 2017-12-07 15:13:06

si vous utilisez React Router, je vous suggérerais de regarder dans la bibliothèque react-router-bootstrap qui a un composant très pratique LinkContainer. Ce composant empêche le rechargement par défaut de la page pour que vous n'ayez pas à gérer l'événement.

Dans votre cas, il pourrait ressembler à quelque chose comme:

import { LinkContainer } from 'react-router-bootstrap';

<LinkContainer to={givePathHere}>
    <span className="upvotes" onClick={this.upvote}>upvote</span>
</LinkContainer>
0
répondu iggirex 2018-04-06 21:14:12

j'ai eu quelques problèmes avec l'ancre et balises preventDefault dans le passé, et j'oublie toujours ce que je fais mal, alors, voici ce que j'ai compris.

Le problème que j'ai souvent, c'est que j'essaie d'accéder aux attributs de composant en déstructurant directement comme avec les autres composants de réaction. Cela ne fonctionne pas, la page se rechargera même e.preventDefault():

function (e, { href }) {
  e.preventDefault();
  // Do something with href
}
...
<a href="/foobar" onClick={clickHndl}>Go to Foobar</a>

Il semble que la déstructuration provoque une erreur (Cannot read property 'href' of undefined) qui n'est pas affiché sur la console, probablement en raison du rechargement complet de la page. Comme la fonction est en erreur, le preventDefault ne se fait pas appeler. Si href est #, l'erreur s'affiche correctement puisqu'il n'y a pas de recharge réelle.

je comprends maintenant que Je ne peux accéder aux attributs qu'en tant qu'argument de second handler sur les composants custom React, pas sur les balises HTML natives. Donc bien sûr, pour accéder à un attribut de balise HTML dans un événement, ce serait la façon:

function (e) {
  e.preventDefault();
  const { href } = e.target;
  // Do something with href
}
...
<a href="/foobar" onClick={clickHndl}>Go to Foobar</a>

j'espère cela aide d'autres personnes comme moi perplexes par des erreurs non montrées!

0
répondu DSav 2018-05-08 12:52:10

je n'ai pas trouvé d'options mentionnées à corriger ou travailler pour moi, quand je suis venu à cette page. Ils m'ont donné des idées pour tester les choses et j'ai découvert que ça marchait pour moi.

dontGoToLink(e) {
  e.preventDefault();
 }

render() {
  return (<a href="test.com" onClick={this.dontGoToLink} />});
}
0
répondu Iwnnay 2018-08-30 19:18:06

Dans un contexte comme celui-ci

function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

Comme vous pouvez le voir, vous devez appeler preventDefault() explicitement. Je pense que docs, pourrait être utile.

0
répondu Fabien Sartori 2018-09-02 22:16:31