回答編集履歴

6

テキスト修正

2019/08/01 08:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- のように `App` の `state` を配列に修正したときに、それに対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
25
+ のように `App` の `this.state.types` を配列に修正したときに、それに対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
26
26
 
27
27
 
28
28
 

5

テキスト修正

2019/08/01 08:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- のように `App` の `state` と `render` を修正したときに、その修正に対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
25
+ のように `App` の `state` を配列に修正したときに、そに対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
26
26
 
27
27
 
28
28
 

4

テキスト修正

2019/07/31 05:35

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -260,4 +260,4 @@
260
260
 
261
261
 
262
262
 
263
- render で、 `sortedTypes` と、this.state.types のエントリを配列にして、name でソートしているのは、this.state.types をオブジェクトにすると、エントリの順番が失われるので、常に同じ順番で表示されるように、とりあえず、 name の昇順にソートしてみた、という意図です。
263
+ render で、 `this.state.types` のエントリを配列にして、name でソートした `sortedTypes` を作っているのは、`this.state.types` をオブジェクトにすると、エントリの順番が失われるので、常に同じ順番で表示されるように、とりあえず、 name の昇順にソートしてみた、という意図です。

3

テキスト修正

2019/07/31 03:14

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -160,7 +160,7 @@
160
160
 
161
161
  types: { ...types, [name]: types[name] + 1 },
162
162
 
163
- mess: `${e.target.name}を1増やしました。`
163
+ mess: `${name}を1増やしました。`
164
164
 
165
165
  });
166
166
 
@@ -178,7 +178,7 @@
178
178
 
179
179
  types: { ...types, [name]: types[name] - 1 },
180
180
 
181
- mess: `${e.target.name}を1減らしました。`
181
+ mess: `${name}を1減らしました。`
182
182
 
183
183
  });
184
184
 

2

テキスト修正

2019/07/31 03:08

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -102,8 +102,162 @@
102
102
 
103
103
 
104
104
 
105
- ### 追記
105
+ ### 追記1
106
106
 
107
107
 
108
108
 
109
109
  一点、気になったことは、`App` の `this.state` に、各 `MyState`にrender させる可変な内容を持たせているので、 `MyState` のほうは状態を持つ必要があるのか?ということでした。もし今後いろいろ修正していって、`MyState` のほうには状態を持たせる必要がない(つまり親コンポーネントである App から渡されるpropsだけによって、render する内容などの挙動が決まる)ということであれば、`MyState` はFunctional Component に書き直すとよいかと思います。
110
+
111
+
112
+
113
+ ### 追記2
114
+
115
+
116
+
117
+ `App` の this.state.types を、配列ではなく、 name をキーとし 回数を値とするオブジェクトにして、ご質問のタイトルにある `Computed property names` を使って setState するという方向で修正するとすれば、以下のようになるかと思います。
118
+
119
+
120
+
121
+ #### App.js
122
+
123
+ ```javascript
124
+
125
+ constructor(props) {
126
+
127
+ super(props);
128
+
129
+ this.state = {
130
+
131
+ types: {
132
+
133
+ ccc: 0,
134
+
135
+ aaa: 0,
136
+
137
+ bbb: 0
138
+
139
+ },
140
+
141
+ mess: ""
142
+
143
+ };
144
+
145
+ }
146
+
147
+ ```
148
+
149
+
150
+
151
+ ```javascript
152
+
153
+ handleClickInc(e) {
154
+
155
+ const { name } = e.target
156
+
157
+ const { types } = this.state
158
+
159
+ this.setState({
160
+
161
+ types: { ...types, [name]: types[name] + 1 },
162
+
163
+ mess: `${e.target.name}を1増やしました。`
164
+
165
+ });
166
+
167
+ }
168
+
169
+
170
+
171
+ handleClickDec(e) {
172
+
173
+ const { name } = e.target
174
+
175
+ const { types } = this.state
176
+
177
+ this.setState({
178
+
179
+ types: { ...types, [name]: types[name] - 1 },
180
+
181
+ mess: `${e.target.name}を1減らしました。`
182
+
183
+ });
184
+
185
+ }
186
+
187
+ ```
188
+
189
+
190
+
191
+ ```javascript
192
+
193
+ render() {
194
+
195
+
196
+
197
+ const sortedTypes = Object.entries(this.state.types)
198
+
199
+ .sort((e1, e2) => e1[0].localeCompare(e2[0]))
200
+
201
+
202
+
203
+ return (
204
+
205
+ <div>
206
+
207
+ {sortedTypes
208
+
209
+ .map(([name]) =>
210
+
211
+ <p key={name}>{name}: {localStorage.getItem(name)}</p>
212
+
213
+ )}
214
+
215
+ <MessBox mess={this.state.mess} />
216
+
217
+ {
218
+
219
+ sortedTypes.map(([name, count]) => (
220
+
221
+ <div key={name}>
222
+
223
+ <h1>{name}</h1>
224
+
225
+ <MyState
226
+
227
+ roletype={name}
228
+
229
+ nor={count}
230
+
231
+ name={name}
232
+
233
+ inc_mess="+1"
234
+
235
+ dec_mess="-1"
236
+
237
+ onClickInc={e => this.handleClickInc(e)}
238
+
239
+ onClickDec={e => this.handleClickDec(e)}
240
+
241
+ />
242
+
243
+ </div>
244
+
245
+ ))
246
+
247
+ }
248
+
249
+ </div>
250
+
251
+ );
252
+
253
+ }
254
+
255
+ ```
256
+
257
+
258
+
259
+ - 上記の修正: [this.state.types を nameをキーとするオブジェクトにする ](https://github.com/jun68ykt/q203448/commit/1f6e05eb1c401fba3b7cda3dccb4e0fa18e7f364)
260
+
261
+
262
+
263
+ render で、 `sortedTypes` と、this.state.types のエントリを配列にして、name でソートしているのは、this.state.types をオブジェクトにすると、エントリの順番が失われるので、常に同じ順番で表示されるように、とりあえず、 name の昇順にソートしてみた、という意図です。

1

テキスト修正

2019/07/31 03:05

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
 
84
84
 
85
- に、 `create-react-app` で作ったSPAに、ご質問に上げられてるコードを転記して作成したものを上げておきました。
85
+ に、 `create-react-app` で作ったSPAに、ご質問に上げられてるコードを転記して作成したものを上げておきました。
86
86
 
87
87
 
88
88
 
@@ -99,3 +99,11 @@
99
99
 
100
100
 
101
101
  以上、参考になれば幸いです。
102
+
103
+
104
+
105
+ ### 追記
106
+
107
+
108
+
109
+ 一点、気になったことは、`App` の `this.state` に、各 `MyState`にrender させる可変な内容を持たせているので、 `MyState` のほうは状態を持つ必要があるのか?ということでした。もし今後いろいろ修正していって、`MyState` のほうには状態を持たせる必要がない(つまり親コンポーネントである App から渡されるpropsだけによって、render する内容などの挙動が決まる)ということであれば、`MyState` はFunctional Component に書き直すとよいかと思います。