質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1165閲覧

この処理はReducerでやるのがベストですか?

atemu

総合スコア94

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2018/11/22 03:31

実環境を説明すると手間がかかるので、
Todoリストを想像してみます。

Todoリスト自体にtodoを加えたり削除したりする方法はもちろんわかります。
では例えば、複数のtodoを「コピー」したいと考えます。コピー&ペースト的なものを自前で実装する場合です。
(実際にTodoリストでコピー&ペーストを実装するようなことはなさそうかもしれないですが、例として考えてください)

javascript

1const initialState = { 2 todos: [], 3 clipboard: [], 4}; 5 6export default (state = initialState, action) => { 7 switch (action.type) { 8 case 'ADD_TODO': 9 return { 10 ...state, 11 todos: [ 12 ...state.todos, 13 { 14 completed: false, 15 text: action.payload.text, 16 }, 17 ], 18 }; 19 case 'COPY': 20 const clipboard = state.todos.slice( 21 action.payload.start, 22 action.payload.end 23 ); 24 return { 25 ...state, 26 clipboard, 27 }; 28 default: 29 return state; 30 } 31};

このように、同じreducer内での違うプロパティに依存したコードを書くことになります。
こういった形で実装自体はできるのですが、あまりこういったコードはみないような気がします。
問題なければこのままやりたいと思っているのですが、この実装をすることによるデメリット、および他の実装方法があるようであれば教えてください。

初歩的な質問かもしれないのですが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
React & Redux でそれなりの規模(reducerの数でいうと約20個)のSPA開発に従事してきました。

こういった形で実装自体はできるのですが、あまりこういったコードはみないような気がします。

はい。
reducer の各 case ごとのロジックについて、「これでよいのか?」と考えあぐねるお気持ちは自分も経験ありなので分かります。

React と Redux というフレームワークに乗っかれば、これらがかなりのことをやってくれますが、各reducerごとのstateオブジェクトの構造は開発者が自由に設計、実装したり、もしくは便利なモジュール(例えば、Immutable.js など)を使ったりもできるので、必然的に各アクションごとの case で次のstateを作ってreturnするコードは、お手本のないコードを書くことになりますよね。(ここで、お手本のないコードとは、分かりやすく言い換えると、「ググればどこかに自分の求めているコードがきっと見つかる、という類のものではない」ぐらいの意味です。)

React と Redux を使えば、状態の管理と状態変更によるDOMの更新はこれらのフレームワークに頼れるので、そのアプリ固有の提供したいサービスや問題解決のドメインを色濃く反映した state の設計と実装に頭を使う時間を割くことができる、とも言えます。

上記は、体験に基づく私個人の認識であることをご了解いただいた上で、ご質問に挙げられているコードを拝読しましても第一印象としては

「まあ確かに、そういうことをやりたいなら、こういうコードになるよね。」

という感じです。細かいところを言えば、

「state の clipboard は配列ではなく、todos の開始インデクスと終了インデクスを持っていればいいので、

javascript

1const initialState = { 2 todos: [], 3 clipboard: { 4 startIndex: -1, 5 endIndex: -1, 6 }, 7};

でもよいのでは? 」といった細かいツッコミを言えなくもないですが、これはご質問の本質的な回答にはならないでしょう。

stateの設計や実装および、各caseごとのロジックについて、開発者一人の判断で進めると心もとないという場合は、やはりコードレビューを行って、他の開発者の目に晒して改良案を求めて議論するのがよいと思います。

以上、参考になれば幸いです。

投稿2018/11/23 03:28

編集2018/11/23 08:14
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atemu

2018/11/23 04:23

ありがとうございます!! 大変参考になりました。 本質的な内容を見極めてくださっていて本当に助かりました。その通りですね。 (一応、実際の環境のコードではないので伝えきれていなかったのですが、この例だと、todoが仮に削除されたとしても、clipboard内にはデータを保持しておきたいと思っていたので、このようなデータ構造にしていました。) 丁寧なご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問