У меня есть компонент React, который должен загружать 6 изображений одновременно, поскольку страница прокручивается ниже. Я хочу использовать типичный эффект бесконечной прокрутки, который теперь используют YouTube и Reddit.
Прямо сейчас страница открывается, как и должно быть, с 6 загруженными изображениями. Когда я прокручиваю вниз приложение загружает еще 6, но затем оно останавливается. Всего 25 изображений. Я считаю 13 изображений, которые по какой-то причине не загружаются. Предполагается, что приложение будет продолжать загружать изображения 6 одновременно с прокруткой вниз, пока не останется больше изображений для загрузки.
Я использую компонент Бесконечная прокрутка здесь . Я попытался установить более старую версию «4.5.2», и это тоже не сработало.
Снимок экрана приложения внизу показывает кнопки вверху, которые добавляют или удаляют 6 изображений.
Первое число показывает приращение 6 изображений. (Это 0, когда отображается 6 изображений, и 1, если отображается 12).
Число ниже, которое показывает общее количество изображений (URL-адреса изображений в объекте JSON, полученном приложением от серверной части).
import React, { ListView } from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';
export default class Fb_grid extends React.Component {
constructor(props) {
super(props)
this.state = {
apiResponse: [],
page: 0
}
}
componentDidMount() {
this.callAPI();
}
callAPI() {
fetch('/api/getList')
.then(res => res.json())
.then(res => this.setState({ apiResponse: res }))
}
next = () => {
this.setState({ page: this.state.page+1 })
}
render() {
const { apiResponse } = this.state;
const { page } = this.state;
if(!apiResponse) {
return <p className="row">Loading</p>
}
return(
<div className="App">
<div className="row">
<button className="testButton" onClick={this.previous}>LESS</button>
<button className="testButton" onClick={this.next}>MORE</button>
<br/>{page}<br/>{apiResponse.length}<div className="spacer"/>
</div>
<div className="row">
<InfiniteScroll
dataLength={apiResponse.length}
next={this.next}
hasMore={true}
>
{Object.values(apiResponse.slice(0, (this.state.page+1)*6)).map((value, index) =>
<a target="_blank" rel="noopener noreferrer" href={value.post}>
<img src={value.image} className="image"/>
</a>)}
</InfiniteScroll>
</div>
</div>
)
}
}
Если вы хотите запустить этот компонент на своей машине, вы, вероятно, захотите, чтобы ваши собственные JSON хранились локально в компоненте. Конечно, вам также придется соответствующим образом настроить строку Object.values(apiResponse.slice(0, (this.state.page+1)*6)).map
.
Вот как выглядят данные JSON, используемые моим компонентом. 25 объектов с URL-адресом изображения и ссылкой для тега <a>
, в котором отображается изображение.
[{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"},
{"image":"https://cdn.mos.cms.futurecdn.net/vChK6pTy3vN3KbYZ7UU7k3.jpg","post":"http://www.google.com"}]