reactjs - 从 API 获取所有数据后如何隐藏加载更多按钮?
问题描述
我有一个“加载更多”按钮,当所有数据都加载到屏幕上时,我想隐藏它。我不确定如何处理状态以在加载所有数据时使按钮消失,或者是否需要更改状态。我在这里附上了我的代码。你能检查我的代码并解决这个问题吗?
我的代码:
import React, { Component } from "react";
// import ReactDOM from "react-dom";
import { Link } from "react-router-dom";
import { Grid, Image, Icon, Segment, Card } from "semantic-ui-react";
class AllOffers extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
visible: 20,
isLoading: true,
};
this.loadMore = this.loadMore.bind(this);
}
loadMore() {
this.setState((prev) => {
return { visible: prev.visible + 16 };
});
}
async componentDidMount() {
const url = "https://localhost:3000/api/v4/web/list";
const postBody = {
store_id: 105,
};
const requestOptions = {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(postBody),
};
fetch(url, requestOptions)
.then((response) => response.json())
.then((json) => {
this.setState({ data: json.stores });
})
.catch((error) => console.error(error))
.finally(() => {
this.setState({ isLoading: false });
});
}
render() {
console.log(this.state.data)
return (
<React.Fragment>
<Grid className="znapoffer">
<Grid.Column width={16}>
<p className="znap-all">
<span>Znap All Offers</span>
</p>
</Grid.Column>
</Grid>
<Grid columns={4} className="all-offers">
{this.state.data.slice(0, this.state.visible).map((x, i) => {
return (
<Grid.Column key={i}>
<Segment>
<Card>
<Link to={x.store_url}>
{" "}
<Image src={x.image} wrapped ui={false} />
</Link>
<Card.Content>
<Link to={x.store_url}>
{" "}
<Card.Header>{x.name}</Card.Header>
</Link>
<Card.Description>{x.store_summary}</Card.Description>
</Card.Content>
<Card.Content extra>
<p className="rewards">
<span>
<img src="/images/rewards.png" alt=""></img>
</span>
Cash rewards upto <span>AED {x.cashback}</span>
</p>
<p className="location">
<span>
<img src="/images/location.png" alt=""></img>
</span>
<span className="store-location" key="index">{x.store_branches}</span>
{/* {x.store_branches.map((locations, index) => (
<span className="store-location" key="index">
{index === 0 ? (
<span>{locations.store_location}</span>
) : index >= 1 ? (
<span>
, {locations.store_location}
</span>
) : null}
</span>
))} */}
</p>{" "}
</Card.Content>
</Card>
</Segment>
</Grid.Column>
);
})}
</Grid>
<Grid className="znapoffer">
<Grid.Column width={16}>
<p className="loading-offers">
<span
onClick={this.loadMore}
className="btn btn-primary load-more"
Style="cursor:pointer;">
Loading more offers <Icon name="dropdown" />
</span>
</p>
</Grid.Column>
</Grid>
</React.Fragment>
);
}
}
export default AllOffers;
解决方案
您可以比较length
ofvisible
和 your data
。
数据长度 > 可见 => 显示加载更多
数据长度<可见=>不显示加载更多
像这样:
{
(this.state.data||[]).length > this.state.visible && (
<Grid className="znapoffer">
<Grid.Column width={16}>
<p className="loading-offers">
<span
onClick={this.loadMore}
className="btn btn-primary load-more"
Style="cursor:pointer;">
Loading more offers <Icon name="dropdown" />
</span>
</p>
</Grid.Column>
</Grid>
)
}
推荐阅读
- javascript - 将解析的对象转换为类实例
- vue.js - Vue Create - 在“...2”“标准版本”附近解析时 JSON 输入意外结束
- laravel - 手动触发 Stripe 订阅 webhook
- latex - 如何在 LaTeX 中删除备用对正
- javascript - 在使用 vuetify 上传之前预览图像“
“? - c++ - 从文件中获取不同类型的项目并将它们添加到数组中
- amazon-web-services - 在 Jenkins ZIP 中包含 Procfile 和 .ebextension 文件夹
- java - 具有记录级别锁定的集合?
- reactjs - 为什么我收到错误“TypeError:this.state.users.map 不是函数”
- javascript - 明确设置值时,Javascript函数返回未定义