回答編集履歴
6
テキスト修正
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
テキスト修正
answer
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
> ・・・
|
11
11
|
> ↑のようにして繰り返しでMyStateコンポーネントをレンダーする。
|
12
12
|
|
13
|
-
のように `App` の `state`
|
13
|
+
のように `App` の `state` を配列に修正したときに、それに対応して `handleClickInc` と `handleClickDec` は、例えば以下のように修正すればよいかと思います。
|
14
14
|
|
15
15
|
```javascript
|
16
16
|
handleClickInc(e) {
|
4
テキスト修正
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 で、 `
|
132
|
+
render で、 `this.state.types` のエントリを配列にして、name でソートした `sortedTypes` を作っているのは、`this.state.types` をオブジェクトにすると、エントリの順番が失われるので、常に同じ順番で表示されるように、とりあえず、 name の昇順にソートしてみた、という意図です。
|
3
テキスト修正
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: `${
|
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: `${
|
91
|
+
mess: `${name}を1減らしました。`
|
92
92
|
});
|
93
93
|
}
|
94
94
|
```
|
2
テキスト修正
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
テキスト修正
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 に書き直すとよいかと思います。
|