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

Quasar服务端分页与筛选失效:参数无法传递至Laravel API

Quasar + Laravel API 服务端分页与筛选参数传递问题

我在Quasar应用中搭建基于Laravel API的服务端分页与筛选系统,目前遇到的问题是筛选条件、分页信息等参数无法传递至后端服务器。以下是相关代码:

Vue端请求代码

function onRequest (props) {
  const { page, rowsPerPage, sortBy, descending } = props.pagination
  const filter = props.filter
  console.log(rowsPerPage)

  loading.value = true

  // emulate server
  setTimeout(() => {
    const fetchCount = rowsPerPage === 0 ? pagination.value.rowsNumber : rowsPerPage

    // fetch data from "server"
    axios.get('https://api.bdshsystem.com/public/api/v1/branch-list',
    {query: {
      page: page,
      limit: fetchCount,
      keyword: filter,
    }}).then(response => {
      // clear out existing data and add new
      rows.value.splice(0, rows.value.length, ...response.data.data)

      // don't forget to update local pagination object
      pagination.value.page = response.data.meta.current_page
      pagination.value.rowsPerPage = response.data.meta.per_page
      pagination.value.rowsNumber = response.data.meta.total
    })
    loading.value = false
  }, 1500)
}

Laravel控制器代码

public function index(Request $request)
{
    $searchParams   = $request->all();
    $wardQuery    = Ward::query();
    $limit          = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
    $keyword        = Arr::get($searchParams, 'keyword', '');
    try{
        if (!empty($keyword)) {
            $wardQuery->where('name', 'LIKE', '%' . $keyword . '%');
            $wardQuery->orWhere('short_code', 'LIKE', '%' . $keyword . '%');
        }
        return WardResource::collection($wardQuery->paginate($limit));
   }catch (\Exception $ex) {
        $response = [
            'status' => 'Failed',
            'msg' =>  (env('APP_ENV') != 'production')?$ex->getMessage():'Server error' . ' , 
             Please try again.',
            'errdetailed' => (env('APP_ENV') != 'production')? $ex:'',
            'code' => 400
        ];
        return response()->json($response);
   }
}

问题排查与修复方案

1. 修正Axios请求参数格式

Axios的GET请求参数需要放在params字段中,而非你代码里的query字段,这是参数无法传递的核心原因。修改Vue端请求代码:

axios.get('https://api.bdshsystem.com/public/api/v1/branch-list',
{
  params: { // 替换query为params
    page: page,
    limit: fetchCount,
    keyword: filter,
  }
})

2. 修复异步逻辑错误

你当前把loading.value = false放在了setTimeout的同步代码块中,会导致加载状态提前结束,且请求失败时无法正确处理。调整为:

setTimeout(() => {
  const fetchCount = rowsPerPage === 0 ? pagination.value.rowsNumber : rowsPerPage

  axios.get('https://api.bdshsystem.com/public/api/v1/branch-list',
  {
    params: {
      page: page,
      limit: fetchCount,
      keyword: filter,
    }
  }).then(response => {
    rows.value.splice(0, rows.value.length, ...response.data.data)

    pagination.value.page = response.data.meta.current_page
    pagination.value.rowsPerPage = response.data.meta.per_page
    pagination.value.rowsNumber = response.data.meta.total
  }).catch(error => {
    console.error('请求失败:', error) // 可选:添加用户提示
  }).finally(() => {
    loading.value = false // 无论请求成败都关闭加载状态
  })
}, 1500)

3. 可选:兼容Laravel默认分页参数

Laravel默认分页参数为page和per_page,你当前用的limit虽然能通过控制器处理,但可以调整为默认参数以简化代码:

  • Vue端修改:
params: {
  page: page,
  per_page: fetchCount, // 替换limit为per_page
  keyword: filter,
}
  • Laravel控制器修改:
$limit = Arr::get($searchParams, 'per_page', static::ITEM_PER_PAGE);

4. 调试技巧

  • Vue端打印请求URL,确认参数拼接是否正确:
const url = new URL('https://api.bdshsystem.com/public/api/v1/branch-list')
url.searchParams.set('page', page)
url.searchParams.set('limit', fetchCount)
url.searchParams.set('keyword', filter)
console.log('请求URL:', url.toString())
  • Laravel端打印接收的参数,确认是否正常获取:
// 在index方法开头添加
Log::info('Received params:', $request->all());
// 或临时返回参数测试
// return response()->json($request->all());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:33:19