You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Laravel Vue Pagination与Vue3实现分页时无法渲染链接

问题:Laravel Vue 分页组件无法渲染分页链接

尝试基于laravel-vue-pagination实现动态分页表格,后端通过->paginate()返回分页数据,参数接收正常,但分页链接始终无法渲染,控制台无任何警告或报错,尝试Bootstrap4/5版本的分页组件结果一致。

相关代码及数据

父组件代码

const links = ref({})

const resp = await axios.get(`/api/listingApi/getRegister/${param_search.value["parameter"]}/${param_search.value["value"]}`)
registers.value = resp.data.data
links.value = resp.data.links

<nAsignedCalls :valor="registers" :links="links"/>  

API返回数据

{
  "links": {
    "first": "http://www.crm.local:8081/api/listingApi/getRegister/cp/18519?page=1",
    "last": "http://www.crm.local:8081/api/listingApi/getRegister/cp/18519?page=6",
    "next": "http://www.crm.local:8081/api/listingApi/getRegister/cp/18519?page=2",
    "prev": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 6,
    "links": [
      {"url": null, "label": "&laquo; Previous", "active": false},
      {"url": "http://www.crm.local:8081/api/listingApi/getRegister/cp/18519?page=1", "label": "1", "active": true},
      {"url": "http://www.crm.local:8081/api/listingApi/getRegister/cp/18519?page=2", "label": "2", "active": false},
      {"url": "&raquo; Next", "label": "Next", "active": false}
    ],
    "path": "http://www.crm.local:8081/api/listingApi/getRegister/cp/18519",
    "per_page": 30,
    "to": 30,
    "total": 160
  },
  "data": [...]
}

Laravel API代码

return ListingResource::collection(Listing::where('cp', '=', $value)->paginate($pagination));

子组件代码

import { Bootstrap5Pagination } from 'laravel-vue-pagination';

export default {
  props: {
    links: {
      type: Object,
      required: true
    }
  },
  components: {
    Bootstrap5Pagination
  },
  methods: {
    getResults(page) {
      // 页码切换逻辑
    }
  }
}
<Bootstrap5Pagination
  :data="links"
  @pagination-change-page="getResults"
/>

解决方案

1. 修正传递给分页组件的数据结构

laravel-vue-pagination需要接收完整的分页响应对象(包含meta、data、links顶级字段),而非单独的resp.data.links。修改父组件代码:

const paginationData = ref({})

const resp = await axios.get(`/api/listingApi/getRegister/${param_search.value["parameter"]}/${param_search.value["value"]}`)
registers.value = resp.data.data
paginationData.value = resp.data // 保存完整分页响应

<nAsignedCalls :valor="registers" :pagination-data="paginationData"/>  

2. 调整子组件的Props与组件绑定

子组件改为接收完整分页数据,并绑定到分页组件的:data属性:

import { Bootstrap5Pagination } from 'laravel-vue-pagination';

export default {
  props: {
    paginationData: {
      type: Object,
      required: true
    }
  },
  components: {
    Bootstrap5Pagination
  },
  methods: {
    getResults(page) {
      // 此处实现页码切换后的API调用逻辑
    }
  }
}
<Bootstrap5Pagination
  :data="paginationData"
  @pagination-change-page="getResults"
/>

3. 核心原因说明

你之前传递的resp.data.links仅包含first/last/next/prev跳转链接,而组件需要读取meta.links中的页码按钮集合、meta.current_page当前页、meta.last_page总页数等元数据,才能正确渲染分页控件。传递完整的响应对象后,组件可以自动解析这些必要字段。

内容的提问来源于stack exchange,提问作者scorpions78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:16