2017-02-09 2 views
0

Ich habe die folgende Reaktion Komponente:React Strippen Onclick

class PlayerRow extends Component { 
    activateKey(){ 
     $(this).addClass('active') 
} 
render() { 

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

} 
} 

Ich versuche, die Funktion activatekey auf Klick auf der verschachtelten divs durchzuführen, aber wenn ich die App machen aus meinem Onclick-Attribut wird gezupft von allen divs. Warum sollte das sein?

+0

Es gibt keinen Grund, warum die 'onclick'-Eigenschaft im DOM vorhanden sein sollte. Dynamisch angehängte Hörer sind bei der Inspektion nicht unbedingt sichtbar. Funktionieren die Klickhandler? Läuft der Code? Versuchen Sie, auf eines der divs zu klicken. Beachten Sie, dass 'activateKey' möglicherweise' .bind (this) 'benötigt. Die Kombination von React und jQuery ist auch nicht meine Empfehlung – slezica

+0

Warum ermutigen Sie nicht die Verwendung von jQuery mit React? Auch warum reagiert strip out onclick und es ist nicht von normalem HTML entfernt? –

+1

React übernimmt die Handhabung des DOM. Wenn Sie das DOM berühren, können Sie mit React konkurrieren und React gewinnt. Es wird die Freiheit nehmen, DOM-Elemente beliebig zu entfernen, hinzuzufügen und zu modifizieren und möglicherweise Ihre Änderungen zu überschreiben. Wenn Sie React verwenden möchten, ist der sicherste Kurs, jQuery laufen zu lassen. Dieses Beispiel (das "onclick" -Attribut "verschwindet") ist nur eine der vielen, vielen Möglichkeiten, in denen React das DOM abstrahiert – slezica

Antwort

1

React bindet Ereignis-Listener selbst, so dass onClick nicht direkt zum onclick-Attribut in DOM führt. Ihr Code funktioniert jedoch (siehe Snippet). obwohl

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>

Ich schlage vor, zwei Dinge, verwenden .bind(this) für Action-Handler oder noch besser, mit dem Pfeil Funktion als es Anwendungsbereich standardmäßig erbt.

Von reagieren docs:

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

siehe: https://facebook.github.io/react/docs/handling-events.html

zweite Sache - nicht jQuery verwenden. Sie verwenden React, um DOM zu verwalten, und jQuery erzeugt standardmäßig Nebeneffekte, die die Reaktion beeinträchtigen. React rendert die Ansicht entsprechend dem Status oder den Requisiten der Komponente automatisch, mit ihren Optimierungen, die großartig sind, und jQuery bearbeitet weder Requisiten noch Status, so dass Sie die coolen Sachen der Reaktion nicht nutzen.

Für was Sie erreichen möchten, könnten Sie Ihrem Action-Handler einen Parameter geben, der Ihnen sagt, welcher Block geklickt wurde onClick={() => activateKey(1)}. Im Handler speichern Sie die aktive ID im lokalen Status und geben Sie Ihren Blöcken die Klasse bedingt, abhängig davon, ob ihre ID mit der Schlüssel-ID übereinstimmt. Das ist meine Idee.

+0

gut erklärt und alles klar. Vielen Dank –

0

Die Verwendung der ES6-Pfeilfunktion oder .bind() in der Rendermethode fügt Ihren Komponenten unnötigen Overhead hinzu. .bind (this) wirklich sollten Sie auf Ihre Methoden im Konstruktor wie solche:

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> 
     ); 
    } 
} 

Wenn Sie dies tun, wird die Bindeoperation nur einmal pro Methode während der Klasse Initialisierungsphase durchgeführt. Wenn Sie in Ihrer Rendermethode ES6-Pfeilfunktionen oder .bind (this usw.) verwenden, wird die Bindung von jedem Element mit einem onClick-Ereignis bei jedem erneuten Rendern ausgeführt.

Die einzige Zeit, die Sie verwenden sollten .bind (diese, etc ..) oder eine ES6-Pfeil-Funktion innerhalb der Rendermethode ist, wenn Sie etwas anderes als ein Klickereignis an eine Funktion übergeben müssen.