React
JSX
サーチ…
備考
JSXは、JavaScriptにXML構文を追加するプリプロセッサ・ステップです。 ReactをJSXなしで使うことは間違いありませんが、JSXはReactをよりエレガントにします。
XMLと同様に、JSXタグにはタグ名、属性、子があります。属性値が引用符で囲まれている場合、値は文字列です。それ以外の場合は、値を中括弧で囲みます。値は囲まれたJavaScript式です。
基本的に、JSXはReact.createElement(component, props, ...children)
関数に構文的な砂糖を提供するだけです。
したがって、次のJSXコード:
class HelloMessage extends React.Component {
render() {
return <div>Hello {this.props.name}</div>;
}
}
ReactDOM.render(<HelloMessage name="Kalo" />, mountNode);
次のJavaScriptコードにコンパイルします。
class HelloMessage extends React.Component {
render() {
return React.createElement(
"div",
null,
"Hello ",
this.props.name
);
}
}
ReactDOM.render(React.createElement(HelloMessage, { name: "Kalo" }), mountNode);
結論として、 JSXの次の行は文字列でもHTMLでもないことに注意してください。
const element = <h1>Hello, world!</h1>;
これはJSXと呼ばれ、 JavaScriptの構文拡張です。 JSXはテンプレート言語を思い出させるかもしれませんが、JavaScriptの完全機能を備えています。
Reactチームは、彼らのドキュメントで、UIをどのように見せるべきかを記述することを推奨しています。
JSXの小道具
JSXで小道具を指定する方法はいくつかあります。
JavaScript式
任意のJavaScript式を{}
囲んで小道具として渡すことができます 。たとえば、このJSXでは:
<MyComponent count={1 + 2 + 3 + 4} />
MyComponent
内部では、式1 + 2 + 3 + 4
が評価されるため、 props.count
の値は10
になります。
If文とforループはJavaScriptの式ではないため、JSXで直接使用することはできません。
文字列リテラル
もちろん、任意のstring literal
をprop
として渡すこともできます。これらの2つのJSX式は同等です。
<MyComponent message="hello world" />
<MyComponent message={'hello world'} />
文字列リテラルを渡すと、その値はHTMLアンエスケープされます。したがって、これらの2つのJSX式は同等です。
<MyComponent message="<3" />
<MyComponent message={'<3'} />
この動作は通常適切ではありません。これは、完全性のためにここに記載されています。
小道具デフォルト値
小道具に値を渡さないと、 デフォルト値はtrue
になりtrue
。これらの2つのJSX式は同等です。
<MyTextBox autocomplete />
<MyTextBox autocomplete={true} />
しかし、Reactチームは、 このアプローチを使用しているドキュメントでは、 {foo: true}
ではなく{foo: foo}
略語であるES6オブジェクトの略語{foo}
と混同する可能性があるため推奨していません 。彼らは、この動作がちょうどそこにあり、HTMLの動作にマッチすると言います。
スプレッドアトリビュート
すでにオブジェクトとして小道具を持っていてJSXで渡す場合は、スプレッド演算子として...
を使用して小道具オブジェクト全体を渡すことができます。これらの2つのコンポーネントは同等です。
function Case1() {
return <Greeting firstName="Kaloyab" lastName="Kosev" />;
}
function Case2() {
const person = {firstName: 'Kaloyan', lastName: 'Kosev'};
return <Greeting {...person} />;
}
JSXの子供たち
開始タグと終了タグの両方を含むJSX式では、これらのタグ間のコンテンツは特殊なprop: props.children
として渡されます。子供を渡すにはいくつかの方法があります:
文字列リテラル
あなたは開始タグと終了タグの間に文字列を置くことができ、 props.children
はその文字列になります。これは、組み込みのHTML要素の多くに役立ちます。例えば:
<MyComponent>
<h1>Hello world!</h1>
</MyComponent>
これは有効なJSXで、MyComponentのprops.children
は単に<h1>Hello world!</h1>
ます。
HTMLはエスケープされていないので、通常はHTMLと同じようにJSXを書くことができます。
これを念頭に置いて、この場合、JSX:
- 行の先頭と末尾の空白を削除します。
- 空白行を削除します。
- タグに隣接する新しい行が削除されます。
- 文字列リテラルの途中で発生する新しい行は、単一のスペースに集約されます。
JSXチルドレン
子として、より多くのJSX要素を提供することができます。これはネストされたコンポーネントを表示するのに便利です:
<MyContainer>
<MyFirstComponent />
<MySecondComponent />
</MyContainer>
さまざまなタイプの子を混在させることができるので、JSXの子と一緒に文字列リテラルを使用できます 。これは、JSXがHTMLのようなもので、有効なJSXと有効なHTMLの両方である別の方法です。
<div>
<h2>Here is a list</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
Reactコンポーネントは複数のReact要素を返すことはできませんが、単一のJSX式は複数の子を持つことができます 。したがって、複数の要素をレンダリングする場合は、上記の例のようにdiv
ラップすることができます。
JavaScript式
任意のJavaScript式を{}
内に囲んで子として渡すことができます。たとえば、これらの式は等価です。
<MyComponent>foo</MyComponent>
<MyComponent>{'foo'}</MyComponent>
これは、任意の長さのJSX式のリストをレンダリングする場合に便利です。たとえば、次のようにHTMLリストをレンダリングします。
const Item = ({ message }) => (
<li>{ message }</li>
);
const TodoList = () => {
const todos = ['finish doc', 'submit review', 'wait stackoverflow review'];
return (
<ul>
{ todos.map(message => (<Item key={message} message={message} />)) }
</ul>
);
};
JavaScript式は他のタイプの子供と混在することができます。
子供としての機能
通常、JSXに挿入されたJavaScript式は、文字列、React要素、またはそれらのリストに評価されます。しかし、 props.children
、Reactがレンダリングする方法を知っているだけでなく、あらゆる種類のデータを渡すことができる点で、他の小道具と同じように機能します。たとえば、カスタムコンポーネントを使用している場合、 props.children
としてコールバックを取ることができます。
const ListOfTenThings = () => (
<Repeat numTimes={10}>
{(index) => <div key={index}>This is item {index} in the list</div>}
</Repeat>
);
// Calls the children callback numTimes to produce a repeated component
const Repeat = ({ numTimes, children }) => {
let items = [];
for (let i = 0; i < numTimes; i++) {
items.push(children(i));
}
return <div>{items}</div>;
};
Reactがレンダリングする前に理解できるものに変換される限り、カスタムコンポーネントに渡された子は何でもかまいません。この使い方は一般的ではありませんが、JSXの機能を拡張したい場合に機能します。
無視される値
false
、 null
、 undefined
、およびtrue
が有効な子であることに注意してください。しかし、彼らは単にレンダリングしません。これらのJSX式はすべて同じものにレンダリングされます。
<MyComponent />
<MyComponent></MyComponent>
<MyComponent>{false}</MyComponent>
<MyComponent>{null}</MyComponent>
<MyComponent>{true}</MyComponent>
これは、React要素を条件付きでレンダリングするのに非常に便利です。このJSXは、 showHeader
がtrueの場合にのみaをレンダリングします。
<div>
{showHeader && <Header />}
<Content />
</div>
1つの重要な注意点は、 0
番のような「偽の」値のいくつかは依然としてReactによってレンダリングされるということです。たとえば、このコードは、 props.messages
が空の配列の場合に0
が出力されるため、期待どおりに動作しません。
<div>
{props.messages.length &&
<MessageList messages={props.messages} />
}
</div>
これを修正する方法の1つは、 &&
前の式が常にブール値であることを確認することです。
<div>
{props.messages.length > 0 &&
<MessageList messages={props.messages} />
}
</div>
最後に、 false
、 true
、 null
、またはundefined
ような値を出力に表示するには、最初に文字列に変換する必要があることに注意してください。
<div>
My JavaScript variable is {String(myVariable)}.
</div>