Goods.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { useEffect, useState } from 'react';
  2. import { Route, useRouteMatch } from 'react-router-dom';
  3. import { connect } from 'react-redux';
  4. import s from './Goods.module.css';
  5. import { asyncGetGoods } from '../../redux/goods/operation';
  6. import { IGoodsProps, IGoodsState } from '../../typescript/goods/interfaces';
  7. import { TRouteMatchName } from '../../typescript/goods/types';
  8. import Good from './Good/Good';
  9. import Pagination from '../PaginationBar/PaginationBar';
  10. const Goods = ({ goodsArr, getGoods }: IGoodsProps) => {
  11. const {
  12. params: { name: routName },
  13. }: TRouteMatchName = useRouteMatch();
  14. useEffect(() => {
  15. getGoods();
  16. }, [getGoods]);
  17. const [page, setPage] = useState<number>(1);
  18. const handlePageChange = (page: number) => setPage(page);
  19. return goodsArr ? (
  20. <Route>
  21. <ul className={s.goods_list}>
  22. {goodsArr.length !== 0 &&
  23. goodsArr
  24. .slice((page - 1) * 5, page * 5)
  25. .map((good: any, i: number) => (
  26. <Good key={i} good={good} routName={routName} />
  27. ))}
  28. </ul>
  29. <Pagination
  30. page={page}
  31. total={Math.ceil(goodsArr.length / 5)}
  32. handlePageChange={handlePageChange}
  33. />
  34. </Route>
  35. ) : null;
  36. };
  37. const mapStateToProps = (state: IGoodsState) => ({
  38. goodsArr: state.goods.goodsArr,
  39. });
  40. const mapDispatchToProps = (dispatch: any) => ({
  41. getGoods: () => dispatch(asyncGetGoods()),
  42. });
  43. export default connect(mapStateToProps, mapDispatchToProps)(Goods);