simple() 更适合精简分页,因其仅保留上一页、当前页范围、下一页和省略号,不查总页数、不生成首页/尾页链接,html 更轻量且无障碍友好;需配合 var_page 和 query 正确透传参数。

think\Paginator::simple() 为什么比 render() 更适合精简分页
默认 render() 输出的是完整分页结构(含首页、尾页、跳转链接等),但多数项目只需要「上一页 / 当前页范围 / 下一页」三段式,多余链接不仅增加 HTML 体积,还可能干扰无障碍阅读或响应式断点。而 simple() 不是简化样式,是直接删掉逻辑上非必需的链接节点——它只保留当前页、上一页、下一页和省略号,不查总页数,也不生成第 1 页和最后 1 页的 <a></a> 标签。
调用方式很简单:$users->simple()->render()。注意它返回的仍是 HTML 字符串,不是数组,所以模板里仍用 {$users->simple()->render()|raw} 输出。
常见误操作:
- 在控制器里先调
paginate()再对结果对象做toArray(),之后再调simple()—— 这时已无分页上下文,simple()会静默失效 - 以为
simple()会自动适配移动端隐藏某些按钮 —— 它只控制链接存在与否,样式仍需 CSS 配合 - 配合
query参数使用时漏传,导致上/下一页链接丢失搜索条件
用 render() 的 theme 参数手动控制链接显隐
如果连「上一页/下一页」都想按需开关(比如第一页时禁用上一页,最后一页时禁用下一页),simple() 就不够用了。这时得用 render() 的 theme 参数直接定义 HTML 模板字符串。
例如只显示当前页码和左右各 1 个邻页,且隐藏首页/尾页:
code
$users->render([
'theme' => '%FIRST%%UP_PAGE%%LINKS%%DOWN_PAGE%%LAST%',
'first' => '', // 空字符串即不渲染首页链接
'last' => '', // 同理
'prev_text' => ' '>',
]);
关键点:
-
%FIRST%和%LAST%占位符必须显式设为空,否则默认会输出「1」和「总页数」链接 -
prev_text/next_text设为空字符串会连整个上/下一页容器都消失,不是仅改文字 - 所有占位符大小写敏感,写成
%first%无效
去掉 ul 包裹、避免响应式错位
ThinkPHP 默认 render() 输出带 <ul class="pagination"></ul> 的结构,但很多前端框架(如 Tailwind、Bulma)要求分页容器是 <nav></nav> 或 <div>,且自带 <code>flex 布局。硬套 <ul></ul> 会导致样式冲突、移动端按钮堆叠。
解决办法不是改模板文件,而是用 theme 替换外层标签:
code
$users->render([
'theme' => '<nav aria-label="Pagination">%UP_PAGE%%LINKS%%DOWN_PAGE%</nav>',
]);
这样既保留语义化 <nav></nav>,又绕过默认 <ul></ul> 的 CSS 依赖。注意 aria-label 是可访问性刚需,别省略。
容易踩的坑:
- 在
theme字符串里漏写%UP_PAGE%或%DOWN_PAGE%,导致上/下一页按钮完全不出现 - 把
%LINKS%写成%links%,占位符不替换,原样输出到 HTML 里 - 在
theme中加了额外空格或换行,被当成文本节点渲染,破坏布局
自定义分页链接参数名(var_page)影响精简输出
如果你的 URL 用的是 ?p=2 而不是默认 ?page=2,但没配 var_page,那 simple() 和 render() 生成的所有链接都会继续用 page,点一次就丢参数,页面回到第 1 页。
正确做法是在 paginate() 调用时就透传:
code
User::where('status', 1)->paginate([
'list_rows' => 10,
'var_page' => 'p',
'query' => request()->only(['keyword', 'category']),
]);
重点:
-
var_page必须和实际 URL 参数名一致,大小写敏感 -
query要显式列出需要透传的键,不能只写request()->param()—— 否则会把page或p自己也塞进去,造成参数重复 - 一旦用了
var_page,控制器里就别再用input('page')取值,得用input('p')
精简分页真正难的不是删 HTML,是删完之后链接还能带对参数跳转。漏掉 var_page 或 query,前面所有精简都白做。











