【发布时间】:2019-09-21 04:16:21
【问题描述】:
我目前正在自学代码,目前正在研究 React.js。我正在构建一个简单的应用程序,它显示通过 punkAPI (https://punkapi.com/documentation/v2) 提取的啤酒信息。
在我的应用程序中,我想添加某种“无限”滚动,当用户到达页面底部时,它会从 API 中提取更多数据。
目前,handleScroll 方法有效,并且更新了组件的状态,但它没有触发 render 方法,我想知道为什么。
我意识到我的代码有很多问题,我计划对其进行重构,在 this.state 中添加一些布尔值以检查是否还有更多数据要加载,处理错误并且不触发 handleScroll方法如此密集。
但是,我仍然想知道为什么即使状态已更新,也没有发生渲染。
class BeerList extends Component {
constructor() {
super()
this.state = {
loading: false,
beers: []
}
this.handleScroll = this.handleScroll.bind(this)
}
componentDidMount() {
window.addEventListener('scroll', this.handleScroll, true);
this.setState({
loading: true
})
fetch("https://api.punkapi.com/v2/beers?per_page=12")
.then(response => response.json())
.then(data => {
this.setState({
loading: false,
beers: data
})
})
}
handleScroll() {
const checkForNewBeers = () => {
let lastBeerCard = document.querySelector(".beer-list > div:last-child");
let lastBeerCardOffset = lastBeerCard.offsetTop + lastBeerCard.clientHeight;
let pageOffset = window.pageYOffset + window.innerHeight;
if (pageOffset <= lastBeerCardOffset - 10) {
return;
}
this.setState(prevState => {
const beers = prevState.beers;
const page = (prevState.beers.length / 12) + 1;
fetch(`https://api.punkapi.com/v2/beers?per_page=12&page=${page}`)
.then(response => response.json())
.then(data => {
for (let item of data) {
beers.push(item);
}
console.log({
beers: beers
});
return {
beers: beers
}
});
});
}
document.addEventListener("scroll", function (event) {
checkForNewBeers();
});
}
render() {
let beerCards = []
if (this.state.beers.length > 0) {
beerCards = this.state.beers.map(beer => {
return <BeerCard
key = {
beer.id
}
img = {
beer.image_url
}
title = {
beer.name
}
description = {
beer.description
}
/>
})
}
return ( <
div className = "container" >
<
div className = "row beer-list" > {
beerCards
} <
/div> < /
div >
)
}
}
export default BeerList
因此,当页面加载时,BeerCards 会正确附加,然后当您滚动控制台时,会显示状态已更新(太多但仍然如此)。我希望该页面加载大量的 BeerCards,但什么也没有发生。这是为什么呢?
【问题讨论】:
-
您确定
handleScroll中的状态正在更新吗?只要您调用 fetch (setState中的最后一条语句),就会返回一个未定义的。
标签: javascript reactjs scroll state render