2016-07-07 9 views
2

Haben Sie ein Problem mit, denke ich, Umfang, wenn es um dieses.onItemClick in meiner Filter-Komponente geht.Dieser Bereich in einer einfachen React-Komponente

Fehler erhalten "onItemClick ist nicht definiert".

Hier ist der Code für die Filterkomponente.

var Filter = React.createClass({ 
getDefaultProps() { 
    return { 
     filterList: [], 
     name: '' 
    }; 
}, 
onItemClick(event) { 
    event.currentTarget.style.backgroundColor = '#f00'; 
}, 
render() { 
    return (
     <div className="filterCloud quarter-section"> 
      <h3>{this.props.name}</h3> 
      <ul> 
       {this.props.filterList.map(function(listValue) { 
        return <li onClick={this.onItemClick}>{listValue}</li>; 
       })} 
       </ul> 
     </div> 
    ) 
}}); 

Antwort

1

Sie this für .map Rückruf festlegen sollte, denn jetzt this zu globalen Bereich bezieht sich (in-Browser ist es window oder undefined, wenn Sie verwenden strict mode)

this.props.filterList.map(function(listValue) { 
    return <li onClick={this.onItemClick}>{listValue}</li>; 
}, this); 
    ^^^^^ 
0

können Sie verwenden binden hier

var Filter = React.createClass({ 
getDefaultProps() { 
    return { 
     filterList: [], 
     name: '' 
    }; 
}, 
onItemClick(event) { 
    event.currentTarget.style.backgroundColor = '#f00'; 
}, 
render() { 
    return (
     <div className="filterCloud quarter-section"> 
      <h3>{this.props.name}</h3> 
      <ul> 
       {this.props.filterList.map(function(listValue) { 
        return <li onClick={this.onItemClick}>{listValue}</li>; 
       }.bind(this))} 
       </ul> 
     </div> 
    ) 
}}); 
+0

Sie Sie brauchen '.bind' nicht zu verwenden, da Sie' this' durch Sekunde setzen können Argument - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map –

0

sollten Sie this an Ihre anon binden ymous Funktion.

Try this:

{this.props.filterList.map(function(listValue) { 
        return <li onClick={this.onItemClick}>{listValue}</li>; 
       }.bind(this))} 

oder mit den Pfeilfunktion (automatisch macht den Job):

{this.props.filterList.map((listValue) => { 
     return <li onClick={this.onItemClick}>{listValue}</li>; 
    } 
)} 
+0

Sie brauchen nicht '.bind' zu verwenden, da Sie' this' über setzen können zweites Argument - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map –

0

Wenn Sie babel verwenden, können Sie arrow functions verwenden können:

var Filter = React.createClass({ 
    getDefaultProps() { 
    return { 
     filterList: [], 
     name: '' 
    }; 
    }, 
    onItemClick(event) { 
    event.currentTarget.style.backgroundColor = '#f00'; 
    }, 
    render() { 
    return (
     <div className="filterCloud quarter-section"> 
     <h3>{this.props.name}</h3> 
     <ul> 
      {this.props.filterList.map((listValue) => 
      <li onClick={this.onItemClick}>{listValue}</li> 
     )} 
     </ul> 
     </div> 
    ); 
    } 
}); 
Verwandte Themen