前回では、
- Reducerの結合について
- Redux Thunk ミドルウェアについて
を学びました。
今回は、今までの基礎を使っての応用になりそうです。
Redux を使用してカウンターを記述する
いきなりですが、Reduxを使用したカウンターを作成しました。
下記が課題になります。
このレッスンでは、Redux を使用したシンプルなカウンターをゼロから実装します。 基本的な部分はコードエディターに用意してありますが、詳細は皆さんが記述する必要があります。 用意された名前を使用して、
https://www.freecodecamp.org/japanese/learn/front-end-development-libraries/redux/write-a-counter-with-reduxincAction
とdecAction
というアクションクリエイター、counterReducer()
、およびINCREMENT
とDECREMENT
というアクションタイプを定義し、最後に Reduxstore
を定義してください。 完成すると、INCREMENT
またはDECREMENT
アクションをディスパッチして、store
に保持されている state を 1 増やすまたは 1 減らすことができるようになります。 初めての Redux アプリを作成できるようがんばってください!
解答は下記のようになりました。
state を決してミューテートしない
以前の記事 で勉強していたのですが、
Reactでは、値が直接変更してはならず、新しいオブジェクトを生成する必要がありました。
なので、push ( )およびsplice ( )のような関数は配列を直接変更変更するので使用できません。
よく使用する関数としては、map(),filter()などのようです。
これは、Reduxにも当てはまるようです。
以下のような課題がありました。
コードエディターに、To-do アイテムを管理する
https://www.freecodecamp.org/japanese/learn/front-end-development-libraries/redux/never-mutate-statestore
とreducer
があります。 リデューサーのADD_TO_DO
case を書き換えて、state の末尾に新しい To-do を追加してください。
標準的な JavaScript または ES6 を使用して、いくつかの方法でこのことを実行できます。action.todo
からのアイテムが末尾に追加された新しい配列を返す方法を見つけてください。
解答は下記のようになりました。(CodeSandBoxでエラーが出ているのは、今回の課題ではdispatchの記述やtodoの値がなかったため解答のみCodeSandBox上で表示しています。)
return […state, action.todo] の部分は return state.concat(action.todo);でも大丈夫でした。
配列でスプレッド演算子を使用する
ES6からスプレッド演算子”…”が使用できるようになったようです。
下記のようなコードを記述します。
let newArray = [...myArray];
このコードの意味としては、newArrayがmyArrayの複製(クローン)になります。
なので、どちらもPCのメモリ内に別のものとして作成されるようです。
また、スプレッド構文を用いて配列を複製して新しい配列を追加する場合、
[...myArray, 'newvalue'];
とすることができます。
下記のコードを試しに実行してみると、、、
となりました。
クローンなので同じものかという問いには
const isSameObj = originalArray === newArray; // false
同じものを参照しているかについては、
const isSameValue = originalArray[0] === newArray[0]; // true
となっていました。
課題としては下記のようなものがありました。
スプレッド演算子を使用して、To-do が追加されたときに state の新しいコピーを返してください。
https://www.freecodecamp.org/japanese/learn/front-end-development-libraries/redux/use-the-spread-operator-on-arrays
解答としては下記のようになりました。(CodeSandBoxでエラーが出ていますが、解答のみCodeSandBox上で表示しています。)
となりました。
配列からアイテムを削除する
配列からアイテムを削除するには、
slice()
や concat()
メソッドがあるようです。
下記のような課題がありました。
アイテムのインデックスに基づいて配列からアイテムを削除するように、リデューサーとアクションクリエイターを変更しました。 レデューサーの記述を完成させて、指定されたインデックスのアイテムが削除された、新しい state 配列を返すようにしてください。
https://www.freecodecamp.org/japanese/learn/front-end-development-libraries/redux/remove-an-item-from-an-array
下記のような解答になりました。
Object.assign を使用してオブジェクトをコピーする
state が object
の場合にも状態の不変性 (イミュータビリティ) を強制して、オブジェクトを扱うのに便利なツールとして Object.assign()
があるそうです。
const newObject = Object.assign({}, obj1, obj2);
1 つ目の引数として空のオブジェクトを渡し、その後にコピーしたいオブジェクトを渡します。
下記のような課題がありました。
Redux の state とアクションが、
https://www.freecodecamp.org/japanese/learn/front-end-development-libraries/redux/copy-an-object-with-object-assignstate
に対してobject
を処理するように変更されました。status
プロパティを文字列online
に設定する、タイプがONLINE
のアクションに対して、新しいstate
オブジェクトを返すようにコードを編集してください。 チャレンジを完了するにはObject.assign()
を使用してください。
解答は下記のようになりました。
今回は、Reduxの応用でした。
stateはミューテートしない出会ったり、stateがオブジェクトの場合には、 Object.assign()
を使用するようです。
イメージがつきにくいので作成していく中でもう少し煮詰めていこうと思います。