2016-07-13 5 views
3
export default React.createClass({ 

displayName: 'Test', 

    onItemClick(item) { 
    console.log(item); 
    }, 

render() { 
    return <div onClick={() => this.onItemClick('apple')}>Fruit</div> 
}); 

divをクリックすると、Uncaught TypeError: Cannot read property 'onItemClick' of undefinedが表示されます。 bindでも試してみましたが、同じ結果が出ました。onClick「this」バインディング

その後編集:

実際のコードが異なっています。私は、divオブジェクトを持つcircleオブジェクト内にitemsの配列を配置しています。ループ外で、私がonItemClick()関数を呼び出すとうまく動作しますが、ループの中で上記のエラーが発生します。

export default React.createClass({ 

displayName: 'Test', 

onItemClick (item) { 
    console.log(item); 
    }, 

render() { 
    var circle = { 
     'one': { items: [] }, 
     'two': { items: [] }, 
     'three': { items: [] }, 
     'four': { items: [] } 
    }; 

    ['one', 'two', 'three', 'four'].forEach(function (k, i) { 
     for (var j = 1; j <= 10; j++) { 
     var itemNo = (i * 10 + j); 
     circle[k].items.push(<div className={"item item-"+itemNo} onClick={() => this.onItemClick(itemNo)}>{itemNo}</div>); 
     } 
    }); 
return (
    <div>{circle.one.items}</div> 
)}; 

どうすればこの問題に対処できますか?コンポーネントへ

+0

私にとってうまく動作します。 – robertklep

+0

ご確認いただきありがとうございます。たぶんこれはウェブパックの問題ですか? – apopa

+0

私はそれがwebpackの問題だとは思わないが、あなたのコンポーネントのトランスバイラコードが意味をなさないかどうか調べる価値があるかもしれない。あなたはそれを蒸散させるために何を使用していますか? – robertklep

答えて

2

forEachハンドラは、標準的な機能であり、異なるthisを持っています。それを矢印の関数で置き換えれば、うまくいくはずです。

render() { 
    var circle = { 
    'one': { items: [] }, 
    'two': { items: [] }, 
    'three': { items: [] }, 
    'four': { items: [] } 
    }; 
    ['one', 'two', 'three', 'four'].forEach((k, i) => { 
//           ^^^^^^^^^^ 
    for (var j = 1; j <= 10; j++) { 
     var itemNo = (i * 10 + j); 
     circle[k].items.push(<div className={"item item-"+itemNo} onClick={() => this.onItemClick(itemNo)}>{itemNo}</div>); 
    } 
    }); 
    return (
    <div>{circle.one.items}</div> 
)}; 
} 
1
return <div onClick={this.onItemClick.bind(this, 'apple')}>Fruit</div> 

バインドonItemClickforEachハンドラ内'apple'

+0

これは私が考えるべきことです。すでに関数が宣言されている場合は、矢印関数imoを使用する必要はありません。よりクリーンで効率的。もし私が間違っていないならば、 'bind(this)'は矢印関数とはうまく動作しません。 –

+0

私は、矢印の機能とバインドを使用して両方の方法を試みました。私は既に構築された機能的なアプリケーションに取り組んでいます。私は以前のコンポーネントでこのように関数にデータを渡しました。この問題は非常識です!ウェブパックの問題でしょうか? – apopa

+0

エラーは正確にその行から来ていますか? –

0

との最初の引数を埋め、thisは、その範囲を失います。

let _this = this; 

私はループの上に_thisを宣言して内部で使用しました。

render() { 
    var circle = { 
    'one': { items: [] }, 
    'two': { items: [] }, 
    'three': { items: [] }, 
    'four': { items: [] } 
    }; 
    var _this = this; 
    ['one', 'two', 'three', 'four'].forEach(function (k, i) { 
    for (var j = 1; j <= 10; j++) { 
     var itemNo = (i * 10 + j); 
     circle[k].items.push(<div className={"item item-"+itemNo} onClick={() => _this.onItemClick(itemNo)}>{itemNo}</div>); 
    } 
              }); 
    return (
    <div>{circle.one.items}</div> 
) 
} 
関連する問題