2017-03-15 46 views
0

私はReactを学んでおり、コンポーネントの抽出を開始しました。子コンポーネントにonClickのようなイベントをバインドする方法を理解していますが、孫はどうですか?2レベル上のコンポーネントの状態を変更するにはどうすればよいですか?

例:

私はListコンポーネントを持っています。それはListRow子供を持っています。各ListRow子の中に、親からその特定の行を削除するボタンコンポーネントがあります(List). My thoughts are that the deleteRow click handler would be on the List component so that I could then set the state. However, I can't seem to find a way to call the grandparent's ( List`)eventHandler。

<List /> // has event handler as well as state for the list items 
    <ListRow /> 
     <DeleteButton /> //when clicking this i want to delete parent <ListRow /> 

私はちょうどチェーンの下でonclickを渡すはずですか?

// grandparent function that goes into parent 
heirloom() 
{ 
    console.log("grandparent says hi"); 
    //something happens 
} 

// everything else (put into all subsequent children) 
heirloom() 
{ 
    this.props.heirloom(); 
} 

<List heirloom="this.heirloom"> 
    <ListRow heirloom="this.heirloom" /> 
     <DeleteButton onClick="this.heirloom"/> 

私の構文はオフにすることができ、これがまたは私はしばらくの間反応で遊ぶ機会がなかった、動作しない場合があります:あなたは何か、これを試みることができる

+0

あなたはメソッドを渡してみましたか? –

+0

現在試しています。さて、それは現在、むしろそれとぼやけている。私は構文の権利があるかどうかわかりません。 – gin93r

+1

メソッドを渡すことは間違いなく、やっかいなことですが、もっと複雑な "倒れ"(非常に遠い共通の祖先でコンポーネントを更新しようとするような)になると、Reduxを見てみることができます。 Reduxは、Reactと組み合わせて使用​​できる状態管理ライブラリです。 – ZekeDroid

答えて

2

コンポーネントを作成するときは、コンポーネントが機能コンポーネントか状態を管理する必要があるコンポーネントかどうかを判断する必要があります。ここでは、機能を子に、子を子に渡す「祖父母」がある場合の例を示します。

class GrandParent extends Component { 
    handleState = (obj) => { 
    this.setState(obj); 
    } 

    render() { 
    return (
     <Parent handleState={this.handleState} /> 
    ); 
    } 
} 

function Parent(props) { 
    render() { 
    return (
     <Child handleState={props.handleState} /> 
    ); 
    } 
} 
    function Child(props) { 
    render() { 
     return (
     ... 
    ); 
    } 
    } 

は、あなたが一緒にそれを渡したいでもどこでもあなたが呼び出す必要があります:コンポーネントが状態を管理する必要がない場合、あなたはそれの「親」と「子」として以下のような「機能性成分」を作りますあなたはあなたがそれを送るどんなコンポーネントからでもそれをprops.handleState()として使うことができます。

+0

Aha!だからあなたはそれを伝えます。私はonClick = {this.onClick}をしよ​​うとしていたと思います。それは機能する必要がありますか?私は、機能とクラスに基づいたものは、コンポーネントを書くための2つの異なる方法だと思っていました。どのバージョンが使われているかは本当に重要だとは思わなかった。 – gin93r

+0

コンポーネントを作成するときは、状態を管理する必要があるかどうかを尋ねてください。たとえば、アクティブなリンクを強調表示する必要があるナビゲーションコンポーネントがあるとします。これは、状態の良い候補であり、ステートフルコンポーネントと機能コンポーネントのどちらとしても優れています。 「親」と「子」が状態を管理する必要がある場合は、それらをステートフルなコンポーネントに変更できます。 –

+0

これは単なるベストプラクティスですか?文書には、Reactの観点からは同じであると書かれています。クラスにはいくつかの追加機能があります。あなたが言ったように、国家を管理するならば、それはクラスである必要があります。しかし、それが状態を管理していなければ、それはまだクラスである可能性があります。 – gin93r

1

。もしそうなら、素晴らしい!そうでない場合は、より良い答えを持つ人が来てくれることを祈っています。

+0

あなたは正しい考えを持っています。あなたが言ったように、構文はほんの少しです。 –

+0

@JamesGanong正確な回答を自由に投稿してください。 –

+0

答えをありがとう: – gin93r

関連する問題