Translate 02.1-jsx-in-depth.ja-JP.md to Japanese
Kohei TAKATA committed
Jun 25, 2015 at 14:46 UTC
f460a19d8a53cb7721888ef8974e6f2953e4a9d7
1 file changed
+219
docs/docs/02.1-jsx-in-depth.ja-JP.md
new
+219
@@ -0,0 +1,219 @@
1
+---
2
+id: jsx-in-depth
3
+title: JSXの深層
4
+permalink: jsx-in-depth-ja-JP.html
5
+prev: displaying-data-ja-JP.html
6
+next: jsx-spread-ja_JP.html
7
+---
8
+
9
+[JSX](https://facebook.github.io/jsx/)はXMLに似たJavaScriptのシンタックスの拡張です。Reactでは、単純なJSXのシンタックスの変換を使うことができます。
10
+
11
+## なぜJSXを使うのでしょうか?
12
+
13
+ReactでJSXの使用を強制されるわけではありません。生のJSを使うこともできます。しかし、JSXは簡潔で、木構造とReactの特性を定義しやすいシンタックスであるため、JSXを使うことをお勧めします。
14
+
15
+デザイナーのようなカジュアルな開発者にとってはさらに馴染みやすいでしょう。
16
+
17
+XMLにはバランスの取れた開始タグと終了タグという利益があります。このことで、関数がオブジェクトリテラルを呼んでいるのを読むよりも簡単に大きな木構造を作ることができます。
18
+
19
+これはJavaScriptのセマンティックスを代替するものではありません。
20
+
21
+## HTMLタグ対Reactコンポーネント
22
+
23
+ReactはHTMLタグ(文字列)とReactコンポーネント(クラス)の両方をレンダリングすることができます。
24
+
25
+以下のようにJSXで小文字のタグ名を使用するだけで、HTMLタグをレンダリングできます。
26
+
27
+```javascript
28
+var myDivElement = <div className="foo" />;
29
+React.render(myDivElement, document.getElementById('example'));
30
+```
31
+
32
+以下のように大文字から始まるローカル変数を作成するだけで、Reactのコンポーネントをレンダリングできます。
33
+
34
+```javascript
35
+var MyComponent = React.createClass({/*...*/});
36
+var myElement = <MyComponent someProperty={true} />;
37
+React.render(myElement, document.getElementById('example'));
38
+```
39
+
40
+ReactのJSXは大文字と小文字を使うことで、ローカルのコンポーネントクラスとHTMLタグを識別する習慣があります。
41
+
42
+> 注意:
43
+>
44
+> JSXはJavaScriptなので、 `class` や `for` といった識別子はXMLの属性名としては使用しません。代わりに、 ReactのDOMコンポーネントはDOMのプロパティ名がそれぞれ `className` や `htmlFor` といったものであることを期待します。
45
+
46
+## The Transform
47
+
48
+ReactのJSXはXMLに似たシンタックスをネイティブなJavaScriptに変換します。XML要素や属性や子要素は `React.createElement` で渡される引数に変換されます。
49
+
50
+```javascript
51
+var Nav;
52
+// 入力 (JSX):
53
+var app = <Nav color="blue" />;
54
+// 出力 (JS):
55
+var app = React.createElement(Nav, {color:"blue"});
56
+```
57
+
58
+`<Nav />` を使うためには、 `Nav` 変数がスコープの中にないといけないことに注意してください。
59
+
60
+以下のように、JSXはXMLシンタックスを使うことで、細かな子要素の使用も許可します。
61
+
62
+```javascript
63
+var Nav, Profile;
64
+// 入力 (JSX):
65
+var app = <Nav color="blue"><Profile>click</Profile></Nav>;
66
+// 出力 (JS):
67
+var app = React.createElement(
68
+ Nav,
69
+ {color:"blue"},
70
+ React.createElement(Profile, null, "click")
71
+);
72
+```
73
+
74
+以下のように、displayNameがundefinedの時には、JSXはクラスの[displayName](/react/docs/component-specs.html#displayname)を変数の割り当てから予測します。
75
+
76
+```javascript
77
+// 入力 (JSX):
78
+var Nav = React.createClass({ });
79
+// 出力 (JS):
80
+var Nav = React.createClass({displayName: "Nav", });
81
+```
82
+
83
+JSXを試し、どのようにネイティブなJavaScriptに変換されるか見るには、[JSX Compiler](/react/jsx-compiler.html)を、すでに存在するHTMLをJSXに変換するには[HTMLからJSXへのコンバーター](/react/html-jsx.html)を使ってください。
84
+
85
+JSXを使いたい場合は、[始めてみましょう](/react/docs/getting-started-ja-JP.html)というガイドがどのようにコンパイルを設定するか示してくれます。
86
+
87
+> 注意:
88
+>
89
+> JSXという表現は常にReactElementを評価します。実際に実行する際の詳細はおそらく異なっているでしょう。最適化されたモードでは `React.createElement` のコードのバリデーションを避けるためにReactElementをオブジェクトリテラルとして配置するでしょう。
90
+
91
+
92
+## ネームスペース化されたコンポーネント
93
+
94
+formのように、たくさんの子要素を持つコンポーネントを構築する際には、以下のように多くの変数を宣言しなければいけないでしょう。
95
+
96
+```javascript
97
+// 変数宣言のあまりよくない部分
98
+var Form = MyFormComponent;
99
+var FormRow = Form.Row;
100
+var FormLabel = Form.Label;
101
+var FormInput = Form.Input;
102
+
103
+var App = (
104
+ <Form>
105
+ <FormRow>
106
+ <FormLabel />
107
+ <FormInput />
108
+ </FormRow>
109
+ </Form>
110
+);
111
+```
112
+
113
+これを単純で簡単にするために、 *ネームスペース化されたコンポーネント* では、以下のように他のコンポーネントを付属物として持つ1つのコンポーネントを使うことができます。
114
+
115
+```javascript
116
+var Form = MyFormComponent;
117
+
118
+var App = (
119
+ <Form>
120
+ <Form.Row>
121
+ <Form.Label />
122
+ <Form.Input />
123
+ </Form.Row>
124
+ </Form>
125
+);
126
+```
127
+
128
+これを行うためには、以下のようにメインコンポーネントの付属物として、「サブコンポーネント」を作るだけで大丈夫です。
129
+
130
+```javascript
131
+var MyFormComponent = React.createClass({ ... });
132
+
133
+MyFormComponent.Row = React.createClass({ ... });
134
+MyFormComponent.Label = React.createClass({ ... });
135
+MyFormComponent.Input = React.createClass({ ... });
136
+```
137
+
138
+JSXはコードをコンパイルする際にこのプロパティをハンドルします。
139
+
140
+```javascript
141
+var App = (
142
+ React.createElement(Form, null,
143
+ React.createElement(Form.Row, null,
144
+ React.createElement(Form.Label, null),
145
+ React.createElement(Form.Input, null)
146
+ )
147
+ )
148
+);
149
+```
150
+
151
+> 注意:
152
+> この特徴は [v0.11](/react/blog/2014/07/17/react-v0.11.html#jsx) 以上で使用できます。
153
+
154
+## JavaScriptの表現
155
+
156
+### アトリビュートの表現
157
+
158
+JavaScriptで書いたものをアトリビュートの値として使うためには、その表現を引用(`""`)ではなく波括弧(`{}`)で囲ってください。
159
+
160
+```javascript
161
+// 入力 (JSX):
162
+var person = <Person name={window.isLoggedIn ? window.name : ''} />;
163
+// 出力 (JS):
164
+var person = React.createElement(
165
+ Person,
166
+ {name: window.isLoggedIn ? window.name : ''}
167
+);
168
+```
169
+
170
+### Booleanのアトリビュート
171
+
172
+アトリビュートの値を記述しないと、JSXはそれを `true` として扱ってしまいます。`false` を渡すためには、アトリビュートが使われる必要があります。これらはHTMLのform要素の `disabled` 、 `required` 、 `checked` 、 `readOnly` といったアトリビュートを使う際によく見かけられます。
173
+
174
+
175
+```javascript
176
+// 以下の2つはボタンを使用不能にするという意味でJSXでは同義です。
177
+<input type="button" disabled />;
178
+<input type="button" disabled={true} />;
179
+
180
+// 以下の2つはボタンを使用不能にしないという意味でJSXでは同義です。
181
+<input type="button" />;
182
+<input type="button" disabled={false} />;
183
+```
184
+
185
+### 子要素の表現
186
+
187
+同様に、JavaScriptは子要素を表現するのに使われることもあります。
188
+
189
+```javascript
190
+// 入力 (JSX):
191
+var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>;
192
+// 出力 (JS):
193
+var content = React.createElement(
194
+ Container,
195
+ null,
196
+ window.isLoggedIn ? React.createElement(Nav) : React.createElement(Login)
197
+);
198
+```
199
+
200
+### コメント
201
+
202
+JSXにコメントを加えるのは簡単です。ただのJSの書き方です。タグの内側にコメントを書く時には、 `{}` で囲うことに注意してください。
203
+
204
+```javascript
205
+var content = (
206
+ <Nav>
207
+ {/* 子要素にコメントを書く時には、 {} で囲う */}
208
+ <Person
209
+ /* 複数
210
+ 行
211
+ コメント */
212
+ name={window.isLoggedIn ? window.name : ''} // 行末コメント
213
+ />
214
+ </Nav>
215
+);
216
+```
217
+
218
+> 注意:
219
+> JSXはHTMLに似ていますが、全く同じではありません。いくつかのキーの違いについては[JSXの理解](/react/docs/jsx-gotchas.html) をご覧ください。
\ No newline at end of file