25
loading...
This website collects cookies to deliver better user experience
import React from "react";
class PagerBasic extends React.Component {
state = {
cursor: this.props.cursor || 0,
pagesCount: this.props.pagesCount || 0
};
changePage = (newCursor) => {
this.setState(
({ cursor }) => ({
cursor: newCursor
}),
() => this.props.onPageChange(this.state.cursor)
);
};
render() {
const { cursor, pagesCount } = this.state;
return this.props.children({
cursor,
pagesCount,
goPrev: () => {
this.changePage(this.state.cursor - 1);
},
goNext: () => {
this.changePage(this.state.cursor + 1);
},
changePage: this.changePage
});
}
}
export default PagerBasic;
function PrevNextPager(props) {
return (
<PagerBasic {...props}>
{({ cursor, pagesCount, goPrev, goNext }) => {
const prevBtnText = cursor - 1 < 0 ? "N/A" : "< Previous";
const nextBtnText = cursor + 1 < pagesCount ? "Next >" : "N/A";
return (
<div>
<span onClick={goPrev}>{prevBtnText}</span>
{<span> | </span>}
<span onClick={goNext}>{nextBtnText}</span>
</div>
);
}}
</PagerBasic>
);
}
import React, { useState } from "react";
const PagerBasic = (props) => {
const [cursor, setCursor] = useState(props.cursor || 0);
const [pagesCount] = useState(props.pagesCount || 0);
const changePage = (newCursor) => {
setCursor(newCursor);
props.onPageChange(cursor);
};
return props.children({
cursor,
pagesCount,
goPrev: () => {
changePage(cursor - 1);
},
goNext: () => {
changePage(cursor + 1);
},
changePage
});
};
export default PagerBasic;
import React, { useState } from "react";
// The hook
function usePager(initialCursor, initialPagesCount, pageChangeCallback) {
const [cursor, setCursor] = useState(initialCursor);
const [pagesCount] = useState(initialPagesCount);
const changePage = (newCursor) => {
setCursor(newCursor);
pageChangeCallback(cursor);
};
return [cursor, pagesCount, changePage];
}
// The component
const PagerBasic = (props) => {
const [cursor, pagesCount, changePage] = usePager(
props.cursor || 0,
props.pagesCount || 0,
props.onPageChange
);
return props.children({
cursor,
pagesCount,
goPrev: () => {
changePage(cursor - 1);
},
goNext: () => {
changePage(cursor + 1);
},
changePage
});
};
export default PagerBasic;
import { useEffect, useState, useRef } from "react";
const usePager = ({
cursor: initialCursor,
pagesCount: initialPagesCount,
onPageChange: pageChangeCallback
}) => {
const [cursor, setCursor] = useState(initialCursor);
const [pagesCount] = useState(initialPagesCount);
const firstUpdate = useRef(true);
useEffect(() => {
if (firstUpdate.current) {
firstUpdate.current = false;
} else {
pageChangeCallback(cursor);
}
}, [cursor, pageChangeCallback]);
const changePage = (newCursor) => {
setCursor(newCursor);
};
const goPrev = () => {
changePage(cursor - 1);
};
const goNext = () => {
changePage(cursor + 1);
};
return [cursor, pagesCount, goPrev, goNext, changePage];
};
export default usePager;
import React from "react";
import usePager from "./use-pager-hook";
const PagerBasic = (props) => {
const [cursor, pagesCount, changePage] = usePager(
props.cursor || 0,
props.pagesCount || 0,
props.onPageChange
);
return props.children({
cursor,
pagesCount,
goPrev: () => {
changePage(cursor - 1);
},
goNext: () => {
changePage(cursor + 1);
},
changePage
});
};
export default PagerBasic;
function PrevNextPager(props) {
const [cursor, pagesCount, goPrev, goNext] = usePager(props);
const [prevBtnText, setPrevBtnText] = useState("");
const [nextBtnText, setNextBtnText] = useState("");
useEffect(() => {
setPrevBtnText(cursor - 1 < 0 ? "N/A" : "< Previous");
setNextBtnText(cursor + 1 < pagesCount ? "Next >" : "N/A");
}, [cursor, pagesCount]);
return (
<div>
<span onClick={goPrev}>{prevBtnText}</span>
{<span> | </span>}
<span onClick={goNext}>{nextBtnText}</span>
</div>
);
}
function QuickPager(props) {
const [cursor, pagesCount, goPrev, goNext, changePage] = usePager(props);
const [prevBtnText, setPrevBtnText] = useState("");
const [nextBtnText, setNextBtnText] = useState("");
const buffer = new Array(props.pagesBuffer).fill(0); // useMemo?
useEffect(() => {
setPrevBtnText(cursor - 1 < 0 ? "N/A" : "< Previous");
setNextBtnText(cursor + 1 < pagesCount ? "Next >" : "N/A");
}, [cursor, pagesCount]);
return (
<div>
<span onClick={goPrev}>{prevBtnText}</span>
{buffer.map((item, index) => {
const pageCursor = cursor + index;
const className = pageCursor === cursor ? "selected" : "normal";
return pageCursor >= 0 && pageCursor < pagesCount ? (
<span
key={`page-${pageCursor}`}
onClick={() => changePage(pageCursor)}
className={className}
>
{` [${pageCursor}] `}
</span>
) : null;
})}
<span onClick={goNext}>{nextBtnText}</span>
</div>
);
}
useEffect(() => {
setPrevBtnText(cursor - 1 < 0 ? "N/A" : "< Previous");
setNextBtnText(cursor + 1 < pagesCount ? "Next >" : "N/A");
}, [cursor, pagesCount]);
import { useState, useEffect } from "react";
const useNavigationBtns = ({ cursor, pagesCount } = {}) => {
const [prevBtnText, setPrevBtnText] = useState("");
const [nextBtnText, setNextBtnText] = useState("");
useEffect(() => {
setPrevBtnText(cursor - 1 < 0 ? "N/A" : "< Previous");
setNextBtnText(cursor + 1 < pagesCount ? "Next >" : "N/A");
}, [cursor, pagesCount]);
return [prevBtnText, nextBtnText];
};
export default useNavigationBtns;
function PrevNextPager(props) {
const [cursor, pagesCount, goPrev, goNext] = usePager(props);
const [prevBtnText, nextBtnText] = useNavigationBtns({ cursor, pagesCount });
return (
<div>
<span onClick={goPrev}>{prevBtnText}</span>
{<span> | </span>}
<span onClick={goNext}>{nextBtnText}</span>
</div>
);
}