Медленная загрузка изображений / извлечение изображений из хранилища - firebase - react native

Я извлекаю данные из своей базы данных firestore, одно из полей каждого элемента базы данных - image, значение каждого из которых является URL-адресом изображения в моем хранилище firebase.

Что я хотел бы сделать, так это вытащить изображение прямо из хранилища как часть цикла, который извлекается из хранилища огня.

Я пытаюсь сделать это, поскольку, когда этот цикл отображает элементы, изображениям требуется несколько секунд, чтобы появиться на экране.

Посоветуйте, пожалуйста, есть ли альтернатива решения этой проблемы?

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}
      />
    );
   }
}

Итак, вы хотите получить изображение пожарного хранилища в том же запросе?

Karlo A. López 02.04.2018 17:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
1 676
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать свойства onLoadEnd и onLoadStart компонента Image, чтобы показать и скрыть остальные данные. Вы можете показывать счетчик загрузки до тех пор, пока файл не загрузится, а затем показать весь компонент, когда он закончится.

Пример

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 03.04.2018 11:49

Не зная, как вы используете эти данные, я не могу предложить ничего подходящего. Если вы отредактируете свой вопрос с помощью кода, показывающего, как вы визуализируете свой компонент, я попытаюсь предложить что-то

bennygenel 03.04.2018 11:51

Я обновился, чтобы показать, как я использую данные в другом компоненте. Как видите, я возвращаю счетчик до тех пор, пока данные не будут загружены, но затем изображение требует времени для рендеринга, что заставляет его выглядеть непрофессионально.

garethiv 03.04.2018 11:58

@garethiv добавил небольшой пример, чтобы показать, какие вещи вы можете использовать.

bennygenel 03.04.2018 12:06

Большое спасибо за помощь.

garethiv 03.04.2018 12:19

@garethiv рад что смог помочь

bennygenel 03.04.2018 12:20

Другие вопросы по теме