2017-11-30 12 views
1

に再レンダリング私はコードthis.props.childrenない親状態変化

import React, {Component} from 'react'; 

class App extends Component { 
    render() { 
    return (
     <Container> 
     <Child/> 
     </Container> 
    ) 
    } 
} 

class Container extends Component { 
    render() { 
    console.log('Container render'); 
    return (
     <div onClick={() => this.setState({})}> 
     {this.props.children} 
     </div> 
    ) 
    } 
} 

class Child extends Component { 
    render() { 
    console.log('Child render'); 
    return <h1>Hi</h1> 
    } 
} 

export default App; 

の部分を持っている「こんにちは」をクリックすると、MSG、唯一Containerコンポーネントを再レンダリングし続けるが、Childコンポーネントを再ではありません - レンダリングされる。

なぜChildコンポーネントが再レンダリングされないのですかContainer状態が変わりましたか?

私はそれが原因それはContainerコンポーネントのプロパティであることには発生しませんが、それでもthis.props.childはJSXでChildコンポーネントに評価され、その確認されていないことを理由でしょう。

<div onClick={() => this.setState({})}> 
    {this.props.children} 
</div> 

フル例https://codesandbox.io/s/529lq0rv2n(コンソールログを確認)

答えて

1

小道具が変更されていないので、<Child />成分が再レンダリングされません。 Reactは、コンポーネントとそのデータを表す仮想DOMの概念を使用します。

コンポーネントの小道具が変更されない場合、コンポーネントは再レンダリングされません。これがReactを速く保つものです。

例では、Childに送信されたプロップはないので、決して再レンダリングされません。あなたはそれが(なぜだろう?)再レンダリングするたびにしたい場合は、例えば、純粋な機能を使用することができます

const Child =() => <h1>Hi</h1>; 
+0

ありがとうございました。私が理解しているように、setState()が起動されると、Containerコンポーネントのレンダリング機能が呼び出され、すべての子要素を再レンダリングする必要があります。 {this.props.children}の代わりにを使うことができ、更新する小道具がなくても毎回再レンダリングが実行されます。 [Example](https://codesandbox.io/s/6l9vmx5nnw)のチェック –

+2

''は 'App'によってレンダリングされます。そのため、' Container 'がレンダリングされたときに再レンダリングされません。あなたの 'Container 'はすべて、渡された値を返します。 'React.cloneElement(this.props.children)'を実行することで再レンダリングをトリガーすることができます – torvin

+0

私は最初からそう考えていましたが、最初のレンダリングについてどう説明しますか? appが最初にマウントされると、Containerがレンダリングされた後に子がレンダリングされます(コンソールログ参照)。子がアプリケーションでレンダリングされた場合、初期レンダリング中に「レンダリングされたコンテナ」の前に「子レンダリング」が表示されますか?そうではありませんか? –

1

変更{this.props.children}<Child />にコンテナコンポーネントでは、(今、あなたは、Appコンポーネントから<Child />を削除することができます) 。

divをクリックすると、コンソールに「子レンダリング」と「コンテナレンダリング」の両方が表示されます。

(この例ではあなたの子供は静的なコンポーネントです。)

+0

はい、私は、{this.props.children}の代わりにが使用された場合を認識しています。 this.props.childrenが同じ要素を返すので、JSXの違いはまだ分かりません。あなたはあなたの子供が静的なcomponent_であると言って何を意味するのかをもっと詳しく教えていただけますか? –

+0

子コンポーネントのコンテンツは静的です(コンテンツはいつでも変更されません)。この場合、コンポーネントを再レンダリングする必要はありません。しかし、コンテナコンポーネントから取得し、小道具を通過し、時間によって変化するいくつかの値を使用している場合は、子プロセスを再レンダリングする必要があります。 –

+0

精巧に感謝します。はい、私たちはそれを静的なものと呼ぶことができます。{this.props.children}の代わりにとして使用すると、毎回再レンダリングされる理由はまだ説明されていません。 [例](https://codesandbox.io/s/6l9vmx5nnw)を確認してください。 –

関連する問題