2017-07-20 3 views
0

以下の値(<ArticleList instance>.props.articles)は、HomePagethis.props.articles)の小道に結合されています。ReactJSプロップバインディングはどのように機能しますか?

ReactJSは、動的ルックアップを許可する代わりに、オブジェクト参照の設定として「this.props.articles」を維持しなければならないので、this.props.articlesのオブジェクトIDは、undefinedかもしれませんか、それは変更される場合があります。

これは間違いありませんか?

class HomePage extends React.PureComponent { 
    render() { 
    return <ArticleList articles={this.props.articles} /> 
    } 
} 

function ArticleList({articles}) { 
    if(!articles) return <div>There are no articles!</div>; 
    return <div>{ articles.map(a => <Article value={a} />) }</div>; 
} 

編集:私はundefinedのためのケースをカバーするために、コードを編集しました。私の質問は残っています。修正再表示するには

this.props.articlesは、プロパティの値を取得するために、JavaScript式のように見えます。

しかし、それは質問に記載された理由ではありません(あなたは定義されていません)。

これは、代わりにJSXが解析する方法を知っている特殊なJSX構文ですか?

+0

ほぼ正しいです。これを考えてみましょう: 'this.props.articles'が偽であれば、' ArticleList'コンポーネントから何が返ってきますか?あなたがしてはならないものを 'マップする 'ことを試みているので、それは壊れませんか? – Patel

+0

例えば、 'this.props.articles'が' undefined'だった場合、 'undefined'に' map'を実行しようとすると "undefined is not object"というエラーが出ます。それが 'false'だった場合、' undefined is a function 'のようなものが得られます。 'false'はボックス化され、' map'メソッドはありません。 – Ben

+0

JSXのJavaScriptが中括弧で囲まれている必要があるため、ニットをピッキングするとエラーが発生すると思います。 return

{articles.map(a =>
)}
; – hellojeffhall

答えて

1

なぜthis.props.articlesはJavaScriptではないと言っていますか?かつてバベルでtranspiled

あなたのコードは次のようになります。

class HomePage extends React.PureComponent { 
    render() { 
    return React.createElement(ArticleList, { 
     articles: this.props.articles, 
    }); 
    } 
} 

function ArticleList({articles}) { 
    if(!articles) { 
    return React.createElement('div', {}, 'There are no articles!'); 
    } 
    return React.createElement('div', {}, 
    articles.map(a => <Article value={a} />) 
); 
} 

this.props.articlesは単にHomePageクラスのpropsプロパティへの参照です。

+0

ありがとうございました。したがって、JSXの作成時には評価されません。代わりに、 'render'が呼び出されるたびに評価される式を含む関数を構築するために使用されます。 – Ben

関連する問題