たとえば、私ができる:
import React from 'react';
import PanelA from './panelA.jsx';
import PanelB from './panelB.jsx';
React.render(
<PanelA />
<PanelB />,
document.body
);
Reactがレンダリングする場所:
body
PanelA
PanelB
現在、私はエラーが発生しています:
Adjacent JSX elements must be wrapped in an enclosing tag
browserifyおよびbabelifyでトランスコンパイル中
React v16.0リリース以降、コンポーネント内にいるときに追加の要素でアイテムをラップせずにコンポーネントの配列をレンダリングできます。
render() {
return [
<li key="one">First item</li>,
<li key="two">Second item</li>,
<li key="three">Third item</li>,
<li key="four">Fourth item</li>,
];
}
キーを設定することだけを忘れないでください。
ReactDOM.render
では、reactにはルートが必要なので、複数のアイテムをレンダリングできません。したがって、ReactDOM.render
内で単一のコンポーネントをレンダリングし、内部コンポーネントでアイテムの配列をレンダリングできます。
バージョン16.2 <React.Fragment />
(または略して<></>
)が導入されたため、条件を使用できます。これが望ましい方法です。
return (
<React.Fragment>
<h1>Page title</h1>
<ContentComponent />
{this.props.showFooter && (
<footer>(c) stackoverflow</footer>
)}
</React.Fragment>
)
React 16以降、render()
メソッドからコンポーネントのリストを返すことができます。代わりに、レンダリングを簡単に調整できないため、リストの各コンポーネントにkey
属性を追加する必要があります。
return [
<h1 key="page-title">Page</h1>,
<ContentComponent key="content" />,
<footer>(c)stackoverflow</footer>
]
Reactの古いバージョンでは、複数のコンポーネントを囲む要素(タグ、コンポーネント)でラップしないとレンダリングできません。例えば:
return (
<article>
<h1>title</h1>
<meta>some meta</meta>
</article>
)
それらを1つの要素として実際に使用する場合は、それらからモジュールを作成する必要があります。
複数のコンポーネントを単一のタグにラップするだけです。例えば:
React.render(
<div>
<PanelA />
<PanelB />
</div>,
document.body
);
React 16より前では、同じrender()
内の複数のトップレベル要素では、親要素(通常は<div>
)ですべてをラップする必要があります。
render () {
return (
<div>
<Thing1 />
<Thing2 />
</div>
)
}
React 16では、最上位の要素の配列をレンダリングする機能が導入されました(それらにはすべて一意のキーが必要であるという警告があります)。
render () {
return ([
<Thing1 key='thing-1' />,
<Thing2 key='thing-2' />
])
}
React 16.2は<Fragment>
要素を導入しました。これは最初の例の<div>
とまったく同じように機能しますが、無意味な親<div>
をDOMの周りに残しません:
import React, { Fragment } from 'react'
...
render () {
return (
<Fragment>
<Thing1 />
<Thing2 />
</Fragment>
)
}
簡単な構文がありますが、ほとんどのツール(構文ハイライターなど)ではまだサポートされていません。
import React from 'react'
...
render () {
return (
<>
<Thing1 />
<Thing2 />
</>
)
}
複数のコンポーネントをレンダリングする場合は、ツリーのような構造を維持するために、コンポーネントを相互にネストする必要があります。これは Multiple Components のドキュメントページで説明されています
最終的には、最上位に1つのNodeがあれば機能します。
<div>
などのDOM要素を1つだけ使用できます
<div>
<PanelA />
<PanelB />
</div>
ただし、より複雑なアプリを作成し、より多くの相互リンクコンポーネントがある場合は、次のように親で子コンポーネントをラップするのが最適であることがわかります。
import React from 'react';
import PanelA from './panelA.jsx';
import PanelB from './panelB.jsx';
var PanelHolder = React.createClass({
render: function() {
return (
<div>
<PanelA />
<PanelB />
</div>
)
}
});
そして、メインのjsファイルで、次のようにします。
import React from 'react';
import PanelHolder from './panelHolder.jsx';
React.render(
<PanelHolder />
document.body
);