TypeError: undefined is not an object (evaluating..)
TypeError: undefined is not an object (evaluating..)
在 render() 之前的控制台中 this.state.data1.length 没有给出任何错误,但是一旦我在视图标记中使用它,就会给出错误:
TypeError: undefined is not an object (evaluating '_this.state.data1.length')
如果我从视图标签中删除这一行,那么我的 reacttable 标签中不会打印任何内容,因此我认为这行是必需的,但我应该进行哪些更改,以便使用本机代码不会出错,并且我检索到的数据也会打印在我的应用程序上。
import React, { Component } from 'react';
import { StyleSheet, View, Text, Button } from 'react-native';
import ReactTable from 'react-table';
import firebase from 'firebase';
const firebaseConfig = {
...
};
firebase.initializeApp(firebaseConfig);
export default class Form1 extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
columns: [
{
Header: "email",
accessor: "email"
},
{
Header: "password",
accessor: "password"
}
]
}
}
componentDidMount() {
const data = [];
const data1 = [];
var query = firebase.database().ref("/users");
query.once("value").then((snapshot) => {
//console.log(snapshot)
snapshot.forEach((childSnapshot, index) => {
let singleObj = {
email: childSnapshot.val().email,
password: childSnapshot.val().password,
}
// console.log('email:',data)
data.push(singleObj);
this.setState({data1 : data});
console.log('sssssssssssssssssss',this.state.data1)
});
});
}
submit1=()=>{
console.log(this.state.data1.length)
console.log('data1:',this.state.data1)
}
render() {
return (
<View style="styles.container">
{this.state.data1.length > 0 && <ReactTable data={this.state.data1} columns={this.state.columns} />}
<Button title='Submit' onPress={this.submit1.bind(this)} />
</View>
);
}
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: '#fff' },
head: { height: 40, backgroundColor: '#f1f8ff' },
text: { margin: 6 }
});
像这样更改您的代码:
import React, { Component } from 'react';
import { StyleSheet, View, Text, Button } from 'react-native';
import { Table, Row, Rows } from 'react-native-table-component';
export default class Form1 extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
tableHead: ['Emails', 'Password'],
tableData1:[],
}
}
componentDidMount() {
var query = firebase.database().ref("/users");
query.once("value").then((snapshot) => {
snapshot.forEach((childSnapshot, index) => {
let singleObj = {
email: childSnapshot.val().email,
password: childSnapshot.val().password,
}
this.state.data.push(singleObj);
this.setState({data: this.state.data});
console.log('sssssssssssssssssss',this.state.data)
});
for (var i = 0; i < this.state.data.length; i++) {
this.state.tableData1[i] = [this.state.data[i].email, this.state.data[i].password];
this.setState({ tableData1: this.state.tableData1 });
}
});
}
submit1=()=>{
console.log(this.state.data.length)
console.log('data1:',this.state.data)
}
render() {
return (
<View style={{flex:1,marginTop:100}}>
{this.state.data.length > 0 &&
<Table borderStyle={{borderWidth: 2, borderColor: '#c8e1ff'}}>
<Row data={this.state.tableHead} />
<Rows data={this.state.tableData1} />
</Table>}
<Button title='Submit' onPress={this.submit1.bind(this)} />
</View>
);
}
}
您唯一的问题是,在状态中使用 data: []
而不是 data1: []
。但是,我在您的代码中发现了一些增强功能,以下是我的建议
问题:
1) 数据 1 在渲染时使用但未在状态中初始化
2) 样式对象被用作字符串而不是对象
3) 不是问题,但是你不需要绑定 _submit
因为它已经是一个箭头函数
import React, { Component } from 'react';
import { StyleSheet, View, Button } from 'react-native';
import ReactTable from 'react-table';
import firebase from 'firebase';
const firebaseConfig = {};
firebase.initializeApp(firebaseConfig);
const COLUMNS = [
{
Header: 'email',
accessor: 'email',
},
{
Header: 'password',
accessor: 'password',
},
];
export default class Form1 extends Component {
state = {
data: [],
columns: COLUMNS,
};
componentDidMount() {
const data = [];
const query = firebase.database().ref('/users');
query.once('value').then(snapshot => {
snapshot.forEach((childSnapshot, index) => {
const singleObj = {
email: childSnapshot.val().email,
password: childSnapshot.val().password,
};
data.push(singleObj);
this.setState({ data });
});
});
}
_submit = () => {
console.log('data1:', this.state.data);
}
render() {
const { data, columns } = this.state;
return (
<View style={styles.container}>
{data.length > 0 && <ReactTable data={data} columns={columns} />}
<Button title="Submit" onPress={this._submit} />
</View>
);
}
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: '#fff' },
head: { height: 40, backgroundColor: '#f1f8ff' },
text: { margin: 6 },
});
首先导入以下行
import { initializeApp, getApps } from 'firebase/app';
// your config from firebase
const firebaseConfig = {
apiKey: "AIzaSy****************************",
authDomain: "i*****dev-a67ad.firebaseapp.com",
projectId: "i*****dev-a67ad",
storageBucket: "i*****dev-a67ad.appspot.com",
messagingSenderId: "1********7930",
appId: "1:1081248747930:web:5a27b7c60397720d0c2a23",
measurementId: "G-KDHB8SLTEZ"
};
// check if app is initialized or not That's it.
if (getApps.length === 0) {
initializeApp(firebaseConfig);
}
在 render() 之前的控制台中 this.state.data1.length 没有给出任何错误,但是一旦我在视图标记中使用它,就会给出错误: TypeError: undefined is not an object (evaluating '_this.state.data1.length') 如果我从视图标签中删除这一行,那么我的 reacttable 标签中不会打印任何内容,因此我认为这行是必需的,但我应该进行哪些更改,以便使用本机代码不会出错,并且我检索到的数据也会打印在我的应用程序上。
import React, { Component } from 'react';
import { StyleSheet, View, Text, Button } from 'react-native';
import ReactTable from 'react-table';
import firebase from 'firebase';
const firebaseConfig = {
...
};
firebase.initializeApp(firebaseConfig);
export default class Form1 extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
columns: [
{
Header: "email",
accessor: "email"
},
{
Header: "password",
accessor: "password"
}
]
}
}
componentDidMount() {
const data = [];
const data1 = [];
var query = firebase.database().ref("/users");
query.once("value").then((snapshot) => {
//console.log(snapshot)
snapshot.forEach((childSnapshot, index) => {
let singleObj = {
email: childSnapshot.val().email,
password: childSnapshot.val().password,
}
// console.log('email:',data)
data.push(singleObj);
this.setState({data1 : data});
console.log('sssssssssssssssssss',this.state.data1)
});
});
}
submit1=()=>{
console.log(this.state.data1.length)
console.log('data1:',this.state.data1)
}
render() {
return (
<View style="styles.container">
{this.state.data1.length > 0 && <ReactTable data={this.state.data1} columns={this.state.columns} />}
<Button title='Submit' onPress={this.submit1.bind(this)} />
</View>
);
}
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: '#fff' },
head: { height: 40, backgroundColor: '#f1f8ff' },
text: { margin: 6 }
});
像这样更改您的代码:
import React, { Component } from 'react';
import { StyleSheet, View, Text, Button } from 'react-native';
import { Table, Row, Rows } from 'react-native-table-component';
export default class Form1 extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
tableHead: ['Emails', 'Password'],
tableData1:[],
}
}
componentDidMount() {
var query = firebase.database().ref("/users");
query.once("value").then((snapshot) => {
snapshot.forEach((childSnapshot, index) => {
let singleObj = {
email: childSnapshot.val().email,
password: childSnapshot.val().password,
}
this.state.data.push(singleObj);
this.setState({data: this.state.data});
console.log('sssssssssssssssssss',this.state.data)
});
for (var i = 0; i < this.state.data.length; i++) {
this.state.tableData1[i] = [this.state.data[i].email, this.state.data[i].password];
this.setState({ tableData1: this.state.tableData1 });
}
});
}
submit1=()=>{
console.log(this.state.data.length)
console.log('data1:',this.state.data)
}
render() {
return (
<View style={{flex:1,marginTop:100}}>
{this.state.data.length > 0 &&
<Table borderStyle={{borderWidth: 2, borderColor: '#c8e1ff'}}>
<Row data={this.state.tableHead} />
<Rows data={this.state.tableData1} />
</Table>}
<Button title='Submit' onPress={this.submit1.bind(this)} />
</View>
);
}
}
您唯一的问题是,在状态中使用 data: []
而不是 data1: []
。但是,我在您的代码中发现了一些增强功能,以下是我的建议
问题:
1) 数据 1 在渲染时使用但未在状态中初始化
2) 样式对象被用作字符串而不是对象
3) 不是问题,但是你不需要绑定 _submit
因为它已经是一个箭头函数
import React, { Component } from 'react';
import { StyleSheet, View, Button } from 'react-native';
import ReactTable from 'react-table';
import firebase from 'firebase';
const firebaseConfig = {};
firebase.initializeApp(firebaseConfig);
const COLUMNS = [
{
Header: 'email',
accessor: 'email',
},
{
Header: 'password',
accessor: 'password',
},
];
export default class Form1 extends Component {
state = {
data: [],
columns: COLUMNS,
};
componentDidMount() {
const data = [];
const query = firebase.database().ref('/users');
query.once('value').then(snapshot => {
snapshot.forEach((childSnapshot, index) => {
const singleObj = {
email: childSnapshot.val().email,
password: childSnapshot.val().password,
};
data.push(singleObj);
this.setState({ data });
});
});
}
_submit = () => {
console.log('data1:', this.state.data);
}
render() {
const { data, columns } = this.state;
return (
<View style={styles.container}>
{data.length > 0 && <ReactTable data={data} columns={columns} />}
<Button title="Submit" onPress={this._submit} />
</View>
);
}
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: '#fff' },
head: { height: 40, backgroundColor: '#f1f8ff' },
text: { margin: 6 },
});
首先导入以下行
import { initializeApp, getApps } from 'firebase/app';
// your config from firebase
const firebaseConfig = {
apiKey: "AIzaSy****************************",
authDomain: "i*****dev-a67ad.firebaseapp.com",
projectId: "i*****dev-a67ad",
storageBucket: "i*****dev-a67ad.appspot.com",
messagingSenderId: "1********7930",
appId: "1:1081248747930:web:5a27b7c60397720d0c2a23",
measurementId: "G-KDHB8SLTEZ"
};
// check if app is initialized or not That's it.
if (getApps.length === 0) {
initializeApp(firebaseConfig);
}