如何实现分页以通过语义UI反应进行反应

时间:2019-08-13 05:58:39

标签: reactjs typescript semantic-ui

我正在通过pagination实现semantic-ui-react的功能。
我可以实现分页组件本身,但是不能实现onPageChange来设置activePage和控制显示的页面数。

我将react用于客户端功能。
另外,我在CSS框架中使用语义UI响应。

数组的所有内容现在都列在单个页面上。 但是我想实现分页并限制在单个页面上显示5个内容。
我以某种方式理解我需要使用onPageChange,但不知道如何实现该目标。

import React from 'react';
import {Link} from 'react-router-dom';
import {Grid, Segment, Container, Header, Pagination} from 'semantic-ui-react';
import axios from 'axios';
import {Article} from '../articleData';

interface ArticleState {
  articles: Article[];
}

class List extends React.Component<{}, ArticleState> {
  constructor(props: {}) {
    super(props);
    this.state = {
      articles: [],
    };
    this.serverRequest = this.serverRequest.bind(this);
    this.btnClick = this.btnClick.bind(this);
  }

  serverRequest() {
    axios
      .get('/api/articles')
      .then(response => {
        this.setState({articles: response.data});
      })
      .catch(response => console.log('ERROR!! occurred in Backend.'));
  }

  btnClick(event: React.MouseEvent<HTMLAnchorElement>, data: object) {
  }

  componentDidMount() {
    this.setState({articles: []});
    this.serverRequest();
  }

  render() {
    return (
      <Container style={{marginTop: '7em'}} text>
        <Grid columns={1} divided="vertically">
          <Grid.Row>
            {(this.state.articles || []).map(function(articleData, i) {
              return (
                <Grid.Column>
                  <Segment>
                    <Header as="h1">{articleData.title}</Header>
                    <p>{articleData.content}</p>
                    <Link to={`/detail/${articleData.id}`}>
                      continue reading
                    </Link>
                  </Segment>
                </Grid.Column>
              );
            })}
          </Grid.Row>
        </Grid>
        <Pagination
          defaultActivePage={5}
          totalPages={Math.floor(this.state.articles.length / 2) + 1}
        //onPageChange={this.btnClick}
        />
      </Container>
    );
  }
}

export default List;

我希望分页功能可以将单个页面上显示的内容数限制为5。
但实际上我不知道如何实现此功能。

2 个答案:

答案 0 :(得分:0)

从语义UI文档中,onPageChange是一个具有两个参数的函数:

  • event-React的原始SyntheticEvent
  • 数据-包含所有道具的对象

在数据对象内部,有一个名为activePage的键,它表示在更改分页时的新页码。

这是一个非常基本的示例,通过将新选择的页码记录到控制台来演示这一点。

<Pagination 
  defaultActivePage={5}
  totalPages={10}
  onPageChange={(event, data) => console.log(data.activePage)}
/>

但是,我认为您对语义UI中的分页如何工作的期望可能不正确。分页组件纯粹呈现可点击的页码列表,它不处理结果的显示或限制显示的结果数。

这通常在API中处理。一种常见的方法是在URL中使用一个?page=x查询字符串参数(有时是?offset=)。然后,您可以使用语义分页组件中的activePage值向服务器指示要返回的结果页面。

答案 1 :(得分:0)

我解决了这个问题。
这是代码:

import React from 'react';
import {Link} from 'react-router-dom';
import {
  Grid,
  Segment,
  Container,
  Header,
  Pagination,
  PaginationProps,
  Icon,
} from 'semantic-ui-react';
import axios from 'axios';
import {Article} from '../articleData';

interface ArticleState {
  articles: Article[];
  articleDatas: Article[];
  begin: number;
  end: number;
  activePage: number;
}

class List extends React.Component<{}, ArticleState> {
  constructor(props: {}) {
    super(props);
    this.state = {
      articles: [],
      articleDatas: [],
      begin: 0,
      end: 5,
      activePage: 1,
    };
    this.serverRequest = this.serverRequest.bind(this);
    this.btnClick = this.btnClick.bind(this);
  }

  async serverRequest() {
    const res = await axios.get('/api/articles');
    this.setState({articles: res.data});
  }

  async btnClick(
    event: React.MouseEvent<HTMLAnchorElement>,
    data: PaginationProps
  ) {
    await this.setState({activePage: data.activePage as number});
    await this.setState({begin: this.state.activePage * 5 - 5});
    await this.setState({end: this.state.activePage * 5});
    this.setState({
      articleDatas: this.state.articles.slice(this.state.begin, this.state.end),
    });
  }

  async componentDidMount() {
    this.setState({articles: []});
    await this.serverRequest();
    this.setState({
      articleDatas: this.state.articles.slice(this.state.begin, this.state.end),
    });
  }

  render() {
    return (
      <Container style={{marginTop: '3em'}} text>
        <Grid columns={1} divided="vertically">
          <Grid.Row>
            {(this.state.articleDatas || []).map(function(articleData, i) {
              return (
                <Grid.Column>
                  <Segment>
                    <Header as="h1">{articleData.title}</Header>
                    <p>{articleData.content}</p>
                    <Link to={`/detail/${articleData.id}`}>
                      continue reading
                    </Link>
                  </Segment>
                </Grid.Column>
              );
            })}
          </Grid.Row>
        </Grid>
        <Pagination
          defaultActivePage={1}
          totalPages={Math.ceil(this.state.articles.length / 5)}
          onPageChange={this.btnClick}
        />
      </Container>
    );
  }
}

export default List;