2017-08-21 16 views
0

Enterキーを押したときにフォームを送信したいのですが、私の機能であるonSubmit={() => this.onSearchClick(this)}を使用すると、フォームをすべて実行する必要があります。私がする必要があるのは、API呼び出しを行う関数を実行させることだけです。ReactJsフォームEnterキーを押して送信

私のコードは、ブラウザとの相互作用からフォームを防ぎ、あなたが内部行うことができます。この

doSearch() { 
    this.setState({ 
     loading: true, 
     showCourtesy: false 
    }, function() { 

    }); 
    var search_url = "http://10.0.2.31/testwebapi/api/data?" 
     + "forename=" + this.state.forename 
     + "&surname=" + this.state.surname 
     + "&caseid=" + this.state.caseid 
     + "&postcode=" + this.state.postcode 
     + "&telephone=" + this.state.telephone 
     + "&email=" + this.state.email 
     + "&title=" + this.state.title 

    var _this = this; 
    this.serverRequest = 
     axios 
      .get(search_url 
      ) 
      .then(function (res) { 
       _this.state.searchResults = res.data; 
       _this.setState({ 
        loading: false, 
       }) 
       console.log(res) 
      }) 
      .catch(function (error) { 
       console.log(error); 
       window.alert("Unauthorized To Access This Please Contact IT If You Believe You Should Be") 
      }) 
} 
+1

サブミットリスナーに 'event.preventDefault()'を入れて、イベントオブジェクトを引数として渡す必要があります。 'onSubmit = {e => {this.onSearchClick(this); e.preventDefault(); }} ' – pawel

+0

@pawel私はそれを入力またはフォームに入れますか? –

+0

@andywilson 'onSubmit'リスナーは' form'に行きます。 – pawel

答えて

1

submitイベントを再開するにはevent.preventDefaultメソッドに電話する必要があります。

あなたはこのように、インラインそれを追加することができます。

<form onSubmit={ e => { this.onSearchClick(this); e.preventDefault(); }}></form> 

onSearchClickメソッドへのコンポーネントへの参照を渡しますが、あなたのコードからそれが見え、ちょうどあなたの元のコードのように、上記の点に注意してくださいメソッドのように文字列が必要です。しかし、これはこの質問の範囲外です。

また、最初の引数としてイベントを受け入れるようにonSearchClickメソッドをリファクタリングすることができます

onSearchClick = (event, value) => { 
    this.setState({ 
    loading: true, 
    searchQuery: value, 
    showCourtesy: false, 
    }, function() { 
     this.doSearch(); 
    }); 
    event.preventDefault(); 
} 

<form onSubmit={ this.onSearchClick.bind(this) }></form> 

は再び、 valueが渡されることはありません。 refsを使用してクエリ入力フィールドへの参照を保持することをお勧めします。値は this.refs.query.valueです。

+0

Arrow関数は自動的に 'this'にバインドされるので、バインディングは必要ありません。 「ベストソリューション:ES2015 Arrow Functions」を参照してください。https://medium.com/komenco/react-autobinding-2261a1092849 – Purgatory

+0

@Purgatoryあなたは正しいです(よく、それらは 'bind'を必要としないだけでなく、別のコンテキスト)。コードから、コンポーネントのメソッドとして定義されていると思って、関数名の後に ':'の代わりに '='がありません。それ以外の場合は、メソッドがアタッチされている「this」が何であるかわかりませんが、グローバルオブジェクトである可能性もあります。 – pawel

+0

合意しました、私は 'onSearchClick'関数が' Component'クラスのコンテキストにあったと信じていましたが、 'onSubmit = {this.onSearchClick}'を実行しても安全です両方の状況で働きます。 – Purgatory

1
<form onSubmit={() => this.onSearchClick(this)}> .... 

onSearchClick(event) { 
    event.preventDefault() 
    /* do stuff here */ 
} 

event.preventDefault()関数を呼び出し、この

<form> 
     <h1>Search</h1> 
     <hr /> 
     <TextField floatingLabelText="Case ID" name="caseid" onChange={this.handleChange} /> 
     <br /> 
     <TextField floatingLabelText="Title" name="title" value={this.state.title} onChange={this.handleChange} /> 
     <br /> 
     <TextField floatingLabelText="Forename" name="forename" value={this.state.forename} onChange={this.handleChange} /> 
     <br /> 
     <TextField floatingLabelText="Surname" name="surname" value={this.state.surname} onChange={this.handleChange} /> 
     <br /> 
     <TextField floatingLabelText="Postcode" name="postcode" value={this.state.postcode} onChange={this.handleChangePost} /> 
     <br /> 
     <TextField floatingLabelText="Telephone Number" name="telephone" onChange={this.handleChange} /> 
     <br /> 
     <TextField floatingLabelText="Email Address" name="email" value={this.state.email} onChange={this.handleChange} /> 
     <br /> 
     {this.state.isLoggedIn ? <RaisedButton label="Search" onClick={() => this.onSearchClick(this)} primary={true} /> : <RaisedButton label="Search Disabled" primary={true} />} 
     &nbsp;&nbsp; 
     {this.state.isLoggedIn ? <RaisedButton label="New Entry" onClick={() => this.gotoNew()} primary={true} /> : <RaisedButton label="New Entry" primary={true} />} 
</form> 

onSearchClick = (value) => { 
    this.setState({ 
     loading: true, 
     searchQuery: value, 
     showCourtesy: false, 
    }, function() { 
     this.doSearch(); 
    }); 
} 

ですAPI呼び出しなど

+0

を選択します。この場合、 'this'は' event'オブジェクトではなく、 'preventDefault'メソッドを持たないでしょう。 – pawel

関連する問題