2015-05-27 3 views
6

Aus irgendeinem Grund fügen meine onClick-Handler einen leeren Abfrageparameter zu meiner URL hinzu, wenn ich darauf klicke. Ich konnte das Problem beheben, indem ich event.preventDefault zu meinen Event-Handlern hinzufügte, aber ich würde gerne besser verstehen, was tatsächlich passiert ist und ob dies die richtige Lösung war. Für den Kontext ist der folgende Code eine einfache Komponente zum Testen einiger OAuth 2-Funktionen. Die onClick-Handler lösen gerade eine Rückflussaktion aus. Du wirst sehen, dass ich e.preventDefault() allen hinzugefügt habe. Ohne diesen Fix ändert sich meine URL von http://localhost:3000/#/signIn zu http://localhost:3000/?#/signIn, wenn ich eine dieser Funktionen auslöst. Ich benutze auch react-router.Warum hängt ein onClick Event-Ereignis ein Fragezeichen an meine URL an?

// dependencies ------------------------------------------------------- 

import React from 'react'; 
import hello from '../../libs/hello'; 
import Actions from '../../actions/Actions'; 
import UserStore from '../../stores/userStore'; 

var Signin = React.createClass({ 

// life cycle events -------------------------------------------------- 

    componentDidMount: function() { 

    }, 

    render: function() { 
     return (
      <form> 
       <h2>Sign in with Google</h2> 
       <button className="btn btn-primary" onClick={this._signIn} > 
        <i className="fa fa-google" /> 
        <span> Google</span> 
       </button> 
       <button className="btn btn-info" onClick={this._logToken} >Log Token</button> 
       <button className="btn btn-warning" onClick={this._signOut}>Sign Out</button> 
      </form> 
     ); 

    }, 

// custom methods ----------------------------------------------------- 

    _signIn: function (e) { 
     e.preventDefault(); 
     Actions.signIn(); 
    }, 

    _signOut: function (e) { 
     e.preventDefault(); 
     Actions.signOut(); 
    }, 

    _logToken: function (e) { 
    // e.preventDefault(); 
     Actions.logToken(); 
    } 

}); 

export default Signin; 

Antwort

17

Der Standardtyp eines button Tag ist submit was bedeutet, dass die button klicken, wird das Formular (Anfügen der ? zu Ihrer URL) einreichen.

Ihrem Beispiel zu beheben, Sie type="button" auf Ihre Tasten &/oder ersetzen Sie <form> mit einem <div>/<span> (da Ihr Code das form Element muss nicht wirklich scheinen) hinzufügen können.

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button

Mögliche Werte sind:

  • einreichen: Die Schaltfläche legt dem Server die Formulardaten. Dies ist der Standardwert, wenn das Attribut nicht angegeben ist oder wenn das Attribut
    dynamisch in einen leeren oder ungültigen Wert geändert wird.
  • reset: Die Schaltfläche setzt alle Steuerelemente auf ihre Anfangswerte zurück.
  • Schaltfläche: Die Schaltfläche hat kein Standardverhalten. Es können clientseitige Skripts mit den Ereignissen des Elements verknüpft sein, die beim Auftreten der Ereignisse ausgelöst werden.
+0

Dank. Das war sehr hilfreich. – Constellates

6

Ich bin ziemlich sicher, dass da Sie den Klick auf eine Schaltfläche aus einem Formular erfassen, ohne die prevent() das Formular veröffentlichen wird. Da im Formular keine Eingaben vorhanden sind, gibt es keine Abfrageparameter. Da das Formular die POST-Methode nicht angibt, führt es eine Abrufanforderung an sich selbst aus, die eine leere Abfragezeichenfolge hinzufügt. Mit preventDefault() stoppen Sie die Formularübergabeaktion.

Verwandte Themen