2017-02-09 4 views
0

は、コンポーネントが反応しますすべての部門のこれはなぜでしょうか?を除去反応onclickの私は、次のしている

+0

DOMに 'onclick'プロパティが存在する必要はありません。動的に接続されたリスナーは、検査時に必ずしも表示されるとは限りません。クリックハンドラーは機能しますか?コードは実行されていますか? divの1つをクリックしてみてください。 'activateKey'は' .bind(this) 'を必要とすることに注意してください。 ReactとjQueryの組み合わせも私の推奨ではありません – slezica

+0

なぜReactでjqueryでの使用を推奨していませんか?また、なぜ反応がonclickから外に出るのですか?それは通常のhtmlから取り除かれていませんか? –

+1

ReactはDOMの処理を引き継ぎます。あなたがDOMに触れると、あなたはReactと競合し、Reactが勝つでしょう。 DOM要素の削除、追加、変更を自由に行うことができます。変更を上書きすることもできます。 Reactを使用する予定がある場合、最も安全なコースはjQueryを実行させることです。この例( 'onclick'属性が「消える」という属性)は、ReactがDOMを捨て去る多くの方法のうちの1つにすぎません。 – slezica

答えて

1

Reactはイベントリスナー自身をバインドします。したがって、onClickはDOMのonclick属性に直接影響しません。しかし、あなたのコードは実際に動作します(スニペット参照)。

class PlayerRow extends React.Component { 
 
    activateKey() { 
 
     console.log('ddd') 
 
} 
 
render() { 
 

 
    return (
 
       <div className="row-par"> 
 
        <div className="details-cont"> 
 
        </div> 
 
        <div className="key-cont"> 
 
         <div onClick={this.activateKey} className="key">asd</div> 
 
         <div onClick={this.activateKey} className="key">qwe</div> 
 
         <div onClick={this.activateKey} className="key">zxc</div> 
 
        </div> 
 
       </div> 
 
     ) 
 

 
} 
 
} 
 

 
ReactDOM.render(
 
    <PlayerRow/>, 
 
    document.getElementById('container') 
 
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id="container"> 
 
    <!-- This element's contents will be replaced with your component. --> 
 
</div>

でも、私は2つのことを示唆して、アクションハンドラまたはより良いため.bind(this)を使用し、それがデフォルトでスコープを継承するよう矢印関数を使用します。

handleClick =() => { 
    console.log('this is:', this); 
} 

項目: - jQueryのを使用していないhttps://facebook.github.io/react/docs/handling-events.html

セカンド事

からは、ドキュメントを反応させます。あなたはReactを使ってDOMを管理しています.jQueryはデフォルトで副作用を発生させるので、反応の仕方に干渉します。 Reactはコンポーネントの状態や小道具に応じてビューを自動的にレンダリングします。最適化は素晴らしいですし、jQueryは小道具も状態も編集しないので、反応のクールなものは利用しません。

あなたが達成したいことについては、どのブロックがクリックされたかを示すパラメータをアクションハンドラに与えることができます。onClick={() => activateKey(1)}ハンドラでは、アクティブなIDをローカル状態で保存し、IDがキーIDと一致するかどうかによってブロックを条件付きで与えます。それが私の考えです。

+0

もよく説明されており、すべてクリアです。ありがとうございました –

0

renderメソッドでES6矢印関数または.bind()を使用すると、不要なオーバーヘッドがコンポーネントに追加されます。あなたがこれを行う場合は、バインド操作が唯一のクラスの初期化フェーズ中に一度メソッドごとに行われる

import React, { Component } from "react"; 

export default class Demo extends Component { 
    constructor(props) { 
     super(props); 

     this.activateKey = this.activateKey.bind(this); 
    } 

    activateKey() { 
     console.log("ddd"); 
    } 

    render() { 

     return (
      <div className="row-par"> 
       <div className="details-cont"></div> 
       <div className="key-cont"> 
        <div onClick={this.activateKey} className="key">asd</div> 
        <div onClick={this.activateKey} className="key">qwe</div> 
        <div onClick={this.activateKey} className="key">zxc</div> 
        </div> 
       </div> 
     ); 
    } 
} 

:あなたは本当に、このようなのようなコンストラクタで、あなたの方法に(これを).bind必要があります。レンダリングメソッドの中でES6の矢印関数または.bind(thisなど..)を使用すると、すべての再レンダリングでonClickイベントを持つ各要素からバインディングが実行されます。

クリックイベントだけを関数に渡す必要がある場合は、.bind(thisなど..)やrenderメソッドのES6矢印関数を使用する必要があります。

関連する問題