質問編集履歴

2

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

2020/09/02 07:43

投稿

Marcos
Marcos

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- firebaseから取得したデータをreact componentで表示のですがundefinedが返され上手く表示されません。上手くデータが同期されていない様に思うのですが、かご教示いただく事は出来ないでしょうか
1
+ 非同期処理firebaseから取得の前にrenderされて、コンポーネントに上手く値を渡出来ておりません。firebaseから値を取得するまではLoadingを表示し、取得完了すると時に画面を切り替える様にしたいのですが、下記のコードでは何が足りご教示頂けないでしょうか
2
2
 
3
3
 
4
4
 
@@ -52,53 +52,51 @@
52
52
 
53
53
  };
54
54
 
55
-
56
-
57
- componentDidMount(){
55
+ UNSAFE_componentWillMount(){
58
56
 
59
57
  firebase.database().ref("N3")
60
58
 
61
- .once("value")
59
+ .on(("value"),async (snapshot)=>{
62
60
 
63
- .then((snapshot)=>{
61
+ snapshot.forEach((childSnapshot)=>{
64
62
 
65
- snapshot.forEach((childSnapshot)=>{
63
+ this.setState(()=>{
66
64
 
67
- this.setState(()=>{
65
+ N3: this.state.N3.push({
68
66
 
69
- N3: this.state.N3.push({
67
+ id: childSnapshot.key,
70
68
 
71
- id: childSnapshot.key,
69
+ ...childSnapshot.val()
72
70
 
73
- ...childSnapshot.val()
71
+ })
74
72
 
75
- })
73
+ });
76
74
 
77
75
  });
78
76
 
77
+ console.log(this.state.N3)
78
+
79
79
  });
80
80
 
81
- console.log(this.state.N3[0].title);`ここでは欲しいものが表示されます`
82
-
83
- });
84
-
85
- }
81
+ }
86
82
 
87
83
 
88
84
 
89
85
  render(){
90
86
 
87
+ if(!this.state.N3[0]){
91
88
 
89
+ return <div>Loading</div>;
92
90
 
93
- console.log(this.state.N3[0].title);`undefinedと表示されてしまいます`
91
+ }
94
92
 
95
-
93
+
96
94
 
97
95
  return(
98
96
 
99
97
  <div>
100
98
 
101
- {this.state.N3[0].title}`何も表示されません`
99
+ {this.state.N3[0].title}
102
100
 
103
101
  </div>
104
102
 

1

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

2020/09/02 07:43

投稿

Marcos
Marcos

スコア18

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