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

Nuxt中useFetch异常:未监听filterParams却触发请求

Nuxt useFetch 意外触发请求问题解决

问题出在你将filterParams这个ref对象直接传入了query参数中。Nuxt的useFetch会深度监听query对象内的所有响应式值,即便你没把它加入watch数组,只要filterParams内部属性发生变化,就会触发请求重新发送。

解决方案1:解构属性单独传递

把filterParams中的属性单独解构出来放到query里,只传递需要的字段,这样只有指定的依赖变化才会触发请求:

<script setup>
const page = ref(1);
const pageCount = ref(10);
const search = ref('');

const filterParams = ref({
  role_id: undefined,
});

await useFetch('events', {
  method: 'GET',
  query: {
    q: search,
    role_id: filterParams.value.role_id,
    page: page,
    limit: pageCount,
  },
  watch: [search, pageCount],
  onRequest: (config) => {
    console.log('request was sent');
  },
});
</script>

<template>
  <select v-model="filterParams.role_id">
    <option :value="1">1</option>
    <option :value="2">2</option>
  </select>
</template>

解决方案2:用函数形式指定监听依赖

如果你需要保留filterParams的结构,可以将watch设为函数,手动返回要监听的依赖值,避免自动深度监听整个对象:

<script setup>
const page = ref(1);
const pageCount = ref(10);
const search = ref('');

const filterParams = ref({
  role_id: undefined,
});

await useFetch('events', {
  method: 'GET',
  query: {
    q: search,
    filterParams,
    page: page,
    limit: pageCount,
  },
  watch: () => [search.value, pageCount.value],
  onRequest: (config) => {
    console.log('request was sent');
  },
});
</script>

<template>
  <select v-model="filterParams.role_id">
    <option :value="1">1</option>
    <option :value="2">2</option>
  </select>
</template>

当watch为函数时,它只会监听你明确返回的依赖值,修改filterParams.role_id就不会再触发请求了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:05:55