2016-12-01 4 views
1

私はtextareaMsgInputコンポーネントを持っていますonKeyUpは、ハンドラ関数をトリガします。ハンドラ関数の中で、私はthis.propsを使って小道具を読むことを試みますが、なぜ小道具がここで定義されていないのか分かりません。もちろん、作業場はです。このオブジェクトは、レスキューコンポーネントES6クラスを使用して

+0

の可能な重複[未定義はthis.stateを評価する目的ではない/ this.props](http://stackoverflow.com/questions/40774399/undefined-is-not-an-object-evaluating-this -state-this-props) – Pineda

+0

トランスフォームを使用している場合は、 '@ autobind'デコレータを確認してください:https://www.npmjs.com/package/core-decorators#autobind –

答えて

3

ES6クラスに反応すると、コールバックがコンポーネントインスタンスに自動的にバインドされないため、既に行ったように自分で行う必要があります。それ以外の場合は、thisはコールバックで使用できません。


this.inputHandler.bind(this) 

これは周りの仕事が、可能になっている方法ではありません。

もう1つの方法は、自動的にthisをバインドするES6矢印機能を使用することです。

<textarea onKeyDown={(e) => this.inputHandler(e)}></textarea> 

警告:あなたJSX内.bindまたは矢印の機能を使用するには、すべてのパフォーマンスの障害となっているレンダリングの新しい関数を作成します。

最後の手段として、矢印関数のパフォーマンス上のペナルティを持たないコンストラクタ内のメソッドをバインドできます。

constructor(props) { 
    super(props); 
    this.inputHandler = this.inputHandler.bind(this); 
} 
+0

と矢印機能用のデコレータ。バインドの呼び出しは私にとって面倒だった –

+0

良い、ありがと; ;-)それは物事をクリアする場合は、答えを受け入れることができます。 – lustoykov

+0

すべてのレンダリングで新しい関数を作成するのはなぜですか?私はむしろ 'コンストラクタ'の中に '.bind'をしたいと思います。 –

関連する問題