回答編集履歴

13

テキスト修正

2019/12/01 00:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -204,11 +204,11 @@
204
204
 
205
205
  ```
206
206
 
207
- 上記の `PersonRow` を使うと、 `ListApp` は以下のようになりま
207
+ 上記の `PersonRow` を使また 配列`people` はpropsから受け取るようにして、`ListApp` は以下のようになりました
208
208
 
209
209
  ```jsx
210
210
 
211
- export default function ListApp(props) {
211
+ export default function ListApp({ people }) {
212
212
 
213
213
  const [openId, setOpenId] = React.useState(null);
214
214
 

12

テキスト修正

2019/12/01 00:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- - 変数名を `open` ではなく `openId` とし、値としては、boolean ではなく、ダイアログを開く対象となるpeople要素のidである文字列を入れる。
31
+ - 変数名を `open` ではなく `openId` とし、その値として boolean ではなく、ダイアログを開く対象となるpeople要素の`id` を入れる。
32
32
 
33
33
  - すなわち `openId`が`"1"` のときは `"taro"` の `item` リストをダイアログで表示する。
34
34
 
@@ -44,7 +44,7 @@
44
44
 
45
45
  `export default function List(props)`
46
46
 
47
- のコードを元に、上記の方針による修正を行ったものが、以下です。(__注:名前を__ `List`__から__ `ListApp` __に変えています。これは__`@material-ui/icons/List` __からimport された__`List`__と、名前が重複するのを避けるためです。__)
47
+ のコードを元に、上記の設計による修正を行ったものが、以下です。(__注:名前を__ `List`__から__ `ListApp` __に変えています。これは__`@material-ui/icons/List` __からimport された__`List`__と、名前が重複するのを避けるためです。__)
48
48
 
49
49
 
50
50
 

11

テキスト修正

2019/11/30 23:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  ```
14
14
 
15
- で取得される `open` はbooleanであり、これを、peopleの要素数分作られる `<SimpleDialog>` のどれに対しても prop `open`として渡していますが、これだと、`setOpen(true)` によって`open` が trueになったときに、3つの`<SimpleDialog>` prop `open` はどれも true が渡されて、3つのダイアログともに開いた状態になってしまいます。そのために結果として
15
+ で取得される `open` を、peopleの要素数分作られる `<SimpleDialog>` のどれに対しても prop `open`として渡していますが、これだと、`setOpen(true)` によって`open` が trueになったときに、の`<SimpleDialog>` についても prop `open` は true が渡されます。従って、全てのダイアログ開いた状態になってしまいます。そのために結果として
16
16
 
17
17
 
18
18
 
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- 修正方法の一案として、下記のように state に入れておく値を設計しなおすことが考えられます。
27
+ 上記を避けるための修正の一案として、下記のように state に入れておく値を設計しなおすことが考えられます。
28
28
 
29
29
 
30
30
 

10

テキスト修正

2019/11/30 23:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -164,7 +164,7 @@
164
164
 
165
165
 
166
166
 
167
- 上記の回答に挙げた`ListApp` のコードは、ご質問に挙げられている `List` のコードに対して最小限の修正をしたものですが、さらにリファクタして、以のようなりした
167
+ 上記の回答に挙げた`ListApp` のコードは、ご質問に挙げられている `List` のコードに対して最小限の修正をしたものですが、さらにリファクタしたものを挙げ
168
168
 
169
169
 
170
170
 

9

テキスト修正

2019/11/30 14:11

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -172,7 +172,7 @@
172
172
 
173
173
 
174
174
 
175
- (__注: 以下のコード、何故かシンタクスハイライト効きせん。そ多少見にくいですがご了承ください。__)
175
+ のコードでは`makeTable`という関数が`ListApp`の中にありこれテーブル行の配列を返していしたが、こような関数を作るのならば、いっそのこと関数コンポーネントとして切り出そうという趣旨、切り出単位を一行分として、`PersonRow` とうコンポーネントにしました
176
176
 
177
177
 
178
178
 
@@ -202,7 +202,11 @@
202
202
 
203
203
  );
204
204
 
205
-
205
+ ```
206
+
207
+ 上記の `PersonRow` を使うと、 `ListApp` は以下のようになります。
208
+
209
+ ```jsx
206
210
 
207
211
  export default function ListApp(props) {
208
212
 
@@ -256,7 +260,7 @@
256
260
 
257
261
 
258
262
 
259
- 元のコードでは、`makeTable`という関数が`ListApp`の中にあり、これがテーブル行の配列を返していましたが、このような関数を作るのならば、いっそのこと関数コンポーネントとして切り出そうという趣旨で、切り出す単位を一行分として、`PersonRow` というコンポーネントにしました。
263
+
260
264
 
261
265
 
262
266
 

8

テキスト修正

2019/11/30 14:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  - すなわち `openId`が`"1"` のときは `"taro"` の `item` リストをダイアログで表示する。
34
34
 
35
- - `openId`が `null` のとき、どの要素に対するダイアログ閉じている。これを初期値とする。
35
+ - `openId`が `null` のとき、ダイアログは全て閉じている。これを初期値とする。
36
36
 
37
37
 
38
38
 

7

テキスト修正

2019/11/30 13:43

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- 修正方法の一案として、下記のように state に入れておく値を設計すことが考えられます。
27
+ 修正方法の一案として、下記のように state に入れておく値を設計しなおすことが考えられます。
28
28
 
29
29
 
30
30
 

6

テキスト追加

2019/11/30 13:35

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -28,9 +28,9 @@
28
28
 
29
29
 
30
30
 
31
- - `open` ではなく `openId` とし、値としては、boolean ではなく、ダイアログを開く対象となるpeople要素のidプロパティの文字列を入れることにする
31
+ - 変数名を `open` ではなく `openId` とし、値としては、boolean ではなく、ダイアログを開く対象となるpeople要素のidである文字列を入れる。
32
-
32
+
33
- - すなわち `openId`が`"1"` のときは `"taro"` の持ち物をダイアログで表示する。
33
+ - すなわち `openId`が`"1"` のときは `"taro"` の `item` リストをダイアログで表示する。
34
34
 
35
35
  - `openId`が `null` のとき、どの要素に対するダイアログも閉じている。これを初期値とする。
36
36
 

5

テキスト修正

2019/11/30 13:16

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -180,7 +180,7 @@
180
180
 
181
181
  const PersonRow = ({ person, open, onOpen, onClose }) => (
182
182
 
183
- <TableRow hover key={person.id} tabIndex={-1}>
183
+ <TableRow hover tabIndex={-1}>
184
184
 
185
185
  <TableCell align="center">{person.id}</TableCell>
186
186
 
@@ -220,6 +220,8 @@
220
220
 
221
221
  <PersonRow
222
222
 
223
+ key={person.id}
224
+
223
225
  person={person}
224
226
 
225
227
  open={openId === person.id}
@@ -248,11 +250,13 @@
248
250
 
249
251
  }
250
252
 
253
+
254
+
251
255
  ```
252
256
 
253
257
 
254
258
 
255
- 元のコードでは、`makeTable`という関数`ListApp`の中に作って、これによって、テーブル行の配列を返させていましたが、関数を作るのならば、関数コンポーネントとして切り出そうという趣旨で、一行分`PersonRow` というコンポーネントにしました。
259
+ 元のコードでは、`makeTable`という関数`ListApp`の中にあり、これテーブル行の配列を返ていましたが、このような関数を作るのならば、いっそのこと関数コンポーネントとして切り出そうという趣旨で、切り出す単位を一行分として、`PersonRow` というコンポーネントにしました。
256
260
 
257
261
 
258
262
 

4

テキスト修正

2019/11/30 13:12

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -172,6 +172,8 @@
172
172
 
173
173
 
174
174
 
175
+ (__注: 以下のコード、何故か、シンタクスハイライトが効きません。その点、多少見にくいですがご了承ください。__)
176
+
175
177
 
176
178
 
177
179
  ```jsx

3

テキスト修正

2019/11/30 13:06

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- ## ListApp
53
+ ### ListApp
54
54
 
55
55
  ```jsx
56
56
 
@@ -155,3 +155,107 @@
155
155
 
156
156
 
157
157
  以上、参考になれば幸いです。
158
+
159
+
160
+
161
+
162
+
163
+ ## 追記
164
+
165
+
166
+
167
+ 上記の回答に挙げた`ListApp` のコードは、ご質問に挙げられている `List` のコードに対して最小限の修正をしたものですが、さらにリファクタして、以下のようになりました。
168
+
169
+
170
+
171
+ ### ListApp (修正版)
172
+
173
+
174
+
175
+
176
+
177
+ ```jsx
178
+
179
+ const PersonRow = ({ person, open, onOpen, onClose }) => (
180
+
181
+ <TableRow hover key={person.id} tabIndex={-1}>
182
+
183
+ <TableCell align="center">{person.id}</TableCell>
184
+
185
+ <TableCell align="center">{person.name}</TableCell>
186
+
187
+ <TableCell>
188
+
189
+ <IconButton onClick={onOpen}>
190
+
191
+ <ListIcon />
192
+
193
+ </IconButton>
194
+
195
+ <SimpleDialog open={open} onClose={onClose} itemList={person.item} />
196
+
197
+ </TableCell>
198
+
199
+ </TableRow>
200
+
201
+ );
202
+
203
+
204
+
205
+ export default function ListApp(props) {
206
+
207
+ const [openId, setOpenId] = React.useState(null);
208
+
209
+ return (
210
+
211
+ <Table>
212
+
213
+ <TableBody>
214
+
215
+ {people &&
216
+
217
+ people.map(person => (
218
+
219
+ <PersonRow
220
+
221
+ person={person}
222
+
223
+ open={openId === person.id}
224
+
225
+ onOpen={() => {
226
+
227
+ setOpenId(person.id);
228
+
229
+ }}
230
+
231
+ onClose={() => {
232
+
233
+ setOpenId(null);
234
+
235
+ }}
236
+
237
+ />
238
+
239
+ ))}
240
+
241
+ </TableBody>
242
+
243
+ </Table>
244
+
245
+ );
246
+
247
+ }
248
+
249
+ ```
250
+
251
+
252
+
253
+ 元のコードでは、`makeTable`という関数を `ListApp`の中に作って、これによって、テーブル行の配列を返させていましたが、関数を作るのならば、関数コンポーネントとして切り出そうという趣旨で、一行分を `PersonRow` というコンポーネントにしました。
254
+
255
+
256
+
257
+ - **動作確認用codesandbox:** [https://codesandbox.io/s/q225208-nlscn](https://codesandbox.io/s/q225208-nlscn)
258
+
259
+
260
+
261
+ あくまでリファクタの一例として参考にして頂ければと思います。

2

テキスト修正

2019/11/30 13:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  - すなわち `openId`が`"1"` のときは `"taro"` の持ち物をダイアログで表示する。
34
34
 
35
- - `openId`の初期値は `null` と、どの要素に対するダイアログも閉じている。
35
+ - `openId` `null` 、どの要素に対するダイアログも閉じている。これを初期値とする。
36
36
 
37
37
 
38
38
 
@@ -44,7 +44,7 @@
44
44
 
45
45
  `export default function List(props)`
46
46
 
47
- のコードを元に、上記の修正を行ったものが、以下です。(注:名前を `List`から `ListApp` に変えています。これは`@material-ui/icons/List` からimport された`List`と、名前が重複するのを避けるためです。)
47
+ のコードを元に、上記の方針による修正を行ったものが、以下です。(__注:名前を__ `List`__から__ `ListApp` __に変えています。これは__`@material-ui/icons/List` __からimport された__`List`__と、名前が重複するのを避けるためです。__
48
48
 
49
49
 
50
50
 

1

テキスト修正

2019/11/30 12:30

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  ```
14
14
 
15
- で取得される `open` はbooleanであり、これを、peopleの要素数分作られる `<SimpleDialog>` のどれに対しても渡していますが、これだと、`open` が trueになったときに、3つの`<SimpleDialog>` のprop `open` すべてに true が渡て、3つとも開いた状態になってしまいます。そのために結果として
15
+ で取得される `open` はbooleanであり、これを、peopleの要素数分作られる `<SimpleDialog>` のどれに対しても prop `open`として渡していますが、これだと、`setOpen(true)` によって`open` が trueになったときに、3つの`<SimpleDialog>` のprop `open` はどれも true が渡されて、3つのダイアログとも開いた状態になってしまいます。そのために結果として
16
16
 
17
17
 
18
18
 
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- ということになるものと思われます。
23
+ という(ように見えてしまう)ことになるものと思われます。
24
24
 
25
25
 
26
26
 
@@ -40,7 +40,113 @@
40
40
 
41
41
 
42
42
 
43
+ ご質問のコードにある
44
+
45
+ `export default function List(props)`
46
+
47
+ のコードを元に、上記の修正を行ったものが、以下です。(注:名前を `List`から `ListApp` に変えています。これは`@material-ui/icons/List` からimport された`List`と、名前が重複するのを避けるためです。)
48
+
49
+
50
+
51
+
52
+
53
+ ## ListApp
54
+
55
+ ```jsx
56
+
57
+ export default function ListApp(props) {
58
+
59
+ const [openId, setOpenId] = React.useState(null);
60
+
61
+
62
+
63
+ const handleClickOpen = id => {
64
+
65
+ setOpenId(id);
66
+
67
+ };
68
+
69
+
70
+
71
+ const handleClose = () => {
72
+
73
+ setOpenId(null);
74
+
75
+ };
76
+
77
+
78
+
79
+ const makeTable = people => {
80
+
81
+ if (people) {
82
+
83
+ return people.map(person => {
84
+
85
+ return (
86
+
87
+ <TableRow hover key={person.id} tabIndex={-1}>
88
+
89
+ <TableCell align="center">{person.id}</TableCell>
90
+
91
+ <TableCell align="center">{person.name}</TableCell>
92
+
93
+ <TableCell>
94
+
95
+ <IconButton
96
+
97
+ onClick={() => {
98
+
99
+ handleClickOpen(person.id);
100
+
101
+ }}
102
+
103
+ >
104
+
105
+ <ListIcon />
106
+
107
+ </IconButton>
108
+
109
+ <SimpleDialog
110
+
111
+ open={openId === person.id}
112
+
113
+ onClose={handleClose}
114
+
115
+ itemList={person.item}
116
+
117
+ />
118
+
119
+ </TableCell>
120
+
121
+ </TableRow>
122
+
123
+ );
124
+
125
+ });
126
+
127
+ }
128
+
129
+ };
130
+
131
+
132
+
133
+ return (
134
+
135
+ <Table>
136
+
137
+ <TableBody>{makeTable(people)}</TableBody>
138
+
139
+ </Table>
140
+
141
+ );
142
+
143
+ }
144
+
145
+ ```
146
+
147
+
148
+
43
- は、ご質問コードをcodesandboxに転記し、上記の修正を行ったものです。
149
+ 上記の `<ListApp />` を、のcodesandboxにて動作確認きます。
44
150
 
45
151
 
46
152
 
@@ -48,8 +154,4 @@
48
154
 
49
155
 
50
156
 
51
- なお、ご質問にある `List` コンポーネントは、 `@material-ui/icons/List` からimport された`List`と名前が重複するので、上記のcodesandboxに作成したサンプルでは `ListApp` という名前にしています。
52
-
53
-
54
-
55
157
  以上、参考になれば幸いです。