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

Vue3 Composition API赋值后ref变量在请求中为空的问题

问题原因

你定义的url是静态常量,在组件初始化阶段就完成了计算——此时fechaColaEmails.value还是空字符串。后续哪怕更新了fechaColaEmails的value,这个url变量的内容也不会自动刷新,所以请求URL里的参数始终是空的。

解决方案1:动态生成URL(推荐简单场景)

直接在请求函数内实时拼接最新的fechaColaEmails.value,确保每次请求都用最新参数:

<script setup lang="ts">
import { onMounted, ref, watch } from 'vue'
import { useRouter } from 'vue-router'
import axios from 'axios'
import CustomTable from './CustomTable.vue'

const router = useRouter()
let today: Date
let fechaColaEmails = ref('')
let emails = ref([{}])

async function pedirEmails() {
  try {
    // 每次请求时动态拼接URL
    const url = `${import.meta.env.VITE_APP_ROOT_API}${
      import.meta.env.VITE_BACKEND_DASHBOARD_DESA
    }/emails?fecha=${fechaColaEmails.value}`
    console.log('dentro del metodo pedir emails: ' + url)
    const { data } = await axios.get<any[]>(url)
    emails.value = data
  } catch (error) {
    console.log(error)
  }
}

async function submitFecha(fecha: any) {
  let fechT: string = fecha.target.value
  let arrayFecha = fechT.split('-')
  fechaColaEmails.value = arrayFecha[2] + '/' + arrayFecha[1] + '/' + arrayFecha[0]
  console.log('hola')
}

onMounted(async () => {
  today = new Date()
  let dd = String(today.getDate())
  let mm = String(today.getMonth() + 1) //January is 0!
  let yyyy = today.getFullYear()
  fechaColaEmails.value = dd + '/' + mm + '/' + yyyy
  console.log('onMounted: ', fechaColaEmails.value)
  await pedirEmails()
})

function ruta(event: number): void {
  router.push({ name: 'detallesemail', params: { contador: event } })
}
</script>

解决方案2:用computed创建响应式URL(适合多场景复用)

如果需要在多个地方使用这个URL,可以用computed创建响应式变量,它会自动跟随fechaColaEmails的变化更新:

<script setup lang="ts">
import { onMounted, ref, watch, computed } from 'vue' // 引入computed
import { useRouter } from 'vue-router'
import axios from 'axios'
import CustomTable from './CustomTable.vue'

const router = useRouter()
let today: Date
let fechaColaEmails = ref('')
let emails = ref([{}])

// 响应式URL,fechaColaEmails变化时自动更新
const url = computed(() => `${import.meta.env.VITE_APP_ROOT_API}${
  import.meta.env.VITE_BACKEND_DASHBOARD_DESA
}/emails?fecha=${fechaColaEmails.value}`)

async function pedirEmails() {
  try {
    console.log('dentro del metodo pedir emails: ' + url.value) // 注意取.value
    const { data } = await axios.get<any[]>(url.value)
    emails.value = data
  } catch (error) {
    console.log(error)
  }
}

// 其余代码同解决方案1...
</script>

额外说明

你之前在onMounted里打印的url也是初始化时的旧值,所以会和预期不一致。用上面任意一种方案,都能同时解决打印和请求参数的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:18:33