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

Nuxt.js 3中ref使用问题:单选切换时params未更新

Vue3切换单选框后API请求参数未更新问题

通过单选按钮切换状态(Active、Draft、Trash)时,需要更新API请求的params参数以获取对应状态的数据。目前遇到的问题是:切换单选框后,params始终输出初始值:

api_key=**********&language=en-US&deletedStatus=false&byCity=&byCountry=&page=1&ActiveStatus=true&limit=20

但在Vue DevTools中,单个ref变量(如deletedStatus、ActiveStatus)已经正确更新。相关代码如下:

<template>
  <div
    v-for="(status, index) in StatusOptions"
    :key="index"
    class="field-radiobutton ttc-pr-2"
  >
    <RadioButton
      :id="status.value"
      name="status"
      :value="status.value"
      @change="ChangeState(status.value)"
    />
    <label>{{ status.name }}</label>
  </div>
</template>
            
<script setup>
import { ref, reactive } from "vue";
const { apiUrl } = useRuntimeConfig();
const router = useRouter();
const route = useRoute();

const deletedStatus = ref(false);
const byCity = ref("");
const byCountry = ref("");
const page = ref(1);
const ActiveStatus = ref(true);
const limit = ref(20);

const StatusOptions = ref([
  { name: "Active", value: "Active" },
  { name: "Draft", value: "Draft" },
  { name: "Trash", value: "Trash" },
]);

const ChangeState = (state) => {
  if (state == `Active`) {
    deletedStatus.value = false;
    ActiveStatus.value = true;
  }
  if (state == `Draft`) {
    ActiveStatus.value = false;
  }
  if (state == `Trash`) {
    ActiveStatus.value = false;
    deletedStatus.value = true;
  }
  console.log(params.value)
  FetchTours();
};

const params = ref(
  [
    "api_key=****************",
    "language=en-US",
    `deletedStatus=${deletedStatus.value}`,
    `byCity=${byCity.value}`,
    `byCountry=${byCountry.value}`,
    `page=${page.value}`,
    `ActiveStatus=${ActiveStatus.value}`,
    `limit=${limit.value}`,
  ].join("&")
);

const FetchTours = async () => {
  const { data } = await useFetch(`${apiUrl}/tours/gettours?${params.value}`, {
    key: "someKey",
    initialCache: false,
  });
  AllTours.value = data.value;
};
</script>

问题原因

params被初始化为一个固定字符串,仅在组件初始化时使用当时的ref值生成一次。后续ref变量更新时,params的字符串不会自动同步更新,因为它不具备响应式依赖追踪能力。

解决方案

方式一:使用computed响应式计算参数

将params改为计算属性,它会自动追踪依赖的ref变量,当变量变化时重新生成最新的参数字符串:

import { ref, computed } from "vue";

// ... 其他代码保持不变

const params = computed(() => [
  "api_key=****************",
  "language=en-US",
  `deletedStatus=${deletedStatus.value}`,
  `byCity=${byCity.value}`,
  `byCountry=${byCountry.value}`,
  `page=${page.value}`,
  `ActiveStatus=${ActiveStatus.value}`,
  `limit=${limit.value}`,
].join("&"));

方式二:状态切换时手动更新params

如果不想使用计算属性,可在ChangeState函数末尾手动重新生成params的值:

const ChangeState = (state) => {
  if (state == `Active`) {
    deletedStatus.value = false;
    ActiveStatus.value = true;
  }
  if (state == `Draft`) {
    ActiveStatus.value = false;
  }
  if (state == `Trash`) {
    ActiveStatus.value = false;
    deletedStatus.value = true;
  }
  // 手动更新params
  params.value = [
    "api_key=****************",
    "language=en-US",
    `deletedStatus=${deletedStatus.value}`,
    `byCity=${byCity.value}`,
    `byCountry=${byCountry.value}`,
    `page=${page.value}`,
    `ActiveStatus=${ActiveStatus.value}`,
    `limit=${limit.value}`,
  ].join("&");
  console.log(params.value)
  FetchTours();
};

推荐使用方式一,computed能自动处理响应式依赖,代码更简洁且不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:06:18