reactjs - FlatList 的对象数组数据源在用作 renderItem 时为空
问题描述
这是一个早期问题的扩展,现在已调试以实现它是一个不同的问题。登录到控制台时,我有一个如下所示的对象数组:
我现在想使用这个对象数组来显示一个使用FlatList
组件的列表。在我的状态构造函数中,我设置了一个变量,itemList
该变量使用从我的listenForMusic
函数生成的对象this.setState()
:
class VideoFeed extends React.Component {
constructor(props) {
super(props);
//this.dataRef = database.ref("music");
this.state = {
itemList: null,
}
}
componentWillMount() {
this.listenForMusic();
}
listenForMusic(){
var dataRef = database.ref("music");
let items = [];
dataRef.orderByChild("date").on('child_added', (snap) => {
items.push({
videoURL: snap.val().youtubeURL,
title: snap.val().title,
thumbnail: snap.val().thumbnail
});
});
this.setState({ itemList: items })
}
render() {
console.log(this.state.itemList);
return (
<View>
<FlatList
data={this.state.itemList}
renderItem={({item}) => { console.log(item); return (<Text>{item.videoURL}</Text>) }}
/>
</View>
);
}
}
我的渲染函数中有console.log,我看到了我在上面发布的图像,但是当我尝试console.log 时item
,renderItem
它在控制台中没有显示任何内容(甚至没有空数组)。我提交到data
道具中的数据去了哪里?
应该很明显,但该<Text>
标签中没有打印任何内容。
编辑:全班添加
class VideoFeed extends React.Component {
constructor(props) {
super(props);
//this.dataRef = database.ref("music");
this.state = {
itemList: null,
}
//this.listenForMusic = this.listenForMusic.bind(this);
}
componentWillMount() {
this.listenForMusic();
}
listenForMusic(){
var dataRef = database.ref("music");
let items = [];
dataRef.orderByChild("date").on('child_added', (snap) => {
items.push({
videoURL: snap.val().youtubeURL,
title: snap.val().title,
thumbnail: snap.val().thumbnail
});
});
this.setState({ itemList: items })
}
_keyExtractor = (item, index) => item.id;
_renderVideoItem = ({item}) => (
<TouchableWithoutFeedback
onPress={Actions.Submit}
>
<View style={styles.mediaContainer}>
<Image
source={{uri: item.thumbnail }}
style={styles.mediaThumbnail}
/>
<View style={styles.mediaMetaContainer}>
<View style={styles.topMetaContainer}>
<Text style={styles.mediaTitle}>
{item.title}
</Text>
<Text style={styles.sharedByUser}>
UNCVRD
</Text>
</View>
<View style={styles.bottomMetaContainer}>
<Icon
name='youtube-play'
type='material-community'
color='#ff0000'
size={16}
/>
<View style={styles.bottomRightContainer}>
<Icon
name='thumb-up'
size={12}
color='#aaa'
/>
<Text style={styles.metaLikeCounter}>
16
</Text>
</View>
</View>
</View>
</View>
</TouchableWithoutFeedback>
);
render() {
console.log(this.state.itemList);
return (
<View>
<FlatList
data={this.state.itemList}
renderItem={({item}) => { console.log(item); return (<Text>{item.title}</Text>) }}
/>
</View>
);
}
}
编辑2:所以我做了一个有趣的测试,我做了两个状态变量:realList
和fakeList
:
state = {
realList: [],
fakeList: [],
}
然后,当页面加载时,将运行以下函数来填充名为real
and的数组fake
。一个从 Firebase 提取数据,另一个用数组信息硬编码:
listenForMusic = () => {
var dataRef = database.ref("music");
let real = [];
let fake = [];
dataRef.orderByChild("date").on('child_added', (snap) => {
var url = snap.val().youtubeURL;
var vidTitle = snap.val().title;
var thumb = snap.val().thumbnail;
real.push({
videoURL: url,
title: vidTitle,
thumbnail: thumb
});
});
fake.push({videoURL: "https://youtu.be/AHukwv_VX9A", title: "MISSIO - Everybody Gets High (Audio)", thumbnail: "https://i.ytimg.com/vi/AHukwv_VX9A/hqdefault.jpg"}, {videoURL: "https://youtu.be/G-yWpz0xkWY", title: "SMNM - Million ft. Compulsive", thumbnail: "https://i.ytimg.com/vi/G-yWpz0xkWY/hqdefault.jpg"});
this.setState({
realList: real,
fakeList: fake
});
}
然后我console.log
在渲染函数之后的两个数组,我看到了这个:
并打开两者:
所以我的问题是,为什么“真实”数组看起来是空的,但内部仍然填充了数据,而“假”数组显示它在其中包含两个对象,甚至在我们查看内部之前?
解决方案
我认为
renderItem={({item}) => return (<Text>{item.videoURL}</Text>)}
应该:
renderItem={(item) => return (<Text>{item.videoURL}</Text>)}
您现在拥有它的方式是尝试解构一个名为 的属性item
,该属性不存在。
推荐阅读
- mysql-workbench - 带有特殊字符的 MySQL 排序查询
- c++ - 我可以做些什么来改进指针向量中的搜索?
- c# - 如何在正则表达式中传递第二次出现的空格?
- python - Julia PyCall 在运行 Music21 模块时遇到困难
- angular - 更改为 NGRX 存储后更新文本框 - 两种方式绑定
- mysql - 在 Go 中如何辨别 MySQL 执行的错误号?
- android - 旋转 90 时如何将 TextureView 大小调整为全屏?
- django - Django - 创建另一个模型实例时自动创建一个模型实例
- azure - 为什么事件网格大约每 2 分钟触发一次 Azure 功能
- mysql - 获取序列号最大的列的值