thinkphp paginate需自定义模板实现样式修改,通过复制默认模板并调用render('custom');需用appends保留非page参数,大数据量建议simple模式,深分页应改用游标分页,同时注意css/js选择器同步更新。

ThinkPHP 的 paginate 方法默认不支持自定义样式,必须手动替换 HTML 模板
ThinkPHP 自带的 paginate 返回的是一个 Paginator 实例,它内部渲染分页 HTML 时硬编码了结构(比如 <ul class="pagination"></ul>),不开放模板路径配置。直接调用 $list->render() 只能输出固定格式,想改按钮文字、加图标、换容器标签,光靠参数是做不到的。
实操建议:
- 复制框架源码里的默认模板(通常在
thinkphp/library/think/pagination/bootstrap.php或类似路径)到你的项目目录,例如resources/view/paginate/custom.php - 在分页调用时显式指定模板:
$list->render('custom'),注意这里传的是不含扩展名的模板名 - 模板里可用变量包括:
$paginator(实例)、$currentPage、$lastPage、$hasPrevious、$hasNext等,但别依赖$render—— 它已被弃用
用 appends 保留 URL 参数时,别漏掉 GET 查询字段
分页链接默认只保留当前 URL 路径,像 ?keyword=abc&status=1 这类参数不会自动带上,点下一页就丢了。常见错误是只写 $list->appends(request()->only(['keyword', 'status'])),但没检查这些键是否真的存在,导致空值被拼进 URL,如 ?keyword=&status=1。
实操建议:
- 用
request()->except(['page'])更稳妥,排除 page 同时保留所有其他有效参数 - 如果参数来自表单 POST,需先在控制器里手动合并:
$list->appends(array_merge($searchData, ['page' => $request->page])) - 注意中文参数:ThinkPHP 默认对
appends值做urlencode,但如果你自己拼 URL,得确保编码一致,否则出现乱码或 404
paginate 的 $listPerPage 参数不是万能的,大数据量下要配合 simple 模式
当数据总量几百万、又没加合适索引时,paginate(20) 会执行 COUNT(*) + LIMIT,COUNT 成为性能瓶颈。此时开 simple 模式(即 paginate(20, false))可跳过总数统计,只查当前页数据和是否有下一页,响应快得多,但无法显示“共 X 条”和末页按钮。
实操建议:
- 后台管理列表慎用
simple,用户需要知道总量;前台列表尤其搜索结果页,优先考虑simple - 若必须显示总数但又要提速,可改用估算值:
DB::table('xxx')->from(DB::raw("(SELECT CEIL(COUNT(*)/20) as pages FROM xxx) as t"))->value('pages'),再手动构造页码逻辑 -
paginate底层用的是offset+limit,深分页(如第 10000 页)依然慢,这时应改用游标分页(where id > ? limit 20),paginate不适用
自定义分页样式后,CSS 类名冲突或 JS 绑定失效很常见
你替换了模板,但前端 CSS 仍按旧类名写,比如模板里写了 <nav class="my-pagination"></nav>,而 CSS 里还写着 .pagination li a,自然不生效。更隐蔽的是,有些 JS 插件(如某些表格插件)会监听 .pagination a 的 click,你一换结构,事件就绑不上了。
实操建议:
- 模板中尽量复用主流 CSS 框架的类名,比如 Bootstrap 就用
pagination、page-link;Tailwind 就用flex space-x-1这类,别自己造一套 - 如果必须用新类名,同步更新 CSS 和 JS 中的选择器,别只改一处
- 检查浏览器控制台有没有报错:
Uncaught TypeError: Cannot read property 'addEventListener' of null,大概率是 JS 找不到元素,说明 DOM 结构变了
appends 和 simple 的组合使用场景,以及自定义模板后忘记同步前端资源。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











