2016-07-07 9 views
2

Filterコンポーネントのthis.onItemClickについては、スコープに問題があります。単純なReactコンポーネントのこのスコープ

"onItemClickが定義されていません"というエラーが発生しました。

ここに、フィルタコンポーネントのコードを示します。

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

答えて

1

をバインドを使用することができます(あなたがstrict modeを使用する場合、ブラウザでは、window、またはundefinedある)

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

あなたは今thisがグローバルスコープを参照するので、あなたは、.mapコールバック用thisを設定する必要があり、ここで

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

あなたは'this 'を 秒に設定できるので、' .bind'を使う必要はありません。引数 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map –

0

あなたはあなたの前にthisをバインドする必要がありますymous関数です。

この試してみてください:あなたはbabelを使用している場合は、arrow functionsを使用することができます

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

'this'を で設定できるので、' .bind'は必要ありません。 2番目の引数 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map –

0

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

または矢印機能を使用する(自動的にジョブがありません)

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> 
    ); 
    } 
}); 
関連する問題