использование <InView> наблюдателя пересечения в реакции

У меня есть список карточек, которые я получаю от Api. Карты - это продукты, которые пользователь выбирает на предыдущей вкладке. Они должны загружаться, когда пользователь прокручивает страницу вниз. Все работает нормально. Но если пользователь пролистывает до конца и обновляет страницу, появляются карточки эмоций.

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

Это основной компонент, отправляющий ключи другому.

const productsKeys = JSON.parse(localStorage.getItem(storageKey) ?? "[]");

      const posts = productsKeys.map((key, index) => {
  return <MyListPosts key={key} productsKey={key} index={index} />;
});

Это еще один компонент, отправляющий Api-запрос

      class MyListPosts extends Component {
  viewStateChange = (InView) => {
    if (InView) {
      //if the card is visible, the key is transfered to the async request
      this.props.productsInList(this.props.productsKey);
    }
  };
  render() {
    const { productsKey, classes, index, productsInMyList, skeletonLoading } =
      this.props;

    const products = productsInMyList[index] ?? productsInMyList;

    return (
      <InView onChange={this.viewStateChange}>
        <div>
          <Card component="nav" className={classes.myListCard}>
            {skeletonLoading ? (
              <SkeletonInList />
            ) : (
              <>
                <Typography>{products.name}</Typography>
                <Typography>{products.price} price</Typography>
                <Button onClick={() => this.deleteItem(products.key)}>
                  Done
                </Button>
              </>
            )}
          </Card>
        </div>
      </InView>
    );
  }
}

0 ответов

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