2015-04-09 10 views
7

Quindi ho iniziato con React ed ES6 e sono rimasto bloccato con le nozioni di base. Apprezzo davvero un po 'di aiuto.React 0.13 metodo di classe non definito

handleClick() genera un errore:

Uncaught TypeError: Cannot read property 'handleClick' of undefined 

codice segue

export default class MenuItems extends React.Component { 

    constructor(props) { 
    super(props) 
    this.state = {active: false} 
    this.handleClick = this.handleClick.bind(this) 
    } 

    handleClick() { 
    this.setState({ active: !this.state.active }); 
    } 

    render() { 
    let active = this.state.active 
    let menuItems = [{text: 'Logo'}, {text: 'promo'}, {text:  'benefits'}, { text: 'form'}] 
    return (
     <ul> 
     {menuItems.map(function(item) { 
      return <li className={active ? 'active' : ''} onClick={this.handleClick.bind(this)} key={item.id}>{item.text}</li>; 
     })} 
     </ul> 
    ); 
    } 
} 

risposta

12
{menuItems.map(function(item) { 
    return <li className={active ? 'active' : ''} onClick={this.handleClick.bind(this)} key={item.id}>{item.text}</li>; 
})} 

Poiché il codice è in modalità rigorosa (i moduli sono sempre in modalità rigorosa), this è undefined all'interno la funzione si passa a .map.

O si deve impostare in modo esplicito il contesto passando un second argument to .map:

{menuItems.map(function(item) { 
    // ... 
}, this)} 

o utilizzare un arrow function:

{menuItems.map(
    item => <li className={active ? 'active' : ''} onClick={this.handleClick.bind(this)} key={item.id}>{item.text}</li> 
)} 
+0

Questo mi ha aiutato grazie. Un'altra cosa: perché 'attivo' viene aggiunto a tutti i li? Il comportamento previsto è stato solo aggiungendo a uno. – walkthroughthecode

+1

* "Il comportamento previsto era solo l'aggiunta a uno." * Hai una singola variabile 'active' per tutti gli elementi' li'. Dovete dare a ogni 'li' il proprio stato (rendetene il proprio componente), o memorizzare qualcosa che identifichi l'elemento' li' attivo, non solo 'true' e' false'. Btw, dato che il tuo binding 'handleClick' all'interno del costruttore,' onClick = {this.handleClick} 'è sufficiente. –

+0

Grazie, ora è più o meno chiaro :) – walkthroughthecode

0

react.js:18794 Warning: bind(): si sono vincolanti un metodo componente per componente. React fa questo automaticamente per te in un modo ad alte prestazioni, così puoi tranquillamente rimuovere questa chiamata. Vedere Blueball

così proprio come questo:

{ 
    menuItems.map(
    item => <li className={active ? 'active' : ''} 
    onClick={this.handleClick} key={item.id}>{item.text}</li> 
)} 
Problemi correlati