2016-03-09 6 views
5

は、私は、フォームのonSubmit検証を使用する場合this.propsがスコープ内にないいくつかの理由をonSubmit機能React form onSubmit関数でスコープが設定されていないのはなぜですか?私のリアクトコンポーネントで

<form className="form-horizontal" name="taskForm" onSubmit={this.submitTask}>

submitTask(e) { 

    e.preventDefault(); 
    console.log(this.props); // undefined 
    console.log(this) // window object 
} 

とフォームを持っています。コンストラクター内のI console.log(this.props)を実行すると、propsは正常にログアウトします。

I console.log(this)これはウィンドウオブジェクトです。どのように反応成分の範囲を取得するのですか?

+3

'をonSubmit = {this.submitTask:関数を矢印submitTaskコンテンツを渡すことができ、矢印関数で

<form className="form-horizontal" name="taskForm" onSubmit={this.submitTask.bind(this)}> 

.bind(this)} '。 ** [リンク](http://reactkungfu.com/2015/07/why-and-how-to-bind-methods-in-your-react-component-classes/)**。 –

+3

Tahirは正しいですが、レンダリングを呼び出すたびにバインドするのではなく、あなたのコンストラクタに関数をバインドすることをお勧めします。バインドされていない別の方法は 'onSubmit = {event => this.submitTask(event、this.props)}' – azium

+1

です。@ aziumの応答は正しい答えでなければなりません...あなたは小道具、関数、そしてすべてに完全にアクセスできます。 – Mussser

答えて

6

あなたは、たとえば、他のコンポーネントのイベントを使用する場合、これと同様の振る舞いはあなたがわかりますので、これはノートでは、それについてそこにあるドキュメントで(onClickの、のonChange、をonSubmit)

、より広範な問題です:

https://facebook.github.io/react/docs/reusable-components.html#no-autobinding

メソッドは、通常のES6クラスと同じセマンティクスに従います。つまり、メソッドは自動的にこれをインスタンスにバインドしません。 .bind(this)または矢印関数=>を明示的に使用する必要があります。

説明したように、これらの方法をバインドするか、矢印機能を使用する必要があります。 バインディングを選択すると、コンストラクタでバインドすることも、レンダリングされたコンポーネントで厳密にバインドすることもできます。レンダリングコンポーネントで

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

:コンストラクタで

<form className="form-horizontal" name="taskForm" onSubmit={e => { 
    e.preventDefault(); 
    console.log(this.props); // undefined 
    console.log(this) // window object 
}}> 
関連する問題