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

回答編集履歴

6

テキスト修正

2019/08/01 08:36

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -10,7 +10,7 @@
10
10
  > ・・・
11
11
  > ↑のようにして繰り返しでMyStateコンポーネントをレンダーする。
12
12
 
13
- のように `App` の `state` を配列に修正したときに、それに対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
13
+ のように `App` の `this.state.types` を配列に修正したときに、それに対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
14
14
 
15
15
  ```javascript
16
16
  handleClickInc(e) {

5

テキスト修正

2019/08/01 08:36

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -10,7 +10,7 @@
10
10
  > ・・・
11
11
  > ↑のようにして繰り返しでMyStateコンポーネントをレンダーする。
12
12
 
13
- のように `App` の `state` と `render` を修正したときに、その修正に対応して`handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
13
+ のように `App` の `state` を配列に修正したときに、そに対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
14
14
 
15
15
  ```javascript
16
16
  handleClickInc(e) {

4

テキスト修正

2019/07/31 05:35

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -129,4 +129,4 @@
129
129
 
130
130
  - 上記の修正: [this.state.types を nameをキーとするオブジェクトにする ](https://github.com/jun68ykt/q203448/commit/1f6e05eb1c401fba3b7cda3dccb4e0fa18e7f364)
131
131
 
132
- render で、 `sortedTypes` と、this.state.types のエントリを配列にして、name でソートしているのは、this.state.types をオブジェクトにすると、エントリの順番が失われるので、常に同じ順番で表示されるように、とりあえず、 name の昇順にソートしてみた、という意図です。
132
+ render で、 `this.state.types` のエントリを配列にして、name でソートした `sortedTypes` を作っているのは、`this.state.types` をオブジェクトにすると、エントリの順番が失われるので、常に同じ順番で表示されるように、とりあえず、 name の昇順にソートしてみた、という意図です。

3

テキスト修正

2019/07/31 03:14

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -79,7 +79,7 @@
79
79
  const { types } = this.state
80
80
  this.setState({
81
81
  types: { ...types, [name]: types[name] + 1 },
82
- mess: `${e.target.name}を1増やしました。`
82
+ mess: `${name}を1増やしました。`
83
83
  });
84
84
  }
85
85
 
@@ -88,7 +88,7 @@
88
88
  const { types } = this.state
89
89
  this.setState({
90
90
  types: { ...types, [name]: types[name] - 1 },
91
- mess: `${e.target.name}を1減らしました。`
91
+ mess: `${name}を1減らしました。`
92
92
  });
93
93
  }
94
94
  ```

2

テキスト修正

2019/07/31 03:08

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -50,6 +50,83 @@
50
50
 
51
51
  以上、参考になれば幸いです。
52
52
 
53
- ### 追記
53
+ ### 追記1
54
54
 
