2015-04-09 22 views
7

Bu yüzden React ve ES6 ile başladım ve çok temel bilgilerle takıldım. Bazı yardımlar için minnettarım. this içeride undefined olduğunuReact 0.13 sınıf yöntemi tanımsız

Uncaught TypeError: Cannot read property 'handleClick' of undefined 

kod

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

cevap

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

sizin kod katı modda (modüller katı modda her zaman) olduğu için izler:

handleClick() bir hata atar .map'a ilettiğiniz işlev.

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

Veya bir arrow function kullanın::

Ya

açıkça second argument to .map geçirerek bağlamı ayarlamak zorunda Sen bileşenine bir bileşen yöntemi bağlayıcı

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

teşekkür ederim. Bir şey daha - tüm li's 'neden' aktif 'eklenir? Beklenen davranış yalnızca bir tane ekliyordu. – walkthroughthecode

+1

* "Beklenen davranış sadece bir tane ekliyordu." * Tüm 'li' öğeleri için tek bir' active' değişkeniniz var. Ya her bir “li” ye kendi devletini vermelisiniz (onları kendi bileşenlerini yapacaksınız) ya da sadece 'gerçek' ve 'yanlış' değil, aktif 'li' öğesini tanımlayan bir şeyi saklamanız gerekir. Btw, yapıcı içinde 'handleClick 'bağlandığınız için' onClick = {this.handleClick} 'yeterlidir. –

+0

Teşekkürler, şimdi daha fazla veya daha az açık :) – walkthroughthecode

0

react.js:18794 Warning: bind():. Tepki, sizin için yüksek performanslı bir şekilde otomatik olarak yapar, böylece bu aramayı güvenle kaldırabilirsiniz. Blueball

yüzden sadece bu gibi

Bkz: bana yardımcı do

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