ReactのJSX構文で二重中括弧の目的は何ですか?


111

react.jsチュートリアルから、二重中括弧のこの使用法がわかります。

<span dangerouslySetInnerHTML={{ __html: rawMarkup }} />

次に、2番目のチュートリアル「Thinking in react」

 <span style={{ color: 'red' }}>
     {this.props.product.name}
 </span>;

ただし、React JSXのドキュメントでは、二重中括弧についての説明や言及はありません。この構文(二重中括弧)は何のためのものですか?そして、同じことをjsxで表現する別の方法はありますか、これは単なるドキュメントの省略ですか?


9
ドキュメントからThe exterior set of curly braces are letting JSX know you want a JS expression. The interior set of curly braces represent a JavaScript object, meaning you’re passing in a object to the style attribute.
サヤン

回答:


116

これは、prop値にインライン化された単なるオブジェクトリテラルです。それは同じです

var obj = {__html: rawMarkup};

<span dangerouslySetInnerHTML={obj} />

@BenAlpert少し時間があれば嬉しいです。奇妙なことに、私は実際にドキュメントの編集を楽しんでいます(以前の化身の法律ジャーナルの編集者でした)が、他にもいくつか改善点があるかもしれません。PS、まだボルダーに住んでいますか?いつかコーヒーやランチを手に入れましょう... Reactの内部をスクープしている誰かと知り合うのは良いことです。なぜなら、これで大きなプロジェクトを始めたばかりだからです。
ベンロバーツ

1
@BenRobertsありがとうございます。残念ながら最近はカリフォルニアにいますが、freenodeの#reactjs IRCルームに気軽に立ち寄ってください。質問に答えさせていただきます。
ソフィーアルパート2014年

@BenAlpert dangerouslySetInnerHTML={__html: rawMarkup}ではなく、その考えの背後にある考え方を知っていますdangerouslySetInnerHTML={rawMarkup}か オブジェクト{__html: rawMarkup}が変更可能で文字列が変更できないためですか?
Brian Kung

2
@ブライアン:github.com/facebook/react/issues/2256#issuecomment-63031960(およびgithub.com/facebook/react/blob/…)を参照してください。
Felix Kling

55

中括弧はここで2つの使用法を持っています:-

  1. {..}は、JSXの式に評価されます。
  2. {key:value}は、javascriptオブジェクトを意味します。

簡単な例を見てみましょう。

<Image source={pic} style={{width: 193}}/>

pic中括弧で囲まれて観察した場合。これが、変数を埋め込むJSXの方法です。pic任意のJavascript式/変数/オブジェクトにすることができます。また、{2 + 3}のようなことを行うと、{5}と評価されます

ここでスタイルを分析してみましょう。 {width: 193}JavaScriptオブジェクトです。このオブジェクトをJSXに埋め込むには、中括弧が必要です。{ {width: 193} }

注:JSXに任意の種類のJavascript式/変数/オブジェクトを埋め込むには、中括弧が必要です。


5
この回答は、承認済みとしてマークされた回答と比較して、説明がわかりやすいと思います。
Rohit Mandiwal

@RohitMandiwalありがとうございます。中かっこが内側にあるときは少し混乱します。
Mav55


6

ReactはJSXを使用します。JSXでは、変数、状態オブジェクト、式などを{}で囲む必要があります。

JSXでインラインスタイルを指定する場合は、オブジェクトとして指定する必要があるため、中かっこで囲む必要があります。{}。

これが、中括弧が2組ある理由です。


3

これは、目的のスタイルプロパティのオブジェクトに設定されているスタイル変数を宣言する代わりに、オブジェクトのスタイルプロパティを設定するだけでよいことを意味します。これは通常、追加するスタイルが少ない場合のベストプラクティスです。より多くのスタイルが必要な要素は、スタイル変数を宣言する方がわかりやすい

たとえば、スタイルプロパティが少ない要素の場合、これを行います

<span style={{color: 'red'}}>
  {this.props.product.name}
</span>

より多くのスタイルプロパティを持つHTML要素の場合、これを行います

const spanStyle = {
   backgroundColor: 'red',
   color: 'grey',
   margin: '-25px'
}

次に、jsx構文で呼び出します

<span style={spanStyle}>
  {this.props.product.name}
</span>

1

わかりやすい言葉で伝えたいと思います。以下のコード:

<span dangerouslySetInnerHTML={{__html: rawMarkup}} />

等しい

<span 
     dangerouslySetInnerHTML={ {__html: rawMarkup} } 
/>

したがって、リテラルオブジェクトをプロパティに割り当てる場合は、単にReact式を使用する必要があります。

主にAngularJからReactJに移行している一部の人にとって、これはおそらくAngularJの式バインディング演算子{{}}との混乱の一部です。したがって、ReactJで別の見方をしてみてください。


7
2つのコードフラグメントは、フォーマットを除いてまったく同じように見えます。
jcollum 2016年

4
@jcollum-それはまさに彼のポイントです。二重ブレースの「演算子」は、彼が示していた演算子ではありません。HTMLテンプレートエンジンでは非常に一般的であるため、反応がおかしいように見えます。
aaaaaa

まだうまく
アンドリューラム

@AndrewLam-編集しました。理解できましたか?
イーサン

1

二重中括弧の私の解釈は、スタイルオブジェクトはJavaScriptオブジェクトのみを受け入れるため、オブジェクトは単一の中括弧の内側にある必要があるということです。

style={jsObj}

スタイルアーティファクトのオブジェクトは、キーと値のペア(辞書と配列)であり、そのオブジェクトは、たとえばとして表されます{color:'#ffffff'}

だからあなたは持っています:

style = { jsObj }

そして

jsObj = {color:'#ffffff'}

代数のように、代入すると、次のようになります。

style = { {color:'#ffffff'} }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.