如何修复 React Native 中的“未定义不是对象”错误
2019-05-19
1125
我正尝试将我的 react-native 应用代码移动到更结构化的方式。最初,我将所有 firebase 函数都放在了我使用它们的文件中,但现在我想在多个地方使用它们,所以我创建了一个
Database.js
文件,其中包含一个 Database 类和所有函数。但出于某种原因,每当我尝试使用新类中的一个函数时,我都会收到错误
“undefined 不是对象(评估'this.codesRef.once')”
请帮忙!
到目前为止,我尝试过使用箭头函数、构造函数和以不同方式导入 firebase,但都无济于事。我对这个几乎束手无策。
查看代码... (/project/src/components/forms/KeyForm.js)
import React from 'react';
import { StyleSheet, View, TextInput } from 'react-native';
import db from '../Database.js';
class LoginForm extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<View style={styles.container}>
<TextInput
placeholder="Access Code"
returnKeyType="go"
onSubmitEditing={text => {db.checkCode(text.nativeEvent.text)}}
/>
</View>
);
}
}
const styles = StyleSheet.create({ // stylesheet
// yay styles :)
});
export default LoginForm;
(/project/src/components/Database.js)
//import * as firebase from "firebase";
var firebase = require('firebase');
if (!firebase.apps.length) {
firebase.initializeApp({
apiKey: "key",
authDomain: "domain",
databaseURL: "url",
storageBucket: "bucket",
});
}
class Database {
codesRef = firebase.database().ref('codes');
static checkCode(text) {
let codeIsFound = false;
this.codesRef.once('value', (db_snapshot) => { // this won't work
db_snapshot.forEach((code_snapshot) => {
if (text == code_snapshot.val().value) {
codeIsFound = true;
identifier = code_snapshot.key;
}
});
});
if (codeIsFound) {
//this.deleteCode(identifier);
console.log("code found");
this.props.navigation.navigate('Create'); // side-question => how can i get this working in Database.js? Do i need to use withNavigation?
} else {
console.log("code not found");
);
}
};
}
module.exports = Database;
需要澄清的是,在我尝试将函数迁移到 Database.js 文件之前,一切都运行正常。任何帮助都非常感谢!
3个回答
您的
checkCode
函数是
static
。您无法在静态方法中访问
this
上下文。
在您的
/project/src/components/Database.js
中将其更改为:
checkCode(text) {
let codeIsFound = false;
this.codesRef.once('value', (db_snapshot) => { // this won't work
db_snapshot.forEach((code_snapshot) => {
if (text == code_snapshot.val().value) {
codeIsFound = true;
identifier = code_snapshot.key;
}
});
});
if (codeIsFound) {
//this.deleteCode(identifier);
console.log("code found");
this.props.navigation.navigate('Create'); // side-question => how can i get this working in Database.js? Do i need to use withNavigation?
} else {
console.log("code not found");
);
}
};
在 /project/src/components/forms/KeyForm.js 中访问此函数时
import firbaseDB from '../Database.js';
const db = new firbaseDB();
...
其余代码保持原样。谢谢。
Nishant Nair
2019-05-19
尝试在你的类中添加一个构造函数:
class Database {
constructor() {
this.codesRef = firebase.database().ref("codes");
}
//...
}
Jack Bashford
2019-05-19
也许你必须这样做
class Database {
constructor(props) {
super(props);
this.codesRef = firebase.database().ref("codes");
}
//...
}
Braven
2019-05-19