разбиение на страницы с использованием реакции, реакции-маршрутизатора и редукции

Итак, я делаю сайт электронной коммерции, используя react, react-router v4, react-router-redux и react-redux.

У меня есть страница «Продукты», на которой перечислены все продукты. Список продуктов находится в моем магазине Redux. Я делаю это таким образом, поскольку затем я могу использовать фильтры брендов и фильтры ценового диапазона, чтобы повторно отображать соответствующие продукты в моем списке.

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

Я нашел методы для добавления нумерации страниц, я думаю, что эта часть кажется достаточно простой. Часть, с которой я борюсь, заключается в том, как мне сообщить моему компоненту, какую часть продуктов отображать на каждой странице цикла разбиения на страницы??

вот как сейчас выглядит мой контейнерный компонент:

import React from 'react';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';

import changeBrandFilter from '../actions/changeBrandFilter';
import changePriceFilter from '../actions/changePriceFilter';

import KitsOverview from './KitsOverview';
import Filter from './Filter';
import ProductsListItem from './ProductsListItem';
import FilterCSS from './Filter.css';

class KitsPage extends React.Component{
    createBrandFilterList() {
        return this.props.brandFilters.map(filter => {
            return (
                <Filter
                    key={filter.brand}
                    id={filter.brand}
                    changeFilter={() => this.props.changeBrandFilter(filter)}
                    inuse={filter.inuse}
                    disabled={filter.disabled}
                />
            )
        })
    }
    createPriceRangeFilterList() {
        return this.props.priceRangeFilters.map(filter => {
            return (
                <Filter
                    key={filter.priceRange}
                    id={filter.priceRange}
                    changeFilter={() => this.props.changePriceFilter(filter)}
                    inuse={filter.inuse}
                    disabled={filter.disabled}
                />
            )
        })
    }
    createKitsProductsList() {
        if(this.props.products.length > 0) {
            return this.props.products.map(product =>{
                return (
                    <ProductsListItem
                        key={product.id}
                        brand={product.brand}
                        model={product.model}
                        price={product.price}
                        image={product.image}
                        link={"/kitproducts/"+product.id}
                    />
                )
            })} else {
                return <div>No products match the filter criteria selected above.</div>
            } 
    }
    render () {
        return (
            <div>
              <div className="container">
                <div className="row">
                    <KitsOverview />
                </div>
                <div className="row">
                    <div className="filtersList col-md-6 col-xs-12">
                        Filter by Brand:
                        <div>
                            {this.createBrandFilterList()}
                        </div>
                    </div>
                    <div className="filtersList col-md-6 col-xs-12">
                        Filter by Price Range:
                        <div>
                            {this.createPriceRangeFilterList()}
                        </div>
                    </div>
                </div>
                <div className="row">
                    <div>
                        {this.createKitsProductsList()}
                    </div>
                </div>
              </div>
            </div>
        )
    }
};

function mapStateToProps(state) {
    let brandFilters = state.kitsBrandFilters;
    let priceRangeFilters = state.kitsPriceRangeFilters;
    let products = state.kitsProducts;
    let filtered_products = products;
    let activeBrandFilters = brandFilters.filter(
        item => item.inuse === true
    );
    activeBrandFilters.forEach(filter => {
        filtered_products = filtered_products.filter(
            product => product.brand === filter.brand
        )
    });
    let activePriceRangeFilters = priceRangeFilters.filter(
        item => item.inuse === true
    );
    activePriceRangeFilters.forEach(filter => {
        filtered_products = filtered_products.filter(
            product => product.priceRange === filter.priceRange
        );
    });
    return {
    brandFilters: brandFilters,
    priceRangeFilters: priceRangeFilters,
    products: filtered_products
    };
};

function matchDispatchToProps(dispatch){
    return bindActionCreators({changeBrandFilter: changeBrandFilter, changePriceFilter: changePriceFilter}, dispatch);
};

export const KitsPageContainer = connect(mapStateToProps, matchDispatchToProps)(KitsPage);

person Gurtaj    schedule 09.08.2017    source источник
comment
вы получаете все элементы из своего бэкэнда сразу и просто показываете разные страницы, или вы делаете отдельные вызовы API каждый раз, когда разбиваете результаты на страницы?   -  person canaan seaton    schedule 09.08.2017
comment
Я чувствую, что здесь отсутствует некоторая информация, и было бы полезно узнать, что вы пробовали до сих пор, поскольку я не вижу здесь логики для реализации разбивки на страницы. Кроме того, укажите тип нумерации страниц, который вы пытаетесь реализовать... на основе смещения или на основе курсора. Ваш выбор дизайна, безусловно, изменит ваш подход к этому. Основанный на смещении, который использует перечисление, потребует знания смещения, предела и общего количества, тогда как основанный на курсоре должен знать начальную позицию, а затем иметь указатель на текущую позицию и счетчик, чтобы знать, на сколько увеличить.   -  person Scot Matson    schedule 09.08.2017
comment
В настоящее время у меня нет настроенного API canaan, я надеялся, что смогу сделать все это на интерфейсе?   -  person Gurtaj    schedule 09.08.2017
comment
Привет, Скотт, спасибо за ваш ответ, я попробовал модуль узла (paginatr), который на первый взгляд кажется действительно хорошим, но я продолжал получать сообщение об ошибке, нет такой функции, как this.pagination, хотя он инструктирует меня сделать это в примере модуля коды. Извините, если я оставил это очень расплывчатым, я думаю, что я хочу знать, должен ли я создавать новые массивы продуктов, полученных из моего магазина, в самом компоненте?   -  person Gurtaj    schedule 09.08.2017
comment
Поскольку у вас нет текущего настроенного API, вы можете загружать записи постранично. LIMIT(offset, limit) — полезная функция в MySQL, которую вы можете использовать. Если вы решите загрузить все записи сразу, вам нужно будет выбрать какой-то порядок, чтобы одни имели приоритет над другими (например, идентификатор 1 перед идентификатором 100). Затем просто отфильтруйте записи на основе количества имеющихся у вас страниц и страницы, на которой вы находитесь. записи = лимит (лимит * текущая страница, лимитное число)   -  person fungusanthrax    schedule 09.08.2017