どうも、ぽっぽです。
Reduxの公式ドキュメントを読んで理解したことを紹介します。
Reduxについて解説して、どうやって正しく使うかを紹介します。最近のおすすめのツール(Redux Toolkit)の使い方とベストプラクティスを教えます。
Reduxとは何か
action
と呼ばれるイベントでアプリケーションのstate
を更新し管理するライブラリとパターンのこと
Reduxが提供するパターンとツールは、アプリケーションのstate
をいつ、どこで、なぜ、どうやって更新されるか理解しやすくなります。
Reduxは共有されたstate
を管理するのに役立つけれど、概念を学ばないとならないし、そのためのコードを書かないとなりません。そういったある種の制限をかけないとなりません。
Reduxが最も有用なときをまとめると
- アプリケーションの
state
が大きくたくさんの場所から参照される state
が頻繁に更新される- 更新のロジックが複雑
- 中規模から大規模のコードベースで沢山の人々に使われる
すべてアプリケーションはReduxを必要としません。アプリケーションを構築する前によく検討して、Reduxを使うかどうか決めましょう。
Reduxは小さなスタンドアローンのJSライブラリーです。でも、普通はいくつかの他のパッケージと一緒に使います。
React-redux
ReduxはUIフレームワークと一緒に使えます。よく利用される代表的なものはReactです。React-Reduxは公式パッケージです。Reactコンポーネントとstate
を読み出したり更新したりするRedux Storeを組み合わせます。
Redux Toolit
Reduxロジックを書くための推奨アプローチです。Reduxアプリケーションを構築する基本となるパッケージと関数が含まれます。Reduxのタスクをシンプルに記述できて、よくあるミスを未然に防ぎます。
Redux DevTools Extension
Redux Storeのstate
の状態を履歴として表示します。アプリケーションをデバッグするのに効果的です。
Reduxのコンセプト
アプリケーションはstate
、view
、actions
からなりたっています。one-way data flow
の例を示すと
State
はアプリケーションのある時点の状態を記録しています。UI
はstate
に基づいて描画されます。- ボタンをクリックしたりしてなにかが起こると
state
がイベントに応じて更新されます。 UI
が再描画されます。
複数のコンポーネントが同じstate
を共有する必要があるとき、特にそれらのコンポーネントが異なる場所に配置されているとき、親コンポーネントにstate
を移動させる必要がなくなります。
コンポーネントからstate
を抜き出してコンポーネントツリーの外に配置します。コンポーネントツリーのどこにあろうともactions
によってstate
にアクセスすることが出来ます。views
とstate
を独立して管理するルールを強制するコンセプトがコードをより構造的にメンテナンスしやすくさせます。
Immutability
Mutable
は可変、immutable
は決して変更されないことを意味します。
JavaScripのobjects
とarrays
は何もしなければすべてmutable
です。immutably
に更新するためには、コードでobjects/arrays
をコピーして、そのコピーを変更します。
手動でJavaScriptのarrya/object
をスプレッドオペレータを使う例を示します。
const obj = {
a: {
// To safely update obj.a.c, we have to copy each piece
c: 3
},
b: 2
}
const obj2 = {
// copy obj
...obj,
// overwrite a
a: {
// copy obj.a
...obj.a,
// overwrite c
c: 42
}
}
const arr = ['a', 'b']
// Create a new copy of arr, with "c" appended to the end
const arr2 = arr.concat('c')
// or, we can make a copy of the original array:
const arr3 = arr.slice()
// and mutate the copy:
arr3.push('c')
Reduxはすべてのstate
の更新はimmutably
に行われる必要があります。
用語
先にすす前に、Reduxで用いられるいくつかの用語について説明します。
Actions
action
はプレーンなtype
フィールドがあるJavaScriptオブジェクトです。アプリケーションで何かのイベントが起こることにたいして端的に説明する文字列のことです。例えばtodos/todoAdded
なら「Todoに追加すること」を表すなどです。たいてい文字列は"domain/eventName"
のように記述します。最初の部分は仕様やカテゴリーで2つ目は「何が起こったか」を表します。
任意のActionオブジェクトは追加情報としてpayload
と呼ばれるフィールドに情報を追加することがあります。
const addTodoAction = {
type: 'todos/todoAdded',
payload: 'Buy milk'
}
Action Creators
action creator
は関数です。actionオブジェクトを返します。
const addTodo = text => {
return {
type: 'todos/todoAdded',
payload: text
}
}
Reducers
reducer
は現在のstate
とaction
オブジェクトを受け取って、必要に応じてstateを更新する方法を決定する関数です。
Store
store
と呼ばれるオブジェクトに現在のReduxアプリケーションの状態を保持されています。
Dispatch
Reduxはdispatch
と呼ばれるメソッドを持っています。stateを更新する唯一の方法はactionオブジェクトを引数に渡してstore.dispatch()
を呼ぶことです。
Selectors
selector
はstoreからstateの情報を抜き出す方法を知っている関数です。