⊗jsrxPmRDARR 32 of 57 menu

Reduxアプリケーションへのリデューサーの追加

前回のレッスンでは、 UserReactionコンポーネントを作成し、 各製品にユーザー反応を持たせました。 次に、ユーザーがいずれかの反応ボタンを クリックしたときに反応カウンターを処理する リデューサーを作成する必要があります。

製品アプリケーションを開き、 すべてのリデューサーが含まれるファイル productsSlice.jsを開きましょう。 次に、reducersプロパティ内に 別のリデューサーreactionClickedを作成します (productAddedの前など、最初に配置しても構いません。 順序は重要ではありません)。 通常通り、stateactionを パラメータとして渡します:

reactionClicked(state, action) {},

次に、前のステップで空のままにした中括弧の内側に コードを記述しましょう。 まず、actionオブジェクトの payloadから製品IDと反応名を抽出します:

const { productId, reaction } = action.payload

次に、渡されたステートから必要な製品を取得します:

const currentProduct = state.find(product => product.id === productId)

そのような製品が存在する場合は、 渡された反応の値を1増やします:

if (currentProduct) { currentProduct.reactions[reaction]++ }

これで完了です。 reactionClickedのコードが完成しました:

reactionClicked(state, action) { const { productId, reaction } = action.payload const currentProduct = state.find(product => product.id === productId) if (currentProduct) { currentProduct.reactions[reaction]++ } },

ファイルの最後に、作成されたaction creatorをエクスポートしましょう:

export const { reactionClicked, productAdded, productUpdated } = productsSlice.actions

ここで、2つの重要な点に注意する必要があります。 前回のレッスンから覚えているかもしれませんが、 リデューサー内でこのように直接値を更新することは 通常禁止されています(この行を見てください: reactions[reaction]++)。 しかし、これはImmerライブラリを使用している createSlice内で行っているため問題ありません。 Immerが、このコードを「安全な」値の更新に 変換してくれます。これにより、複雑なことを より簡単な方法で記述できるようになります。

次に覚えておくべきことは、 actionオブジェクトには、発生したことを示すために 必要な最小限の情報のみを含めるべきだということです。 アクション内で計算を行うべきではありません。 ステートを更新するためのすべての計算はリデューサーで 行うべきであり、必要なだけのロジックを ここに記述することができます。

学生アプリケーションを開き、 studentsSlice.jsファイルの reducersフィールドに、 レッスンで示したように、 もう1つのリデューサーvoteClickedを追加してください。 そのためのコードを記述してください。 あなたのリデューサーのタスクは、 クリックされたvote(または投票)の値を 該当する学生に対して1増やすことです。

ファイルの最後に、作成されたaction creator voteClickedをエクスポートすることを 忘れないでください。

日本語
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItalianoქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
当サイトでは、サイトの動作、分析、パーソナライゼーションのためにクッキーを使用しています。 データ処理はプライバシーポリシーに従って行われます。
すべて受け入れる 設定 拒否