質問編集履歴

1

コードの改善

2019/12/07 05:33

投稿

Yhaya
Yhaya

スコア439

test CHANGED
File without changes
test CHANGED
@@ -203,3 +203,187 @@
203
203
  }
204
204
 
205
205
  ```
206
+
207
+
208
+
209
+ ---
210
+
211
+
212
+
213
+ ## 追記
214
+
215
+
216
+
217
+ 親要素からpropsとして渡して制御するように変更してみました。親要素に新たに各PaperFolder要素が選択されているかされていないかを知るための配列(`folderSelectedList`)を導入してこれをpropsとして子要素に渡すようにしてみたのですがうまく動作しません。どこがおかしいのでしょう?
218
+
219
+
220
+
221
+ ```javascript
222
+
223
+ class SideBar extends React.Component {
224
+
225
+ constructor(props) {
226
+
227
+ super(props);
228
+
229
+
230
+
231
+ this.state = {
232
+
233
+ isOpen: true,
234
+
235
+ numFolders: 0,
236
+
237
+ folders: [],
238
+
239
+ folderSelectedList: [],
240
+
241
+ selectedIdx: null, // store the index of folder selected or null
242
+
243
+ };
244
+
245
+
246
+
247
+ this.handleDrawer = this.handleDrawer.bind(this);
248
+
249
+ this.createFolder = this.createFolder.bind(this);
250
+
251
+ this.handleSelectedIdx = this.handleSelectedIdx.bind(this);
252
+
253
+ }
254
+
255
+ handleSelectedIdx(message) {
256
+
257
+ var folderSelectedList = this.state.folderSelectedList.slice();
258
+
259
+ if (this.state.selectedIdx !== null) {
260
+
261
+ folderSelectedList[this.state.selectedIdx] = false;
262
+
263
+ }
264
+
265
+ this.setState({selectedIdx: message.selectedIdx});
266
+
267
+ folderSelectedList[this.state.selectedIdx] = true;
268
+
269
+ this.setState({folderSelectedList: folderSelectedList});
270
+
271
+ }
272
+
273
+
274
+
275
+ createFolder() {
276
+
277
+ this.setState({
278
+
279
+ folderSelectedList: this.state.folderSelectedList.concat(false),
280
+
281
+ folders: this.state.folders.concat(
282
+
283
+ <PaperFolder
284
+
285
+ key={this.state.numFolders}
286
+
287
+ index={this.state.numFolders}
288
+
289
+ isSelected={this.state.folderSelectedList[this.state.numFolders]}
290
+
291
+ deleteFunc={this.deleteFolder.bind(this)}
292
+
293
+ callback={this.handleSelectedIdx}
294
+
295
+ />
296
+
297
+ )
298
+
299
+ });
300
+
301
+
302
+
303
+ this.setState({ numFolders: this.state.numFolders + 1 });
304
+
305
+ }
306
+
307
+ // ...
308
+
309
+ }
310
+
311
+ ```
312
+
313
+
314
+
315
+ ```javascript
316
+
317
+ class PaperFolder extends React.Component {
318
+
319
+ constructor(props) {
320
+
321
+ super(props);
322
+
323
+
324
+
325
+ this.state = {
326
+
327
+ name: "Untitled",
328
+
329
+ }
330
+
331
+
332
+
333
+ this.handleClose = this.handleClose.bind(this);
334
+
335
+ this.select = this.select.bind(this);
336
+
337
+ }
338
+
339
+
340
+
341
+ select() {
342
+
343
+ // this.setState({selected: !this.state.selected});
344
+
345
+ this.props.callback({'selectedIdx': this.props.index})
346
+
347
+ }
348
+
349
+
350
+
351
+ render() {
352
+
353
+ const { classes } = this.props;
354
+
355
+ const folderStyle = clsx({
356
+
357
+ [classes.folder]: true,
358
+
359
+ [classes.selected]: this.props.isSelected
360
+
361
+ });
362
+
363
+
364
+
365
+ // TODO: move <List> out of PaperFolder component
366
+
367
+ return (
368
+
369
+ <List className={classes.folder} onClick={this.select}>
370
+
371
+ <ListItem
372
+
373
+ className={folderStyle}
374
+
375
+ onClick={this.handleListClick}
376
+
377
+ >
378
+
379
+ </ListItem>
380
+
381
+ </List>
382
+
383
+ )
384
+
385
+ }
386
+
387
+ }
388
+
389
+ ```