質問編集履歴

2

解決!

2020/04/08 13:15

投稿

youj_biginner
youj_biginner

スコア7

test CHANGED
File without changes
test CHANGED
@@ -201,3 +201,9 @@
201
201
  ## 追記
202
202
 
203
203
  URL直叩きでも表示できるようにするため、遷移前のページからデータを渡すことは考えていません。
204
+
205
+
206
+
207
+ ## 解決
208
+
209
+ ベストアンサーのように`Route`の使い方を正しくし、`componentDidUpdate`を併用したら解決しました。

1

分かりやすくした

2020/04/08 13:15

投稿

youj_biginner
youj_biginner

スコア7

test CHANGED
@@ -1 +1 @@
1
- [React]URLパス取得、componentDidMountで使、DOMに描画したい
1
+ [React]リンククリックてもコンポーネントが入れ替わらな
test CHANGED
@@ -1,10 +1,26 @@
1
+ * 分かりにくかったので大幅に編集しています。患っている問題は変わっておりません。
2
+
3
+
4
+
1
- #[React]URLパス取得、stateに入れ
5
+ #リンククリックてもコンポーネントが入れ替わらな
2
-
6
+
3
- リンクのページに行くとそのページのURLパスを取得し、画面上に表示さことはできます。しかし、そのパス`render()`内にかくとstateに入れられず、それを使ったAPIの取得どがせん
7
+ リンクを押すと`localhost:3000/python`ように押した言語のページに行き、URLパスを取得し、`python完全理解した`と表示さようになっています。しかし、そのページから他の言語のリンク押しても下の画像のようコンポーネントは入れ替わらないまます。(ページをリロードするとようやく入れ替わり
8
+
9
+
10
+
4
-
11
+ pythonと押した時
12
+
5
-
13
+ ![イメージ説明](a12ab0ab5eb30f48812c29862d68e953.png)
14
+
15
+
16
+
6
-
17
+ JavaScriptと押した時
18
+
19
+ ![イメージ説明](2edd3023ea7984edb88cd97cd67ddf07.png)
20
+
21
+
22
+
7
- ##該当のコード
23
+ ## 該当のコード
8
24
 
9
25
  App.js
10
26
 
@@ -104,9 +120,19 @@
104
120
 
105
121
  class Card extends Component {
106
122
 
123
+ constructor(props) {
124
+
125
+ super(props);
126
+
127
+ var urlPass = window.location.pathname
128
+
129
+ var uP = urlPass.slice(1)
130
+
131
+ console.log(uP)
132
+
107
- state = {
133
+ this.state = {lang: uP}
108
-
134
+
109
- lang: ''
135
+ console.log(this.state.lang)
110
136
 
111
137
  }
112
138
 
@@ -114,9 +140,7 @@
114
140
 
115
141
  componentDidMount() {
116
142
 
117
- this.setState({lang: this.uP})
118
-
119
- console.log(this.state.lang + 'さん')
143
+ console.log(this.state.lang)
120
144
 
121
145
  }
122
146
 
@@ -124,17 +148,17 @@
124
148
 
125
149
  render() {
126
150
 
127
- var urlPass = window.location.pathname
151
+ /*var urlPass = window.location.pathname
128
152
 
129
153
  var uP = urlPass.slice(1)
130
154
 
131
- console.log(uP)
155
+ console.log(uP)*/
132
156
 
133
157
 
134
158
 
135
159
  return(
136
160
 
137
- <div>{uP}完全に理解した</div>
161
+ <div>{this.state.lang}完全に理解した</div>
138
162
 
139
163
  );
140
164
 
@@ -142,92 +166,38 @@
142
166
 
143
167
  }
144
168
 
169
+
170
+
171
+ export default Card;
172
+
145
173
  ```
146
174
 
147
175
 
148
176
 
149
- コンソールには`render`ログは出力されるです、`componentDidMount()`ログは`さ`しか表示されないです
177
+ `constructor()`を使っているで再びマウントされたら入れ替わはずです。しかし実際には起こっていません。`App.js`の`Route`の問題なのか分かりません。
150
-
151
-
152
-
153
- ![イメージ説明](15e63197fdaf24ef1e7a0e10a3afee94.png)
154
-
155
-
156
-
157
-
158
-
159
- `componentDidMount()`上でも使えるようにしたい。
160
178
 
161
179
 
162
180
 
163
181
  ## 試したこと
164
182
 
183
+ ### render()内に書く
184
+
165
- `render()`内でなく、`componentDidMount()`でURLの取得を、state入れようとしました。
185
+ しかしこれ将来的に`componentDidMount()`でURLパスを使い、APIの取得を考えてるのでデータを`componentDidMount()`渡せないのでやめました。
166
-
167
-
168
-
169
- ```javascript
186
+
170
-
171
- import React, {Component} from 'react';
187
+
172
-
173
-
174
-
175
- class Card extends Component {
188
+
176
-
177
- state = {
178
-
179
- lang: ''
180
-
181
- }
182
-
183
-
184
-
185
- componentDidMount() {
189
+ ### componentDidMount()内に書く
186
-
187
- var urlPass = window.location.pathname
190
+
188
-
189
- var uP = urlPass.slice(1)
190
-
191
- console.log(uP)
192
-
193
- this.setState({lang: uP})
194
-
195
- console.log(this.state.lang + 'さん')
196
-
197
- }
198
-
199
-
200
-
201
- render() {
202
-
203
- return(
204
-
205
- <div>{this.state.lang}完全に理解した</div>
206
-
207
- );
208
-
209
- }
210
-
211
- }
212
-
213
-
214
-
215
- export default Card;
216
-
217
- ```
218
-
219
-
220
-
221
- しかし、今度は一つ目のログは表示されるのですが、二つ目のログはやはり`さん`のみしか表示されず、DOMにも値が表示されなくなっています。おそらくライフサイクルが原因だと思うのですが、二つ目のログまでうまく出力されないのかは疑問です。
222
-
223
-
224
-
225
- 取得したURLパスを`componentDidMount()`内用い、DOMに描画する解決策はありませんか?
191
+ stateのセットがうまくきず空になりまたライフサイクルの都合上、DOMにも言語名が表示されませんでした。
192
+
193
+
194
+
195
+
196
+
197
+ なので、上記のコードでリンクを押すとコンポーネントを初期化し読み込んでくれる方法を教えてください!今のままでは入れ替えているはずが、同じCardコンポーネントとして処理され、URL遷移しか行われていない気がします。
226
198
 
227
199
 
228
200
 
229
201
  ## 追記
230
202
 
231
- ###将来的に考えていること
232
-
233
- URLパスを用いて外部APIを`~~~?keyword={該当のパス}`のようにして`componentDidMount()`内で取得し要素DOMに描画したです
203
+ URL直叩きでも表示できるようにするため遷移前のページからデータ渡すことは考えてません