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
をプレーンなオブジェクトのプロトタイプとして扱う(「Treatnull
as a valid plain object prototype inisPlainObject()
」) -
connectAdvanced
はプロパティに変更が加えられたときのみ再描画する(「Add connectAdvanced() tests」)
Top comments (0)