React Reduxのv6.0.0が2018年12月5日にリリースされました。本稿はリリース情報にもとづいてその内容をご紹介します。
React Redux 6.0は、React 16.4から新たに備わったContext APIをサポートするはじめてのリリースです。したがって、React 16.4以降が必要です。v6の詳しい変更点や、React Reduxのこれまでの実装の変遷については「Idiomatic Redux: The History and Implementation of React-Redux」をご参照ください。
互換性を破る変更
React Redux 6.0に加えられた、後方互換性を破る変更はつぎのふたつです。
connectのwithRefオプションは、forwardRefに置き替えられました。connectに{forwardRef : true}が渡されると、接続したラッパーコンポーネントに参照を加えれば、そのコンポーネントのインスタンスが返されます。接続したコンポーネントにプロパティとして
storeは渡せなくなりました。替わりに、カスタムのプロパティcontext={MyContext}が、<Provider>と<ConnectedComponent>のどちらも受け取れます。また、connectのオプションとして渡せるのは{context : MyContext}です。
変更された動作
React Redux 6.0で、これまでと動きが変わるのはつぎのふたつです。
従来のコンテキストから
Storeインスタンスを参照しようとするライブラリは動作しなくなります。Storeの状態は、<Context.Provider>に納められるようになったからです。これによって動きが変わるのは、たとえばconnected-react-routerやreact-redux-subspaceです。(現在の実装では、Storeはそのコンテキストにも加えられます。けれど、コンテキストのStoreを参照する公開のAPIはありません。他のライブラリから参照できるようにしたものです。ただし、廃止される場合があります。)componentWillMountでコンストラクタから送出するActionに関わる動きが変わります。これまで、親コンポーネントのコンストラクタからの送出により、子はマウントされていればただちに更新された状態が使えました。コンポーネントがそれぞれStoreから個別に読み取るためです。React Redux 6.0では、すべてのコンポーネントがコンテクストから同じ現行のStore状態の値を得ます。ですから、ツリーの一貫性が保たれ、分裂することはありません。これは全体としては改善です。けれど、これまでの動作に依存するアプリケーションに影響する場合があります。
その他の変更
-
React.createContext()の使用(「Use React.createContext()」) - Prettierの使用(「Use Prettier」)
-
isValidElementTypeを開発ビルドでのみ実行(「remove react-is/isValidElementType from production builds」) -
isPlainObject()でnullをプレーンなオブジェクトのプロトタイプとして扱う(「Treatnullas a valid plain object prototype inisPlainObject()」) -
connectAdvancedはプロパティに変更が加えられたときのみ再描画する(「Add connectAdvanced() tests」)
Top comments (0)