From c61325850c7b041914eeb33f6721e73bf7c21a24 Mon Sep 17 00:00:00 2001 From: slTrust Date: Thu, 18 Feb 2021 23:09:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=BD=E7=A6=BB=20usePager=20=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=20hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hooks/usePager.tsx | 49 +++++++++++++++++++++++++++++++++++++++++++ pages/posts/index.tsx | 15 ++++++------- 2 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 hooks/usePager.tsx diff --git a/hooks/usePager.tsx b/hooks/usePager.tsx new file mode 100644 index 0000000..bd88140 --- /dev/null +++ b/hooks/usePager.tsx @@ -0,0 +1,49 @@ +import Link from 'next/link'; +import _ from 'lodash'; + +type Options = { + page: number; + totalPage: number; + urlMaker?: (n: number) => string; +} +const defaultUrlMaker = (n:number) => `?page=${n}` + +export const usePager = (options: Options) => { + const {page, totalPage, urlMaker: _urlMaker} = options; + const urlMaker = _urlMaker || defaultUrlMaker + const numbers = []; + numbers.push(1); + for (let i = page - 3; i <= page + 3; i++) { + numbers.push(i); + } + numbers.push(totalPage); + const pageNumbers = _.uniq(numbers).sort().filter(n => n >= 1 && n <= totalPage) + .reduce((result, n) => n - (result[result.length - 1] || 0) === 1 ? + result.concat(n) : result.concat(-1, n), []); + console.log('inner') + const pager = ( +
+ {page !== 1 && 上一页} + {pageNumbers.map(n => n === -1 ? + ... : + {n})} + + {page < totalPage && + 下一页} + + 第 {page} / {totalPage} 页 + + + +
+ + ); + return {pager}; +}; \ No newline at end of file diff --git a/pages/posts/index.tsx b/pages/posts/index.tsx index 0a8838f..7337c3b 100644 --- a/pages/posts/index.tsx +++ b/pages/posts/index.tsx @@ -3,15 +3,18 @@ import {getDatabaseConnection} from 'lib/getDatabaseConnection'; import {Post} from 'src/entity/Post'; import Link from 'next/link'; import qs from 'querystring'; +import {usePager} from '../../hooks/usePager'; type Props = { posts: Post[]; count: number; perPage: number; page: number; + totalPage: number; } const PostsIndex: NextPage = (props) => { - const {posts} = props; + const {posts, page, totalPage} = props; + const {pager} = usePager({page, totalPage}) return (

文章列表({props.count}) 每页{props.perPage}

@@ -25,10 +28,7 @@ const PostsIndex: NextPage = (props) => {
)} ); @@ -41,7 +41,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { const query = qs.parse(search); const page = parseInt(query.page?.toString()) || 1; const connection = await getDatabaseConnection();// 第一次链接能不能用 get - const perPage = 3; // 每页只有3个 + const perPage = 2; const [posts, count] = await connection.manager.findAndCount(Post, {skip: (page - 1) * perPage, take: perPage}); const ua = context.req.headers['user-agent']; @@ -50,7 +50,8 @@ export const getServerSideProps: GetServerSideProps = async (context) => { browser: ua, posts: JSON.parse(JSON.stringify(posts)), count: count, - perPage, page + perPage, page, + totalPage: Math.ceil(count / perPage) } }; }; \ No newline at end of file