我正在创建一个购物清单应用程序,其中前端是react-native,后端是firebase。在购物清单中,项目将被添加。我已经在firebase中存储了一些项目并从firestore中检索了这些项目,但它显示错误:
对象无效作为React子对象(找到:带键的对象($$ typof,key,ref,props,_owner,_store)。如果要渲染子集合,请改用数组。
我正在使用react-native 0.55.4版本。请帮帮我。
这是index.js文件
import React, { Component } from 'react';
import {
Platform,
StyleSheet,
Text,
View,
ListView,TouchableHighlight,AppRegistry
} from 'react-native';
import * as firebase from 'firebase';
import ToolBar from './app/components/ToolBar/ToolBar';
const styles = require('./app/style');
const firebaseConfig = {
apiKey: 'AIzaSyClhqB9TEEffc4szIHUEVt0OqXvKQOEwxQ',
authDomain: 'grocerryapp-fbe06.firebaseapp.com',
databaseURL: 'https://grocerryapp-fbe06.firebaseio.com',
projectId: 'grocerryapp-fbe06',
storageBucket: 'grocerryapp-fbe06.appspot.com',
messagingSenderId: '903884995524'
}
const firebaseApp = firebase.initializeApp(firebaseConfig);
export default class App extends Component {
constructor(){
super();
let ds= new ListView.DataSource({rowHasChanged:(r1,r2) => r1 !== r2});
this.state={
itemDataSource:ds
}
this.itemsRef = this.getRef().child('items');
this.renderRow = this.renderRow.bind(this);
this.pressRow = this.pressRow.bind(this);
}
getRef(){
return firebaseApp.database().ref();
}
componentWillMount() {
this.getItems(this.itemsRef);
}
componentDidMount() {
this.getItems(this.itemsRef);
}
getItems(itemsRef) {
//let items = [{title: 'Item One'},{title: 'Item Two'}];
itemsRef.on('value',(snap) => {
let items = [];
snap.forEach((child) => {
items.push({
title: child.val().title,
_key: child.key
});
});
this.setState({
itemDataSource: this.state.itemDataSource.cloneWithRows(items)
});
});
}
pressRow(item){
console.log(item);
}
renderRow(item){
return(
<TouchableHighlight onPress={() => {
this.pressRow(item);
}}>
<View style={styles.li}>
<Text style={styles.liText}>{item.title}</Text>
</View>
</TouchableHighlight>
);
}
render() {
return (
<View style={styles.container}>
<ToolBar title="Item Lister" />
<ListView
dataSource={this.state.itemDataSource}
renderRow={this.renderRow}
/>
</View>
);
}
}
AppRegistry.registerComponent('itemlister', () => 'itemlister');
答案 0 :(得分:0)
return()会帮助你
render() {
return (
<View style={styles.container}>
<ToolBar title="Item Lister" />
<ListView
dataSource={this.state.itemDataSource}
renderRow={(rowData) => {
return(
<View>
<TouchableHighlight
onPress={() => this.pressRow(rowData)}
>
<View style={styles.li}>
<Text style={styles.liText}>{item.title}</Text>
</View>
</TouchableHighlight>
</VIew>
)
}}
/>
</View>
);
}
答案 1 :(得分:0)
我认为这是一个异步问题。你的setState在forEach完成之前触发,因此你的this.state.itemDataSource.cloneWithRows(items),项目不完整。
getItems(itemsRef) {
//let items = [{title: 'Item One'},{title: 'Item Two'}];
itemsRef.on('value',(snap) => {
let items = [];
snap.forEach((child) => {
items.push({
title: child.val().title,
_key: child.key
});
});
this.setState({
itemDataSource: this.state.itemDataSource.cloneWithRows(items)
});
});
}
你可以......
getItems(itemsRef) {
//let items = [{title: 'Item One'},{title: 'Item Two'}];
itemsRef.on('value',(snap) => {
let items = [];
snap.forEach((child) => {
items.push({
title: child.val().title,
_key: child.key
});
});
}.then(() => {
this.setState({
itemDataSource: this.state.itemDataSource.cloneWithRows(items)
})
})
});
}
答案 2 :(得分:0)
我已经看到了这个错误,我猜它与firebase
库有关!当前版本有问题,所以请改用5.0.2
版本!
npm install --save firebase@5.0.2