55
- 一点、気になったことは、`App` の `this.state` に、各 `MyState`にrender させる可変な内容を持たせているので、 `MyState` のほうは状態を持つ必要があるのか?ということでした。もし今後いろいろ修正していって、`MyState` のほうには状態を持たせる必要がない(つまり親コンポーネントである App から渡されるpropsだけによって、render する内容などの挙動が決まる)ということであれば、`MyState` はFunctional Component に書き直すとよいかと思います。
55
+ 一点、気になったことは、`App` の `this.state` に、各 `MyState`にrender させる可変な内容を持たせているので、 `MyState` のほうは状態を持つ必要があるのか?ということでした。もし今後いろいろ修正していって、`MyState` のほうには状態を持たせる必要がない(つまり親コンポーネントである App から渡されるpropsだけによって、render する内容などの挙動が決まる)ということであれば、`MyState` はFunctional Component に書き直すとよいかと思います。
56
+
57
+ ### 追記2
58
+
59
+ `App` の this.state.types を、配列ではなく、 name をキーとし 回数を値とするオブジェクトにして、ご質問のタイトルにある `Computed property names` を使って setState するという方向で修正するとすれば、以下のようになるかと思います。
60
+
61
+ #### App.js
62
+ ```javascript
63
+ constructor(props) {
64
+ super(props);
65
+ this.state = {
66
+ types: {
67
+ ccc: 0,
68
+ aaa: 0,
69
+ bbb: 0
70
+ },
71
+ mess: ""
72
+ };
73
+ }
74
+ ```
75
+
76
+ ```javascript
77
+ handleClickInc(e) {
78
+ const { name } = e.target
79
+ const { types } = this.state
80
+ this.setState({
81
+ types: { ...types, [name]: types[name] + 1 },
82
+ mess: `${e.target.name}を1増やしました。`
83
+ });
84
+ }
85
+
86
+ handleClickDec(e) {
87
+ const { name } = e.target
88
+ const { types } = this.state
89
+ this.setState({
90
+ types: { ...types, [name]: types[name] - 1 },
91
+ mess: `${e.target.name}を1減らしました。`
92
+ });
93
+ }
94
+ ```
95
+
96
+ ```javascript
97
+ render() {
98
+
99
+ const sortedTypes = Object.entries(this.state.types)
100
+ .sort((e1, e2) => e1[0].localeCompare(e2[0]))
101
+
102
+ return (
103
+ <div>
104
+ {sortedTypes
105
+ .map(([name]) =>
106
+ <p key={name}>{name}: {localStorage.getItem(name)}</p>
107
+ )}
108
+ <MessBox mess={this.state.mess} />
109
+ {
110
+ sortedTypes.map(([name, count]) => (
111
+ <div key={name}>
112
+ <h1>{name}</h1>
113
+ <MyState
114
+ roletype={name}
115
+ nor={count}
116
+ name={name}
117
+ inc_mess="+1"
118
+ dec_mess="-1"
119
+ onClickInc={e => this.handleClickInc(e)}
120
+ onClickDec={e => this.handleClickDec(e)}
121
+ />
122
+ </div>
123
+ ))
124
+ }
125
+ </div>
126
+ );
127
+ }
128
+ ```
129
+
130
+ - 上記の修正: [this.state.types を nameをキーとするオブジェクトにする ](https://github.com/jun68ykt/q203448/commit/1f6e05eb1c401fba3b7cda3dccb4e0fa18e7f364)
131
+
132
+ render で、 `sortedTypes` と、this.state.types のエントリを配列にして、name でソートしているのは、this.state.types をオブジェクトにすると、エントリの順番が失われるので、常に同じ順番で表示されるように、とりあえず、 name の昇順にソートしてみた、という意図です。

1

テキスト修正

2019/07/31 03:05

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  - [https://github.com/jun68ykt/q203448](https://github.com/jun68ykt/q203448)
42
42
 
43
- に、 `create-react-app` で作ったSPAに、ご質問に上げられてるコードを転記して作成したものを上げておきました。
43
+ に、 `create-react-app` で作ったSPAに、ご質問に上げられてるコードを転記して作成したものを上げておきました。
44
44
 
45
45
  上記の修正に相当するコミットは、以下です。
46
46
 
@@ -48,4 +48,8 @@
48
48
 
49
49
  ただし上記の修正は、`this.state.types` の要素に 同じ`name` プロパティを持つ要素がないことを前提にしています。もし、 `name`が同じ要素を持つ可能性があるのであれば、`this.state.types` の要素となるオブジェクトに、たとえば`id` のようなユニークなプロパティを追加することをお勧めします。
50
50
 
51
- 以上、参考になれば幸いです。
51
+ 以上、参考になれば幸いです。
52
+
53
+ ### 追記
54
+
55
+ 一点、気になったことは、`App` の `this.state` に、各 `MyState`にrender させる可変な内容を持たせているので、 `MyState` のほうは状態を持つ必要があるのか?ということでした。もし今後いろいろ修正していって、`MyState` のほうには状態を持たせる必要がない(つまり親コンポーネントである App から渡されるpropsだけによって、render する内容などの挙動が決まる)ということであれば、`MyState` はFunctional Component に書き直すとよいかと思います。