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

質問編集履歴

2

非同期処理でのタイミングにずれがある事を認識できたのですが、自動同期を上手く実装する事ができておりません。どなたかご教示頂けないでしょうか

2020/09/02 07:43

投稿

Marcos
Marcos

スコア18

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- firebaseから取得したデータをreact componentで表示したいですがundefinedが返され上手く表示されません。上手くデータが同期されていない様に思うのですが、かご教示いただく事は出来ないでしょうか
1
+ 非同期処理firebaseから取得の前にrenderされてしまい、コンポーネントに上手く値を渡す事が出来ておりません。firebaseから値を取得するまではLoadingを表示し、取得完了すると時に画面を切り替える様にしたいのですが、下記のコードでは何が足りご教示頂けないでしょうか
2
2
 
3
3
  firebaseのデータ
4
4
  -----
@@ -25,30 +25,29 @@
25
25
  N2:[],
26
26
  N3:[]
27
27
  };
28
-
29
- componentDidMount(){
28
+ UNSAFE_componentWillMount(){
30
29
  firebase.database().ref("N3")
31
- .once("value")
30
+ .on(("value"),async (snapshot)=>{
32
- .then((snapshot)=>{
33
- snapshot.forEach((childSnapshot)=>{
31
+ snapshot.forEach((childSnapshot)=>{
34
- this.setState(()=>{
32
+ this.setState(()=>{
35
- N3: this.state.N3.push({
33
+ N3: this.state.N3.push({
36
- id: childSnapshot.key,
34
+ id: childSnapshot.key,
37
- ...childSnapshot.val()
35
+ ...childSnapshot.val()
38
- })
36
+ })
37
+ });
39
38
  });
39
+ console.log(this.state.N3)
40
40
  });
41
- console.log(this.state.N3[0].title);`ここでは欲しいものが表示されます`
42
- });
43
- }
41
+ }
44
42
 
45
43
  render(){
46
-
47
- console.log(this.state.N3[0].title);`undefinedと表示されてしまいます`
44
+ if(!this.state.N3[0]){
48
-
45
+ return <div>Loading</div>;
46
+ }
47
+
49
48
  return(
50
49
  <div>
51
- {this.state.N3[0].title}`何も表示されません`
50
+ {this.state.N3[0].title}
52
51
  </div>
53
52
  )
54
53
  };

1

インラインにてエラー部分を明記させていただきました。どなたか問題点についてご教示頂けますと幸いです

2020/09/02 07:43

投稿

Marcos
Marcos

スコア18

title CHANGED
@@ -1,1 +1,1 @@
1
- react stateの配列オブジェクトを表示できない
1
+ firebaseから取得したデータjsxで表示できない
body CHANGED
@@ -1,9 +1,22 @@
1
- firebaseのDBに格納ている配列オブジェクトfetchし、react componentで表示したいのですが上手くいきません。lifecycleでfirebaseからのsnapshotでstateに反映するイミングれているかと調査してるのですが、どなたか原因をえて頂けないでしょうか。
1
+ firebaseから取得たデータをreact componentで表示したいのですがundefinedが返され上手く表示されません。上手くデータが同期されていない様に思うのですが、どなたか示いただく事は出来ないでしょうか。
2
2
 
3
+ firebaseのデータ
3
4
  -----
5
+ database.ref("N3").push(
6
+ {
7
+ description: "結論を述べる",
8
+ example: "彼は真面目なので、よく勉強する",
9
+ memo: "理由をしめしたい",
10
+ title: "〜なので",
11
+ voice: ""
12
+ }
13
+  );
14
+ ------
15
+
16
+ javascript
17
+ ------
4
18
  import React from 'react';
5
19
  import * as firebase from 'firebase';
6
- import N3Grammer from './N3Grammer';
7
20
 
8
21
  class Grammer extends React.Component {
9
22
  state =
@@ -13,19 +26,8 @@
13
26
  N3:[]
14
27
  };
15
28
 
16
- render(){
17
- let database = firebase.database();
18
- database.ref("N3").push(
19
- {
20
- description: "結論を述べる",
21
- example: "彼は真面目なので、よく勉強する",
22
- memo: "理由をしめしたい",
23
- title: "〜なので",
24
- voice: ""
29
+ componentDidMount(){
25
- }
26
- );
27
-
28
- database.ref("N3")
30
+ firebase.database().ref("N3")
29
31
  .once("value")
30
32
  .then((snapshot)=>{
31
33
  snapshot.forEach((childSnapshot)=>{
@@ -36,16 +38,17 @@
36
38
  })
37
39
  });
38
40
  });
41
+ console.log(this.state.N3[0].title);`ここでは欲しいものが表示されます`
39
42
  });
43
+ }
40
44
 
45
+ render(){
46
+
41
- console.log(this.state.N3); //これは配列が返され
47
+ console.log(this.state.N3[0].title);`undefinedと表示されてしまいます`
42
-
43
- const sample = this.state.N3.map(item=>item.title);
48
+
44
- console.log(sample); //undefinedが返される
45
-
46
49
  return(
47
50
  <div>
48
- {this.state.N3} //ここに配列内オブジェクトのそれぞれのtilteキーを表示させたい
51
+ {this.state.N3[0].title}`何も表示されまん`
49
52
  </div>
50
53
  )
51
54
  };