2017-09-28 14 views
1

私は以下の配列マップメソッドを使用して画像URLの配列を反復処理し、img srcでJSXを返します。反応onClick JSX関数から返された

理想的には、各画像にクリックしてバインドしたいので、この(クリックした)img srcを後で還元することができます。

以下、私にエラーを与える:「未定義のプロパティを読み取ることができません 『changeImg』」

<div className="gallery-thumbs"> 
     { galleryImages.map(function(img, index){ 
     return <img 
       key={ img } 
       className="thumb-product-img" src={ img } 
       onClick={ this.changeImg.bind(this) } />; 
     }) } 
    </div>  

しかし、私はそれは私にエラーを与えないレベルをonClickのを上に移動...唯一の問題は、この文脈が失われることです。

<div className="gallery-thumbs" onClick={ this.changeImg.bind(this) }> 
     { galleryImages.map(function(img, index){ 
     return <img 
       key={ img } 
       className="thumb-product-img" src={ img } />; 
     }) } 
    </div> 

tl:dr;私のレンダリングメソッドの外で返されたJSXへのクリックをバインドする方法はありますか?

答えて

1

あなたが変更した場合、それはおそらく動作します:

<div className="gallery-thumbs"> 
     { galleryImages.map((img, index) => { //arrow function 
     return <img 
       key={ img } 
       className="thumb-product-img" src={ img } 
       onClick={ this.changeImg.bind(this) } />; 
     }) } 
    </div> 

私はmapと配列を反復処理しているときにコンテキストを失うと仮定します。 functionからarrowへの簡単な変更はおそらくトリックを行います。

Hereについては、arrowの機能とイベントハンドラなどとしてのその使用についての詳細を読むことができます。

+0

ありがとうございます - これで解決しました。矢印機能を使うことを忘れないでください! – Myles

+0

@Myles 'this.changeImg.bind(this)'から、私はそれらの関数をあなたのコンポーネントにバインドしていないと仮定します:あなたのコンポーネントで関数を定義するときはいつでも、それらを以下のように定義することができます: 'myFunction =()=> {this.changeImg = changeImg.bind(this); 'あなたは' this.changeImg = changeImg.bind(this); 'を呼び出すことができます。毎回それを束縛する。あなたが私に尋ねると、 'arrow'関数はよりスムーズになります:) – Nocebo

1

これは、語彙コンテキストthisundefinedであることを意味します。 strictモード(これはesモジュールのデフォルトモード)で関数呼び出しの中で使用する場合です。

<div className="gallery-thumbs"> 
    { galleryImages.map((img, index) => { 
    return <img 
      key={ img } 
      className="thumb-product-img" src={ img } 
      onClick={ e => this.changeImg(e) } />; 
    }) } 
</div>  

矢印関数の構文は、その本体にthisを呼び出すことを意味し、語彙のコンテキストを持っていない新しい機能を作成します。あなたは何ができるか

は、コンポーネントクラスのrenderメソッド内であり、あなたのケースであなたのコンポーネントである親のレキシカルコンテキストを参照します。

イメージのsrc属性が明確に識別されているため、最適化として新しいハンドラを作成せず、汎用のものを作成することができます。

<div className="gallery-thumbs"> 
    { 
     galleryImages.map(function(img, index){ 
     return <img 
      key={ img } 
      className="thumb-product-img" src={ img } 
      onClick={ this.changeImg.bind(this) } />; 
     }, this) 
    } 
</div> 

map機能がcallbackを実行するときに、このように使用するValueになります二番目の引数を取る:@Noceboは、あなたも、このようなマップ機能を使用することができます言ったよう

const handle = e => this.changeImg(e.currentTarget.src); 
<div className="gallery-thumbs"> 
    { galleryImages.map((img, index) => { 
    return <img 
      key={ img } 
      className="thumb-product-img" src={ img } 
      onClick={ handle } />; 
    }) } 
</div>  
+0

こんにちは、これはありがたいことです。私はあなたの思考が好きです、ちょうど私が必要なものを渡すだけ! – Myles

1

あなたはarrow functionを使用することができます

関連する問題