2016-10-17 8 views
0

ツリーを生成するサンプルコードがあります。しかし、コンストラクタですべてを定義している間に、this.state.actionまたはthis.onClickNodeが定義されていないというエラーが表示されます。"this.state"またはメソッドがReactjsにアクセスできない

export default class TreeList extends React.Component { 
    constructor(props) { 
    super(props) 
    this.state = {tree: tree, action: null} 
    this.onClickNode = this.onClickNode.bind(this) 
    } 
    onClickNode(node) { 
    this.setState({active: node}) 
    } 
    renderNode(node) { 
    console.log(this.state.action) 
    return (
     <span onClick={this.onClickNode(null, node)}> 
     {node.module} 
     </span> 
    ); 
    } 
    render() { 
    return (
     <div> 
     <Tree tree={this.state.tree} renderNode={this.renderNode}/> 
     </div> 
    ) 
} 

}

私はこのライブラリを使用しました:thisはES6クラスのnot automatically boundあるのでhttps://pqx.github.io/react-ui-tree/

+3

'this.renderNode'関数に' this'をバインドする必要があります。たとえば 'this.renderNode = this.renderNode.bind(this)' –

+0

'onClickNode'で状態にアクセスできませんか?あなたが 'on.Node'ではなく、' node'ではなく 'null'に設定されていることを知っておいてください。これはあなたの' onClickNode'の中の最初のパラメータです。 – Ido

+0

@Idoはいそれはヌルです。代わりにundefinedを返します。 – Mortezaipo

答えて

1

はあなたのrenderNode関数にthisをバインドする必要があります。それ以外の場合は、関数内に適切なコンテキストがありません。これがあなたのthis.state.actionが定義されていない理由と、それがthis.onClickNodeを解決できない理由です。

あなたのコンストラクタで

、あなたのonClickハンドラ内のノードを使用する場合、あなたは私が何が起こっているが、ということであると仮定してい

onClickNode(firstParam, node) { 
    return (event) => { 
     this.setState({active: node}) 
    } 
    } 

にそれを切り替えることができ、また

this.renderNode = this.renderNode.bind(this); 

を追加this.renderNoderender()が呼び出されたときに実行され、this.onClickNodeを実行してからstateを更新します。さて、stateが更新されてから、render()に再度電話します。

+0

あなたの答えに感謝しますが、 'this.renderNode = this.renderNode.bind(this);を定義すると、無限ループになり、ブラウザがクラッシュします。 – Mortezaipo

+0

@Mortezaipoまた、あなたの 'onClick'ハンドラが関数への参照を渡すだけではなく、' this.onClickNode(null、node) '関数を実行していることにも気付きました。おそらく、 'this.onClickNode'に' node'オブジェクトを含む関数を返さなければなりません。これはあなたの無限ループの原因となる可能性があります。 –

+0

だから私はこれを代わりに追加するべきです: 'onClick = {this.onClickNode}'? – Mortezaipo

関連する問題