2015-02-24 10 views
8

ottengo questo avvertimento da reactJS.NETbind(): si sta vincolando un metodo componente al componente. React fa questo automaticamente?

bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See LikeCon

Componente assomiglia a questo

var LikeCon = React.createClass({ 
    handleClick: function() { 
      var data = new FormData(); 
      var like = !this.state.like; 
      var likeCounter = this.state.likeCount; 

      data.append("catgoryType", this.state.categoryKey); 
      data.append("objectId", this.state.objectId); 
      data.append("like", like); 

      if(like) 
       likeCounter++; 
      else 
       likeCounter--; 

      this.setState({ like: like, likeCount: likeCounter, userId: this.state.userId, categoryKey: this.state.categoryKey, objectId: this.state.objectId}); 

      var xhr = new XMLHttpRequest(); 
      xhr.open("post", "http://localhost:2215/Home/SetLike", true); 
      xhr.onload = function() { 
     }; 
     xhr.send(data); 
    }, 
    getInitialState: function() { 
     return { like: this.props.initialLike, likeCount: this.props.initialLikeCount, userId: this.props.userId, categoryKey: this.props.categoryKey, objectId: this.props.objectId }; 
    }, 
    render(){ 
     return this.renderLikeButton() 
    }, 
    renderLikeButton(){ 
     return (
       content = 
       <div className="likeCon"> 
        <div className={this.state.like==true ? "likeButConAct" : "likeButCon"}> 
         <div className="likeB" title={this.state.like==true ? "Unlike" : "Like"} onClick={this.handleClick.bind(this)} > 
          &nbsp; 
         </div> 
         { this.state.likeCount > 0 ? <div className="likeCount">{this.state.likeCount}</div>: null} 

        </div> 
       </div> 
      ); 
    } 
}) 

I utilizza un vicolo cieco quando si chiama il metodo handleClick, Se rimuovo questo mi metterò un'altra eccezione? Quindi cosa dovrei fare?

+0

Qual è l'altra eccezione? – Mark

+0

Se rimuovo .bind, viene visualizzato Errore durante il rendering di "FeedBox" su "react1": ReferenceError: FormData non è definito – Banshee

+3

Dove è definito FormData? –

risposta

5

Passaggio *.bind(null,this) invece;

Vedere this Google Groups thread per la spiegazione.

+3

Questa è principalmente una risposta di solo collegamento. Si prega di includere le parti rilevanti della pagina collegata in modo che la risposta possa essere ancora compresa quando il collegamento viene interrotto. –

+0

Se l'associazione 'null' a' handleClick', come puoi aspettarti che 'this.setState()' funzioni in 'handleClick',' this' si riferisce a 'null' dal mio punto di vista – Guigui

0

Rimuovi "content =" o creare un div involucro:

<div>  content = 
      <div className="likeCon"> 
       <div className={this.state.like==true ? "likeButConAct" : "likeButCon"}> 
        <div className="likeB" title={this.state.like==true ? "Unlike" : "Like"} onClick={this.handleClick.bind(this)} > 
         &nbsp; 
        </div> 
        { this.state.likeCount > 0 ? <div className="likeCount">{this.state.likeCount}</div>: null} 

       </div> 
      </div> 
</div> 

Avete bisogno di un elemento principale nel codice HTML di ritorno.

+0

Ho provato entrambi i vostri suggerimenti ma il problema è ancora lì? – Banshee

+0

'a = b' valuta a' a' in javascript, prova 'console.log (a = 100)' e capisci cosa intendo – Guigui

2

reagire automaticamente associa metodi a questo metodo di chiamata. Ciò è utile perché consente di passare direttamente le funzioni. quindi per evitare questo messaggio è sufficiente passare null anziché this. riferimento: AutoBind

+0

Il passaggio null genererà solo l'errore' bind (): I metodi del componente React possono essere associati solo all'istanza del componente – swdev

0

Si dovrebbe capire che obiettivo bind raggiungere, e lo spiegherò qui.

In primo luogo, prova a pensare a chi chiamerà handleClick? vale a dire ci dovrebbe essere qualche codice come xxx.handleClick, xxx importa, perché quando si chiama this.setState all'interno handleClick, this riferiscono a xxx, e setState esistono solo in React component, così xxx dovrebbe fare riferimento al component per ottenere quello che cosa, è per questo che .bind(this) a handleClick, al fine di impostare this a React Component all'interno handleClick

Così ora, tornare alla mia prima domanda, se non si imposta this esplicitamente, ciò che è xxx, in pianura javascript callback onClick è globale che significa non c'è xxx, quindi this dovrebbe fare riferimento all'oggetto globale, ad esempio window se sono corretto. Tuttavia React impostare il xxx a React Component in un modo magico, che è il motivo per cui non è necessario impostare in modo esplicito

0

Nel mio caso, in precedenza ho questo,

<input placeholder="URL" id="txt_url" className="form-control" 
     value={this.state.url} onChange={this.handleChange.bind(this)}/> 

Rimozione che .bind chiamata risolto

<input placeholder="URL" id="txt_url" className="form-control" 
     value={this.state.url} onChange={this.handleChange}/>