当前位置: 代码迷 >> JavaScript >> React组件中的分页API调用
  详细解决方案

React组件中的分页API调用

热度:88   发布时间:2023-06-06 09:42:21.0

我想对Api呼叫的结果进行分页。 我正在使用这样的Axios进行Api呼叫

apiCall() {
const API = `http://www.omdbapi.com/`;
axios.get(API, {
        params: {
            apikey: process.env.REACT_APP_MOVIECALL_API_KEY,
            type: 'movie',
            s: 'superhero',
            page: this.state.pageCount
        }
    })
    .then(res => {
        const superheroes = res.data.Search
        const totalResults= parseInt(res.data.totalResults)
        this.setState({
            totalResults
        });
        this.setState({
            superheroes
        })
    })
    .catch((error) => {
        console.log(error);
    });
}

当安装组件时,将调用这样的函数

  componentDidMount() 
    { 
     this.apiCall();
    }

在渲染功能中,我映射每个搜索结果(在api调用中,s参数是搜索选项),对于每个结果,我显示一个按钮,单击该按钮可显示该电影的相关信息。 默认情况下,该API每次调用显示10个结果,但此特定搜索总共有123个结果。 现在,通过更新我已设置为this.state.pageCount的调用中的param页面,它显示了与该页面相关的10部不同的电影,此刻,我在状态中对pageCount进行了硬编码,以确保其有效以及相应的页码显示10部电影的正确列表。

现在,我想通过更新页码来对结果进行分页,因此,当您单击next或数字3/4/5时,组件将加载正确的相应结果,我尝试了一些与react有关的选项,但它们不知何故不更新页码。

如果有人可以向我指出正确的方向或知道一个简单的解决方案,那么我无所不能。

以下代码是整个组件,以了解我要执行的操作。

到目前为止,我似乎正在工作,所以我要问的是针对这种特殊情况采用更简单,更优雅的分页方法。

export class MovieDetails extends Component {
  constructor(props){
    super(props)
    this.state = {
      superheroes: [],
      clicked: false,
      activeHero: {},
      pageCount: 11,
      totalResults: null,
      currentPage: 1
    }
    this.handleClick = this.handleClick.bind(this);
  }


  handleClick(hero) {
    const checkActive = this.state.activeHero.imdbID === hero.imdbID
    const activeHero = {...hero, active: !checkActive}
    this.setState({
      clicked: !this.state.clicked,
      activeHero
    })
  }    

  apiCall() {
    const API = `http://www.omdbapi.com/`;
    axios.get(API, {
            params: {
                apikey: process.env.REACT_APP_MOVIECALL_API_KEY,
                type: 'movie',
                s: 'superhero',
                page: this.state.pageCount
            }
        })
        .then(res => {
            const superheroes = res.data.Search
            const totalResults = parseInt(res.data.totalResults)
            this.setState({
              totalResults
            });
            this.setState({
                superheroes
            })
        })
        .catch((error) => {
            console.log(error);
        });
  }

  componentDidMount() {
    this.apiCall();
    }

    handlePageChange = (page, e) => {
      this.setState({
        currentPage: page
      });
      this.apiCall(this.setState({pageCount: page}))

    };


  render() {

    const {superheroes, currentPage } = this.state
    return (
        <div>
      {
        superheroes.map((hero, i) => 
            <div className="Results" key={i}>
            <button onClick={() => {this.handleClick(hero)}}> 
            <h1>{hero.Title}</h1>
            {
              this.state.clicked && this.state.activeHero.imdbID === hero.imdbID
                ? <ul>
                    {<div key={i}>
                    Movie Title: <h2> {hero.Title}</h2>
                      Year of Release: <h2>{hero.Year}</h2>
                      ID: <h2>{hero.imdbID}</h2>
                      <div><img className="Poster" alt="movieposter" src={hero.Poster}/></div>
                      </div>
              }
            </ul>
          : null
      }
      </button>
      </div>) 
   }
          <div className="Pagination"> 
          <Pagination
          total={this.state.totalResults}
          limit={10}
          pageCount={this.state.pageCount}
          currentPage={currentPage}
        >
          {({
            pages,
            currentPage,
            hasNextPage,
            hasPreviousPage,
            previousPage,
            nextPage,
            totalPages,
            getPageItemProps
          }) => (
            <div>
              <button
                {...getPageItemProps({
                  pageValue: 1,
                  onPageChange: this.handlePageChange
                })}
              >
                first
              </button>

              {hasPreviousPage && (
                <button
                  {...getPageItemProps({
                    pageValue: previousPage,
                    onPageChange: this.handlePageChange
                  })}
                >
                  {'<'}
                </button>
              )}

              {pages.map(page => {
                let activePage = null;
                if (currentPage === page) {
                  activePage = { backgroundColor: '#fdce09' };
                }
                return (
                  <button
                    {...getPageItemProps({
                      pageValue: page,
                      key: page,
                      style: activePage,
                      onPageChange: this.handlePageChange
                    })}
                  >
                    {page}
                  </button>
                );
              })}

              {hasNextPage && (
                <button
                  {...getPageItemProps({
                    pageValue: nextPage,
                    onPageChange: this.handlePageChange
                  })}
                >
                  {'>'}
                </button>
              )}

              <button
                {...getPageItemProps({
                  pageValue: totalPages,
                  onPageChange: this.handlePageChange
                })}
              >
                last
              </button>
            </div>
          )}
        </Pagination>
          </div>
      </div>

    );
  }
}

axios.get函数中,您正在发送page: this.state.pageCount ,但是在handlePageChange函数中,您正在设置state.currentPage ,这对我来说似乎state.currentPage

我对<button />上的onPageChange事件也有些困惑。 此按钮是您要导入的自定义组件(在这种情况下,应使用大写字母以使其清晰可见)还是HTML按钮? 如果是HTML按钮,则需要使用onClick事件,该事件会将事件作为参数传递给handlePageChange函数。 我猜测它是自定义的,尽管从传递它的道具来看,所以值得检查一下它是否正确发送了page值。

  相关解决方案