Вызов API Paginate в React Component - PullRequest
0 голосов
/ 03 марта 2019

Я хочу разбить результаты вызова API.Я делаю вызов API, используя Axios, как это

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, он отображает 10 различных фильмов, относящихся к этой странице, в настоящий момент я жестко кодирую pageCount внутри состояния, чтобы убедиться, что он работает, и соответствующий номер страницы.показывает правильный список из 10 фильмов.

Теперь я хотел бы разбить результаты на страницы, обновив номер страницы, поэтому, когда вы нажимаете «Далее» или «3/4/5», компонент загружает правильные соответствующие результаты.Я пробовал пару вариантов, связанных с реакцией, но они почему-то не обновляют номер страницы.

Если кто-то может указать мне правильное направление или знает простое решение, я весь слух.

следующий код является целым компонентом, чтобы понять, что я пытаюсь сделать.

То, что у меня есть, похоже, работает, поэтому я прошу предоставить более простой и элегантный способ разбивки на страницы для этой конкретной ситуации.

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>

    );
  }
}

1 Ответ

0 голосов
/ 03 марта 2019

В вашей функции axios.get вы отправляете page: this.state.pageCount, однако в вашей функции handlePageChange вы устанавливаете state.currentPage, что мне не подходит.

Я тоже немногозапутался по поводу события onPageChange на <button />.Является ли эта кнопка пользовательским компонентом, который вы импортируете (в этом случае он должен быть заглавным, чтобы он был понятен), или это кнопка HTML?Если это кнопка HTML, вам нужно использовать событие onClick, которое передаст событие как аргумент функции handlePageChange.Я предполагаю, что это на заказ, хотя из реквизита, который вы передаете, так что просто стоит проверить, что он правильно передает значение page.

...