Member 14628534 Ответов: 1

Как мне разбить эту страницу на страницы? Reactjs


Я получил задание от моего наставника, чтобы выяснить, как разбить следующий код на страницы, и использовать любые ресурсы, которые у меня есть, чтобы понять это. Использование ReactJS для разработки веб-приложения.
Какие еще файлы мне нужны? Я бы хотел иметь своего рода бесконечную функцию прокрутки, но даже если это просто нормальная пагинация, это тоже было бы прекрасно. Пожалуйста помочь.

import React, { Component } from 'react';
import {
  Container,
  Row,
  Col,
  Card,
  CardHeader,
  CardBody,
  // CardFooter,
  CardTitle
} from 'reactstrap';
import HomePageNavbar from 'components/Navbars/HomePageNavbar';
import HomePageFooter from 'components/Footers/HomePageFooter';
import TBIHelmet from 'components/App/TBIHelmet';
import { withFirebase } from '../../components/Firebase';
import { withTBIBadWordsFilter } from '../../components/TBIBadWordsFilter';
import { compose } from 'recompose';
import FirebaseImage from 'components/App/FirebaseImage';
import pageImage from '../../assets/img/tolaga-bay-inn/Uawa River.png';
import LoadingOverlayModal from '../../components/App/LoadingOverlayModal';
import BusinessProfilePageNavbar from 'components/Navbars/BusinessProfilePageNavbar';

class BlogPostsPage extends Component {
  constructor(props) {
    super(props);
    const {
      _bpid
    } = this.props.match.params;
    this.state = {
      isLoading: true,
      dbBlogPosts: {},
      dbBlogPostsAsArray: [],
      _bpid: _bpid,
      businessProfileName: '',
      businessProfileCoreLinks: {},
      businessProfileSocialMediaLinks: {}
    };
  }
  componentDidMount = async () => {
    document.documentElement.classList.remove('nav-open');
    const {
      firebase
    } = this.props,
      {
        _bpid
      } = this.state,
      existingDbBlogPosts = await firebase.getDbBlogPosts(),
      snapshot = _bpid
        ? await existingDbBlogPosts
          .orderByChild('_bpid')
          .equalTo(_bpid)
          .once('value')
        : await existingDbBlogPosts
          .once('value'),
      dbBlogPosts = await snapshot.val(),
      dbBlogPostsAsArray = [],
      existingDbBusinessProfile = await firebase.getDbBusinessProfile(_bpid),
      dbBusinessProfileRef = await existingDbBusinessProfile.once('value'),
      dbBusinessProfile = await dbBusinessProfileRef.val(),
      authors = [];
    let name = '',
        coreLinks = {},
        socialMediaLinks = {};
    if (dbBusinessProfile) {
      name = dbBusinessProfile.name || '';
      coreLinks = dbBusinessProfile.coreLinks || {};
      socialMediaLinks = dbBusinessProfile.socialMediaLinks || {};
    }
    if (dbBlogPosts) {
      for (let key in dbBlogPosts) {
        const dbBlogPost = dbBlogPosts[key],
        {
          authorUid
        } = dbBlogPost,
        authorIndex = authors.findIndex(a =>
          a.uid === authorUid);
        let author = null;
        if (authorUid) {
          if (authorIndex === -1) {
            const dbUser = await firebase.getDbUserValue(authorUid);
            author = dbUser;
            authors.push(author);
          } else {
            author = authors[authorIndex];
          }
        }
        dbBlogPost.author = author
          ? author.displayName || author.email
          : '';
        dbBlogPostsAsArray.push(dbBlogPost);
      }
    }
    this.setState({
      isLoading: false,
      dbBlogPosts: dbBlogPosts,
      dbBlogPostsAsArray: dbBlogPostsAsArray,
      businessProfileName: name,
      businessProfileCoreLinks: coreLinks || {},
      businessProfileSocialMediaLinks: socialMediaLinks || {}
    });
  }
    handleBlogPostClick = e => {
    e.preventDefault();
    const {
      _bpid
    } = this.state;
    const {
      bpid
    } = e.currentTarget.attributes;
    if (_bpid) {
      this.props.history.push(`/BusinessProfile/${_bpid}/Blog/${bpid.value}`);
    } else {
      this.props.history.push(`/Blog/${bpid.value}`);
    }

  };

