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

Vue可组合式函数useFetch调用后data始终为null问题求助

问题原因与解决方案

这是因为fetch是异步操作,当你调用useFetch后立刻打印data时,网络请求还没完成,data还保持着初始的null值。

解决办法:

1. 利用Vue响应式自动更新视图

Vue的响应式系统会在data值变化时自动更新视图,直接在模板里根据状态渲染即可:

<template>
  <div v-if="error">请求出错:{{ error.message }}</div>
  <div v-else-if="data">{{ JSON.stringify(data) }}</div>
  <div v-else>加载中...</div>
</template>

2. 在脚本中监听data变化

如果需要在代码逻辑里处理数据更新后的操作,用watch监听data的变化:

<script setup>
import { useFetch } from './fetch.js'
import { watch } from 'vue'

const { data, error } = useFetch('你的目标接口URL')

watch(data, (newData) => {
  if (newData) {
    console.log('数据加载完成:', newData)
  }
})
</script>

3. 让useFetch支持显式等待

修改可组合函数,添加加载状态和异步方法,方便在脚本中等待请求完成:

// fetch.js
import { ref } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)
  const isLoading = ref(true)

  const fetchData = async () => {
    try {
      const res = await fetch(url)
      data.value = await res.json()
    } catch (err) {
      error.value = err
    } finally {
      isLoading.value = false
    }
  }

  fetchData()

  return { data, error, isLoading, fetchData }
}

调用时可通过监听加载状态等待数据就绪:

<script setup>
import { useFetch } from './fetch.js'
import { watch } from 'vue'

const { data, error, isLoading } = useFetch('你的目标接口URL')

// 等待数据加载完成后再打印
const unwatch = watch(isLoading, (val) => {
  if (!val) {
    console.log('数据已加载:', data.value)
    unwatch()
  }
})
</script>

核心逻辑就是:异步操作不会立即返回结果,要借助Vue的响应式特性处理状态变化,或者显式等待异步任务完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:22:07