
本文详解如何在 Nuxt 3 项目中正确使用 Nuxt UI 的 组件,实现服务端分页联动:包括 v-model 双向绑定、@click 事件响应、动态数据获取及元信息(如 total、per_page)的合理传递。
本文详解如何在 nuxt 3 项目中正确使用 nuxt ui 的 `
在 Nuxt 3 中集成 Nuxt UI 的 <upagination></upagination> 组件时,常见误区是将分页视为纯前端逻辑——直接用 creators.length 计算总页数,或忽略分页参数对数据获取的实际影响。实际上,Nuxt UI 的分页器本身不自动触发数据请求,它仅提供 UI 交互与当前页码状态;真正的分页必须由开发者通过 v-model 响应页码变化,并主动重新拉取对应页的数据。
✅ 正确实现步骤
-
声明响应式页码:使用
ref()初始化page,并确保其值能被监听; -
按需获取分页数据:将
page作为参数传入数据获取组合式函数(如useCreators(page)),该函数应返回包含data和分页元信息(meta)的响应式对象; -
绑定分页器属性:
-
v-model="page"实现页码双向同步; -
:page-count="meta.per_page"指定每页条目数(非总页数!); -
:total="meta.total"提供总记录数,用于自动计算总页数;
-
-
监听页码变更:使用
@update:modelValue(推荐)或@click触发数据刷新(注意:@click在某些场景下可能触发过早,建议优先使用@update:modelValue)。
? 示例代码(推荐写法)
<template><div>
<ul class="p-5">
<li v-for="creator in creators.data" :key="creator.id" class="mb-5">
<nuxt-link :to="`/creator/${creator.slug}`"><div class="creatorCard" :style="{ background: `url(${creator.banner}) center center no-repeat`, backgroundSize: '100% auto' }">
<div class="glassEffect">
<div class="text pl-5 items-end h-1 pb-2">
<p class="font-bold">{{ creator.label }}</p>
<p class="italic">{{ creator.ig }}</p>
</div>
</div>
</div>
</nuxt-link>
</li>
</ul>
<!-- 分页器:绑定 meta.total 和 meta.per_page,监听更新 --><div class="pb-4 flex justify-center">
<upagination :ui="{ wrapper: 'justify-center' }" v-model="page" :page-count="creators.meta?.per_page || 10" :total="creators.meta?.total || 0"></upagination>
</div>
</div>
</template><script setup lang="ts">
import { ref, watch } from 'vue'
const page = ref(1)
const creators = useCreators(page)
// 显式封装获取逻辑,便于复用和调试
const fetchCreators = () => {
// 重新调用 useCreators 并传入最新 page 值
// 注意:useCreators 应支持响应式参数(如基于 $fetch 或 useAsyncData 实现)
creators.value = useCreators(page.value)
}
// 可选:监听 page 变化(等效于 @update:modelValue)
watch(page, fetchCreators)
</script>
⚠️ 关键注意事项
-
:page-count表示 每页显示数量(即limit或per_page),不是总页数 —— 总页数由:total / :page-count自动推导; -
useCreators()必须设计为可接收页码参数的组合式函数,内部应使用useAsyncData或useFetch并将page作为依赖项传入,确保响应式更新; - 避免在模板中直接写
useCreators(page.value)(如原问题中),这会导致 SSR 与客户端行为不一致,且无法响应式追踪; - 若后端返回的
meta结构不同(如pagination.total),请按实际结构调整解构路径,例如:creators.meta?.pagination?.total; - 建议为
:total和:page-count添加默认值(如|| 0/|| 10),防止初始加载时因undefined导致分页器异常。
通过以上方式,你就能实现语义清晰、服务端驱动、SEO 友好的 Nuxt UI 分页体验。