  render = () => {
    const {
      isLoading,
      _bpid,
      businessProfileName,
      businessProfileCoreLinks,
      businessProfileSocialMediaLinks
    } = this.state,
      {
        badWordsFilter
      } = this.props,
      cleanedBusinessProfileName = badWordsFilter.filter.clean(businessProfileName);
    return (
      <>
        <TBIHelmet

          name="Blog Posts"

          path="/Blog"

          description="Blog Posts are constantly happening in & around the Tolaga Bay Inn all the time for the wider community."

          subject="Welcome to the Tolaga Bay Inn. Your home away from home in the heart of the East Coast."

          keywords="tolaga bay, tolaga bay inn, tolaga bay innovation, tolaga bay nz, tolaga bay gisborne, tolaga"

        />
        {
          _bpid
            ? <BusinessProfilePageNavbar

              bpid={_bpid}

              businessProfileName={cleanedBusinessProfileName}

              coreLinks={businessProfileCoreLinks}

              socialMediaLinks={businessProfileSocialMediaLinks}

            />
            : <HomePageNavbar />
        }
        <div

          style={{

            backgroundImage: `url('${pageImage}')`,

            marginTop: '0',

            paddingTop: "100px"

          }}

          className="page-header"

        >
          <div className="filter" />
          <Container className="home-page-container">
            <Row>
              <Col className="ml-auto mr-auto">
                <div className="motto text-center"

                  style={{

                    minWidth: '450px'

                  }}>
                  <h1>Blog</h1>
                  <br />
                  <h4>Follow our blog and keep up to date with {`${_bpid ? `${cleanedBusinessProfileName}` : 'the Tolaga Bay Innovation movement'}`}.</h4>
                </div>
              </Col>
            </Row>
          </Container>
        </div>
        <br />
        <br />
        <div className="blog-page">
        {
          isLoading
            ? <LoadingOverlayModal />
            : <Container>
              <Row>
                {this.state.dbBlogPostsAsArray.map(dbBlogPost => (
                  <Col key={dbBlogPost.bpid}>
                    <Card className="blog-cards" bpid={dbBlogPost.bpid} onClick={this.handleBlogPostClick}>
                      <FirebaseImage

                        imageResize="md"

                        className="blog-posts-background-image"

                        loadingIconSize=""

                        alt={this.props.badWordsFilter.filter.clean(dbBlogPost.title)}

                        imageURL={dbBlogPost.backgroundImage} />
                      <CardHeader>
                        <CardTitle className="blog-card-title">{this.props.badWordsFilter.filter.clean(dbBlogPost.title)}</CardTitle>
                      </CardHeader>
                      <CardBody

                        className="blog-card-content"

                        dangerouslySetInnerHTML={{

                          __html: this.props.badWordsFilter.filter.clean(dbBlogPost.content)

                        }} />
                      <CardHeader>
                        <CardTitle  className="blog-card-footer">Published by {this.props.badWordsFilter.filter.clean(dbBlogPost.author)} on {dbBlogPost.publishDate}</CardTitle>
                      </CardHeader>
                    </Card>
                  </Col>
                ))}
              </Row>
            </Container>
          }
          </div>
        <HomePageFooter />
      </>
    );
  };
}

export default compose(
  withFirebase,
  withTBIBadWordsFilter
)(BlogPostsPage);


Что я уже пробовал:

Я пробовал использовать различные примеры бесконечного скроллера в интернете, но понятия не имею, как реализовать его в своем коде.

1 Ответов

Рейтинг:
0

Andy Lanng

Кажется довольно простым:

https://www.npmjs.com/package/react-infinite-scroller[^]

Я не вижу никакой реализации компонентов бесконечной прокрутки в вашем коде.

1: Посмотрите на примеры на странице npm
2: Включите в свою запись некоторую простую нумерацию страниц.
3: Следите за тем, какие страницы были загружены (простой итератор int будет делать)
4: получить следующую страницу элементов в функции обратного вызова "LoadData"
5: ?????
6: прибыль


Member 14628534

Эй, спасибо за ответ, Извини, что я новичок в этом деле. Но возможно ли, что вы могли бы дать мне пример, в этом коде, того, что вы имеете в виду?

Andy Lanng

верите или нет, у меня тоже :) В данный момент я очень увлечен реакцией.
На этой странице есть ссылка на "демо-источник", который является полным компонентом, использующим библиотеку. "Демо" довольно просто отлаживается с помощью любых инструментов разработки браузеров, поэтому вы можете увидеть его в действии.

Andy Lanng

О, подождите! неужели я вчера все неправильно понял? Вы используете ReactJS, node React для NodeJS. К сожалению, этот ответ не подходит для вашего текущего вопроса.