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

Nuxt3迁移问题:useFetch传数组参数后端仅获单个值

解决Nuxt3 useFetch数组参数无法被Laravel 10识别的问题

这个问题的核心是Nuxt3的useFetch(基于ofetch)默认的参数序列化规则和Axios不同:Axios会自动给数组参数添加[]后缀(比如brand[]=2&brand[]=3),而ofetch默认遵循URLSearchParams标准,只会生成brand=2&brand=3,而Laravel需要参数名带[]才能解析为数组。

下面提供三种可行的解决方案:

方案1:手动指定带[]的参数名

直接在params里把数组参数的键名改成xxx[],这样useFetch会自动生成符合Laravel要求的URL:

const { data, pending, error } = await useFetch(`/api/my/url/${route.params.slug}`, {
    params: { 
        page, 
        order, 
        'brand[]': brand, // 改为带[]的键名
        condition, 
        min, 
        max 
    },
    watch: [page, order, brand, condition, min, max],
    onResponse({ request, response, options }) {
        if (response.ok) {
            // ...
        }
    },
});

这种方法适合只有少数数组参数的场景,简单直接。

方案2:全局配置ofetch的参数序列化器

如果项目中有很多地方需要传递数组参数,可以在nuxt.config.ts里全局配置ofetch的序列化规则,让所有数组参数自动加上[]后缀:

export default defineNuxtConfig({
  // 其他配置...
  ofetch: {
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      Object.entries(params).forEach(([key, value]) => {
        // 数组类型参数添加[]后缀
        if (Array.isArray(value)) {
          value.forEach(item => {
            searchParams.append(`${key}[]`, item);
          });
        } else {
          searchParams.append(key, value);
        }
      });
      return searchParams.toString();
    }
  }
});

配置后,所有使用useFetch、$fetch的请求都会自动处理数组参数,无需逐个修改。

方案3:给单个useFetch请求配置序列化器

如果不想全局修改,也可以单独给当前的useFetch请求配置参数序列化逻辑:

const { data, pending, error } = await useFetch(`/api/my/url/${route.params.slug}`, {
    params: { page, order, brand, condition, min, max },
    // 自定义参数序列化规则
    paramsSerializer: (params) => {
      const searchParams = new URLSearchParams();
      Object.entries(params).forEach(([key, value]) => {
        if (Array.isArray(value)) {
          value.forEach(item => {
            searchParams.append(`${key}[]`, item);
          });
        } else {
          searchParams.append(key, value);
        }
      });
      return searchParams.toString();
    },
    watch: [page, order, brand, condition, min, max],
    onResponse({ request, response, options }) {
        if (response.ok) {
            // ...
        }
    },
});

验证效果

配置完成后,生成的URL会和之前Axios的格式一致:/api/my/url?page=1&order=latest&brand[]=2&brand[]=3,Laravel就能正确接收到数组形式的brand参数了。

内容的提问来源于stack exchange,提问作者Dávid Schnellbach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:16