【问题标题】:Slow image load/Pull images from storage - firebase - react native缓慢的图像加载/从存储中提取图像 - firebase - 反应原生
【发布时间】:2018-09-11 19:05:02
【问题描述】:

我正在从我的 firestore 数据库中提取数据,每个数据库项上的一个字段是 image,每个字段的值都是我的 firebase 存储图像的 URL。

我想做的是直接从存储中提取图像,作为从 firestore 提取的循环的一部分。

我正在尝试这样做,因为当此循环呈现项目时,图像需要几秒钟才能出现在屏幕上。

请告知是否有解决此问题的替代方法?

FirebaseData.js

onCollectionUpdate = (querySnapshot) => {
const data = [];
querySnapshot.forEach((doc) => {
  const { title, image, url, description } = doc.data();
    data.push({
      key: doc.id,
      doc, // DocumentSnapshot
      title,
      image,
      description,
      url
    });
});
this.setState({
  data,
  loading: false
});
}

render() {
    if (this.state.loading) {
      return <Spinner />; //RETURN A LOADING ICON
    }
return (
  <List containerStyle={styles.listStyle}>
    <FlatList
      data={this.state.data}
      renderItem={({ item }) => <ChildList {...item} />}
    />
  </List>
      );
    }
  }

ChildList.js

export default class ChildListRow2 extends React.PureComponent {

render() {
  return (
      <ListItem
        title={
          <View>
          <Image source={{ uri: this.props.image }} style={styles.imageStyle} />
          <Text style={styles.titleTextStyle}>{this.props.title}</Text>
          </View>
        }
        subtitle={
          <View>
          <Text style={styles.subTitleTextStyle}>{this.props.description}</Text>
          </View>
        }
        hideChevron
        onPress={() => Linking.openURL(this.props.url)}
        containerStyle={styles.listItemStyle}
      />
    );
   }
}

【问题讨论】:

  • 那么你想在同一个查询中获取firestorage图像吗?

标签: reactjs firebase react-native firebase-storage


【解决方案1】:

您可以使用Image 组件的onLoadEndonLoadStart 属性来显示和隐藏其余数据。您可以在文件加载之前显示加载微调器,然后在完成时显示完整的组件。

示例

export default class ChildListRow2 extends React.PureComponent {

  constructor() {
    super();
    this.state = {
      loaded: false
    };
  }

  imageLoaded = () => {
    this.setState({ loaded: true })
  }

  render() {
    return (
      <ListItem
        title={
          <View>
            <Image
              source={{ uri: this.props.image }}
              style={styles.imageStyle} 
              onLoadEnd={this.imageLoaded}
            />
            <Text style={styles.titleTextStyle}>{this.props.title}</Text>
          </View>
        }
        subtitle={
          <View>
            <Text style={styles.subTitleTextStyle}>{this.props.description}</Text>
          </View>
        }
        hideChevron={this.state.loaded}
        onPress={() => Linking.openURL(this.props.url)}
        containerStyle={styles.listItemStyle}
      />
    );
  }
}

【讨论】:

  • 如果我在单独的列表组件文件中渲染图像,如何使用它?
  • 在不知道您如何使用这些数据的情况下,我无法提出任何相关建议。如果你用一些代码来编辑你的问题,显示你如何渲染你的组件,我会尝试提出一些建议
  • 我已更新以显示我如何在另一个组件中使用数据。如您所见,在加载数据之前,我将返回一个微调器,但是图像需要一段时间才能渲染 - 迫使它看起来不专业。
  • @garethiv 添加了一个小例子来展示你可以使用什么样的东西。
  • 非常感谢您的帮助。
猜你喜欢
  • 2021-04-19
  • 2018-10-17
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多