teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

修正

2018/03/25 11:31

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,14 +1,41 @@
1
1
  React,Reduxでアプリを作っているのですが、stateのlistが上手く更新できません
2
2
  [先日の質問](https://teratail.com/questions/98157)を参考にして、入れ子のリストを使ったreducerを実装しています。
3
3
 
4
+ # なにがしたいのか
5
+ 上述のページで質問したことも踏まえて、
6
+ 「入れ子リストのstateをreduxを用いて実装し、そこにリストを追加する」です。
7
+
4
8
  # 実装したいものの概要
5
- 質問を投稿できる簡単なサービスです。
6
- DBサーバーに質問があり、componentDidMount()で通信し、データを読み込み描画します。
7
- また、質問を投稿することでサーバーにデータが送られ、
8
- 投稿後サーバーから質問リストを取得、描画します。
9
+ まず2次元配列のような入れ子のリストのstate用意します。
10
+ ```
11
+ questionList:[
12
+ ['title1','message1'],
13
+ ['title2','message2'],
14
+ ['title3','message3'],
15
+ ['title4','message4'],
16
+ ['title5','message5'],
17
+ ]
18
+ ```
19
+ ユーザーがボタンを押したタイミングでここに新たな[title6,message6]を追加したいのです。
9
20
 
21
+ ```
22
+ questionList:[
23
+ ['title1','message1'],
24
+ ['title2','message2'],
25
+ ['title3','message3'],
26
+ ['title4','message4'],
27
+ ['title5','message5'],
28
+ ['title6','message6'],
29
+ ]
30
+ ```
10
31
 
11
32
 
33
+ しかし、ここでただ単に追加するだけなのであれば、以下のコードで実現します。
34
+ しかし、ここでは
35
+ ボタン押す→サーバーに追加→サーバーから全データを取得→描画
36
+ としたいので、以下のコードでは問題が起こります。
37
+
38
+
12
39
  # 問題が生じているコード
13
40
  ```javascript
14
41
  import * as actionTypes from "../actionTypes"
@@ -69,49 +96,51 @@
69
96
  export default questionListsReducer
70
97
  ```
71
98
 
72
- # 実現したい
99
+ # どんな問題が起るか
73
- stateのlistのtitleの中身を例えば、
74
- 初期読み込み時にサーバーから取得した時`a,b,c,d,e`更新されたして
100
+ 初期値としてサーバー5つのデータ、仮にそのtitleがa,b,c,d,eという文字列だすると
75
- `f`というタイトルの質問を投稿したあとに、`a,b,c,d,e,f`に更新したい。
76
101
 
77
- # くわかっていないこ
102
+ 初期値は以下のうになっていします。
103
+ ```
104
+ [
105
+ ['a','message1'],
106
+ ['b','message2'],
78
- Reducerのロジックについて全然理解していないのですが、
107
+ ['c','message3'],
79
- Reducerを用いてstateを更新したときは、変更前の値にappendされているような形式になるのは一般的なのでしょうか。
108
+ ['d','message4'],
109
+ ['e','message5'],
110
+ ]
111
+ ```
80
112
 
81
- というのも、上のコードを実行した時、
82
- 初期読み込み後のquestionListのlength出力させると(DBサーバーにデータ5つの時)
113
+ ここで、ボタン押し、サーバーに1つ新しいデータfを送り全データを取得すると、
83
- `5`
114
+ ```
115
+ [
116
+ ['a','message1'],
117
+ ['b','message2'],
84
- と、consoleに表示されます。
118
+ ['c','message3'],
119
+ ['d','message4'],
120
+ ['e','message5'],
121
+ ['a','message1'],
122
+ ['b','message2'],
123
+ ['c','message3'],
124
+ ['d','message4'],
125
+ ['e','message5'],
126
+ ['f','message5'],
127
+ ]
85
128
 
86
- ここに、新たに「質問」を投稿してDBサーバーにデータを1つ追加し、6つになった後は、
87
- `10`
129
+ ```
88
- `22`
89
- `22`
90
- 出力されます。(理想は`6`です)
130
+ いう風に追加されてしいます。
91
131
 
92
- questionListの中身が具体的にどのように更新されているかというと、DBのデータが
93
- `a,b,c,d,e`で`f`を追加しようとした時、
94
- `a,b,c,d,e,null,null,null,null,null`←とちゅう
95
- `a,b,c,d,e,a,b,c,d,e,a,b,c,d,e,f,a,b,c,d,e,f`←最終
96
- という風に更新さます。
132
+ を、
97
-
98
- なので、どこが問題なのかというと、
99
- viewに表示するときはサーバーからデータの個数を取得し、
100
- ```javascript
101
- for(let = i; i<length; i++){
102
- questionList[i].title
103
- }
104
133
  ```
134
+ [
135
+ ['a','message1'],
136
+ ['b','message2'],
137
+ ['c','message3'],
138
+ ['d','message4'],
139
+ ['e','message5'],
140
+ ['f','message5'],
141
+ ]
142
+ ```
105
- のようにしす。
143
+ とい更新す。
106
144
 
107
- ですので、投稿後はi=1~6となり全てのデータ表示されるはずですが、
108
- listの中身は、
109
- `a,b,c,d,e,a,b,c,d,e,a,b,c,d,e,f,a,b,c,d,e,f`
110
- のようになっているので、
111
- `a,b,c,d,e,a`と表示されてしまいます。
112
145
 
113
- これが、「Reducerの本来的なstate更新のカタチです」と言われれば、
114
- `i`の部分を修正しようと思いますが、
115
- reducerについてよく理解していないので、これが合っているのか間違っているのかもわかりません。
116
-
117
146
  よろしくお願いします。

4

修正

2018/03/25 11:31

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -83,7 +83,7 @@
83
83
  `5`
84
84
  と、consoleに表示されます。
85
85
 
86
- ここに、新たに「質問」を投稿してDBサーバーにデータを1つ追加し、5つになった後は、
86
+ ここに、新たに「質問」を投稿してDBサーバーにデータを1つ追加し、6つになった後は、
87
87
  `10`
88
88
  `22`
89
89
  `22`

3

修正

2018/03/25 09:02

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -91,7 +91,7 @@
91
91
 
92
92
  questionListの中身が具体的にどのように更新されているかというと、DBのデータが
93
93
  `a,b,c,d,e`で`f`を追加しようとした時、
94
- `a,b,c,d,e,null`←とちゅう
94
+ `a,b,c,d,e,null,null,null,null,null`←とちゅう
95
95
  `a,b,c,d,e,a,b,c,d,e,a,b,c,d,e,f,a,b,c,d,e,f`←最終
96
96
  という風に更新されます。
97
97
 

2

加筆

2018/03/25 08:57

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -70,9 +70,9 @@
70
70
  ```
71
71
 
72
72
  # 実現したいこと
73
- stateを
73
+ stateのlistのtitleの中身例えば、
74
- `a,b,c,d,e`から
74
+ 初期読み込み時にサーバーから取得した時に`a,b,c,d,e`と更新されたとして、
75
- `a,b,c,d,e,f`に更したい。
75
+ `f`というタイトルの質問を投稿したあとに、`a,b,c,d,e,f`に更したい。
76
76
 
77
77
  # よくわかっていないこと
78
78
  Reducerのロジックについて全然理解していないのですが、

1

加筆

2018/03/25 08:53

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,10 @@
1
1
  React,Reduxでアプリを作っているのですが、stateのlistが上手く更新できません
2
- https://teratail.com/questions/98157
2
+ [先日の質問](https://teratail.com/questions/98157)を参考にして、入れ子のリストを使ったreducerを実装しています。
3
3
 
4
4
  # 実装したいものの概要
5
5
  質問を投稿できる簡単なサービスです。
6
+ DBサーバーに質問があり、componentDidMount()で通信し、データを読み込み描画します。
6
- DBサーバーに質問があり、投稿することでサーバーにデータが送られ、
7
+ また、質問投稿することでサーバーにデータが送られ、
7
8
  投稿後、サーバーから質問リストを取得し、描画します。
8
9
 
9
10