You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当API无更多数据时隐藏/移除React组件中按钮的实现方案

解决方案:处理API请求失败并隐藏按钮

我来帮你搞定这个问题~你的代码有几个小细节需要调整,主要是错误判断数据是否存在的方式和处理API请求失败的场景,下面是修复后的完整代码:

import React from 'react';
import ReactDOM from 'react-dom';
import axios from 'axios';

class List extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      personagens: [],
      page: 1,
      showBtn: true,
    };
    this.getNextPers = this.getNextPers.bind(this);
  }

  getNextPers(){
    const peopleApiEndpoint = `https://swapi.co/api/people/${this.state.page}`;
    axios.get(peopleApiEndpoint)
      .then((response) => {
        // 成功获取到数据,添加到列表中
        this.setState({
          personagens: [...this.state.personagens, response.data],
          page: this.state.page + 1
        });
      })
      .catch((error) => {
        // 请求失败(比如没有更多数据,返回404),隐藏按钮
        if (error.response.status === 404) {
          this.setState({ showBtn: false });
        }
        console.log('没有更多人物数据了', error);
      });
  }

  render(){
    return (
      <div>
        <p><b>Personagens:</b></p>
        {this.state.personagens.map((pers, i) => (
          <div key={i}>
            <br />
            <p><i>Name:</i> {pers.name}</p>
            <p><i>Height:</i> {pers.height} cm</p>
            <p><i>Mass:</i> {pers.mass} kg</p>
          </div>
        ))}
        {/* 根据showBtn状态决定是否渲染按钮 */}
        {this.state.showBtn && <button onClick={this.getNextPers}>Ver Mais</button>}
      </div>
    );
  }
}

ReactDOM.render(<List />, document.getElementById('root'));

关键修改点说明:

  • 修正数据存储逻辑:
    原来你把整个axios响应对象存在personagens里,现在改为存储response.data(这才是API返回的人物数据),所以渲染的时候直接用pers.name而不是pers.data.name。

  • 正确处理无数据的情况:
    当请求的page超过API中人物的最大ID时,API会返回404错误,我们通过catch块捕获这个错误,判断状态码为404时,设置showBtn: false来隐藏按钮。

  • 条件渲染按钮:
    在render里用{this.state.showBtn && <button ...>}来控制按钮的显示,只有当showBtn为true时才渲染按钮。

另外补充一点:如果后续你想改用SWAPI的分页列表接口(比如https://swapi.co/api/people/?page=${this.state.page}),可以通过判断response.data.next是否为null来决定是否隐藏按钮,这样更符合分页接口的逻辑,但目前你的代码是请求单个人物,所以用404判断是合适的。

内容的提问来源于stack exchange,提问作者user8955599

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:04