การตั้งค่า onSubmit ใน React.js


98

ในการส่งแบบฟอร์มฉันกำลังพยายามdoSomething()แทนที่พฤติกรรมการโพสต์เริ่มต้น

เห็นได้ชัดว่าใน React onSubmit เป็นเหตุการณ์ที่รองรับสำหรับฟอร์ม อย่างไรก็ตามเมื่อฉันลองใช้รหัสต่อไปนี้:

var OnSubmitTest = React.createClass({
    render: function() {
        doSomething = function(){
           alert('it works!');
        }

        return <form onSubmit={doSomething}>
        <button>Click me</button>
        </form>;
    }
});

วิธีdoSomething()นี้ถูกเรียกใช้ แต่หลังจากนั้นพฤติกรรมการโพสต์เริ่มต้นจะยังคงดำเนินการอยู่

คุณสามารถทดสอบนี้ฉันjsfiddle

คำถามของฉัน: ฉันจะป้องกันพฤติกรรมการโพสต์เริ่มต้นได้อย่างไร

คำตอบ:


119

ในคุณdoSomething()ฟังก์ชั่นผ่านในเหตุการณ์และการใช้งานee.preventDefault()

doSomething = function (e) {
    alert('it works!');
    e.preventDefault();
}

19
ในวันที่ v0.13 การส่งคืนเท็จจากตัวจัดการเหตุการณ์จะถูกละเว้นดังนั้นคุณจะต้องใช้ e.preventDefault () หรือ e.stopPropagation ()
joshuaegclark

1
ตามที่ได้รับคำตอบแล้วข้อหลังนี้เป็นที่ต้องการ
Henrik Andersson

ฉันคิดว่าคุณหมายถึงอดีต
Shark Lasers

@SharkLasers ความคิดเห็นนั้นเกิดขึ้นจากการแก้ไขโพสต์นี้ซึ่งไม่สามารถใช้ได้อีกต่อไป
Henrik Andersson

พอใช้คุณควรจะลบความคิดเห็นเมื่อไม่เกี่ยวข้องอีกต่อไป
Shark Lasers

47

ฉันขอแนะนำให้ย้ายตัวจัดการเหตุการณ์ออกนอกการเรนเดอร์

var OnSubmitTest = React.createClass({

  submit: function(e){
    e.preventDefault();
    alert('it works!');
  }

  render: function() {
    return (
      <form onSubmit={this.submit}>
        <button>Click me</button>
      </form>
    );
  }
});

1
นี่คือวิธีการที่เหมาะสมของการใช้รูปแบบในองค์ประกอบ :)
Holms


5

คุณสามารถส่งผ่านเหตุการณ์เป็นอาร์กิวเมนต์ไปยังฟังก์ชันแล้วป้องกันพฤติกรรมเริ่มต้น

var OnSubmitTest = React.createClass({
        render: function() {
        doSomething = function(event){
           event.preventDefault();
           alert('it works!');
        }

        return <form onSubmit={this.doSomething}>
        <button>Click me</button>
        </form>;
    }
});

2
ในกรณีของฉันมันใช้งานได้ทั้งแบบมีและไม่มีthis: {this.doSomething}หรือใช้ได้{doSomething}เพราะdoSomethingใช้ไฟล์render().
starikovs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.