私はReactに新しく、いくつかのFirebaseのもので微妙に変化しています。 Firebaseからデータを読み込み、その中のいくつかをフィルタリングして、そのデータに現在の状態を設定しようとしています。以下のコードにいくつかの理由で、setState
を呼び出すと、次のエラーが発生します。私のコードではsetState()は小道具を定義しないようにします
Uncaught TypeError: Cannot read property 'database' of undefined
import React, {Component} from 'react';
import Activity from './ActivityList'
class ActivityList extends Component {
constructor(props){
super(props);
this.state = {
activities: []
}
let app = this.props.db.database().ref('activities');
app.on('value', function(snapshot) {
this.handleData(snapshot.val())
}.bind(this))
}
handleData(values) {
let category = this.props.category
let filtered = values.filter(function(item) {
return item.categories.includes(category)
})
console.log(filtered)
this.setState({activities: filtered})
}
render() {
let activityNodes = this.state.activities.map((activity) => {
return (
<Activity activity= {activity} />
)
});
return (
<div>
<ul>
{activityNodes}
</ul>
</div>
);
}
}
、私はprops.db
にfirebaseに渡しています。私のconsole.log(filtered)
呼び出しが意図した通りに機能するので、最初の "合格"を意味するprop/props.db
が明確に定義されているため、問題をsetState
にも(望めば)分けました。私はこれがノンブロッキングな性質のsetState
と関係があると推測していますが、なぜ私の人生のためにこれがpropの値をundefined
にするのか理解できません。
編集:要求されたようdb
の初期化コード:これは、次いで、Category
コンポーネントに渡され
import * as firebase from 'firebase'
class App extends Component {
constructor(props) {
super(props);
var config = {
apiKey:,
authDomain:,
databaseURL:,
projectId:,
storageBucket:,
messagingSenderId:
};
firebase.initializeApp(config);
}
:次いで、上記ActivityList
コンポーネントに渡し
<CategoryList db={firebase}/>
:
<ActivityList db={this.props.db}/>
ActivityList
コンポーネントでも、setState
を呼び出すまで、データベースから正常に読み取っているようです。
は 'this.props.db'未定義のですか? – Rayon
db propの初期化コードと、このコンポーネントへの渡し方を教えてください。 – Daniel
@Rayon this.props.dbは、 'console.log(フィルタリングされた)'がデータベースから読み込んで正しく出力しているため、間違いなく未定義ではありません(同様に 'console.log(snapshot .val()) 'を実行して正しい出力を得てください) – thevises