2015-05-27 15 views
6

Vì một số lý do, trình xử lý onClick của tôi đang thêm tham số truy vấn trống vào url của tôi khi tôi nhấp vào chúng. Tôi đã có thể khắc phục vấn đề bằng cách thêm event.preventDefault vào trình xử lý sự kiện của mình nhưng tôi muốn hiểu rõ hơn những gì thực sự đã xảy ra và nếu đây là giải pháp đúng. Đối với ngữ cảnh, mã dưới đây là một thành phần đơn giản để kiểm tra một số chức năng OAuth 2. Trình xử lý onClick chỉ kích hoạt hành động hồi lưu. Bạn sẽ thấy tôi đã thêm e.preventDefault() vào tất cả chúng. Nếu không có sửa chữa đó, bất cứ lúc nào tôi kích hoạt một trong những chức năng url của tôi sẽ thay đổi từ http://localhost:3000/#/signIn đến http://localhost:3000/?#/signIn. Tôi cũng đang sử dụng bộ phản ứng-router.Tại sao sự kiện onClick phản ứng lại gắn dấu chấm hỏi vào url của tôi?

// 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; 

Trả lời

17

Loại mặc định của thẻ buttonsubmit có nghĩa là nhấp vào button sẽ gửi biểu mẫu của bạn (thêm ? vào url của bạn).

Để khắc phục ví dụ của bạn, bạn có thể thêm type="button" để nút của bạn &/hoặc thay thế của bạn <form> với một <div>/<span> (vì mã của bạn không thực sự dường như cần các yếu tố form).

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

Giá trị có thể là:

  • nộp: Nút nộp dữ liệu mẫu đến máy chủ. Đây là mặc định nếu thuộc tính không được chỉ định hoặc nếu thuộc tính là
    được thay đổi động thành giá trị trống hoặc không hợp lệ.
  • đặt lại: Nút đặt lại tất cả các điều khiển về giá trị ban đầu của chúng.
  • Nút
  • : Nút không có hành vi mặc định. Nó có thể có các kịch bản phía máy khách được liên kết với các sự kiện của phần tử, được kích hoạt khi các sự kiện xảy ra.
+0

Cảm ơn. Điều này cực kỳ hữu ích. – Constellates

6

Tôi khá chắc chắn vì bạn đang chụp một nút từ biểu mẫu, không có ngăn chặnDefault() biểu mẫu đang đăng. Vì không có đầu vào nào trong biểu mẫu nên không có tham số truy vấn. Vì biểu mẫu không chỉ định phương thức POST, nó đang thực hiện một yêu cầu lấy lại chính nó, đó là thêm một chuỗi truy vấn trống. Với preventDefault() bạn đang dừng hành động gửi biểu mẫu.

Các vấn đề liên quan