昨日(10月23日)にReact 16.6がリリースされていましたが、入った新機能の3つが3つともありがたいものでした。
関数コンポーネントのPureComponent
化…React.memo
以前に書いたように、state
のない関数コンポーネントとPureComponent
は本来相性が良いはずなのですが、PureComponent
はクラスコンポーネントである必要があるため、「そのためだけにクラスコンポーネントにする」「補助関数でクラスコンポーネントを生成する」などの手間を強いられていました。
React 16.6では、関数コンポーネントをPureComponent
化するReact.memo
関数が登場したため、もう悩む必要もなくなりました。
クラスコンポーネントへのContext
適用…Component.contextType
逆に、クラスコンポーネントで書きづらかったのが、React 16.3以降のコンテキストで、値がRender propsの引数となるために、別に関数コンポーネントを立てて値を受け取るなどの手間が必要でした。
React 16.6では、コンポーネントの静的プロパティ(SomeComponent.contextType = SomeContext;
のように代入する、あるいはクラス内部でstatic contextType = SomeContext;
のようにする)としてcontextType
にコンテキストを指定することができるようになりました。こうすると、render
やcomponentDidMount
などのライフサイクルメソッドで、this.context
としてコンテキストが取れるようになります。
なお、複数のコンテキストが必要な場合は従来どおりRender Propsを使ってください、とのことです。
コンポーネントの遅延ロード…React.lazy
/React.Suspense
巨大なアプリになれば、全部一気にダウンロードするとなるとかなり重くなってしまいます。Webpackでもimport()
が動くようになっていますが、Reactでそれを支援する機能が登場しました。
まず、React.lazy
を使って遅延ロード用のコンポーネントを生成します。引数には関数を指定しますが、
- 引数に指定するのは、実行すると
import
を実行する関数 - その関数の返り値は、
default
からコンポーネントを取れるオブジェクト1を返すPromise
というようなものになります。そして、<React.Suspense fallback={ ... }>
の中でこのコンポーネントを使うと、読み込めていないタイミングではfallback
の中身を使う、というような動きになります(Suspense
のない箇所で使って、読み込みができていないとエラーになります。)。
import React, {lazy, Suspense} from 'react';
const OtherComponent = lazy(() => import('./OtherComponent'));
function MyComponent() {
return (
<Suspense fallback={<div>Loading...</div>}>
<OtherComponent />
</Suspense>
);
}
外部リンク
脚注
-
default importでなかった場合に、
{default: SomeComponent}
のようなオブジェクトに変換して渡す、というような方法も考えられます。 ↩