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

Vue 3模板仅偶尔显示数据求助:路由页面数据加载异常

问题分析与修复方案

两个关键错误导致数据不显示

1. 响应式丢失:直接替换ref对象

你在onMounted里直接执行post = json.data,这会把ref创建的响应式对象替换成普通JSON对象,断开了与模板的响应式绑定。模板无法感知到数据变化,自然不会更新显示。

修正方式:修改ref对象的.value属性,而不是替换整个变量:

post.value = json.data

2. 路由组件复用未触发重新请求

Vue Router会复用同一路由下的组件(比如从/blog/1跳转至/blog/2时,BlogPostDetailView组件不会重新创建),此时onMounted仅在首次加载时执行一次,后续路由参数变化不会触发新的请求。同时你直接赋值的id不是响应式变量,参数变化时也不会更新。

修正方式:监听路由参数变化,触发重新请求:

  • 封装请求逻辑为独立函数
  • 使用watch监听route.params.id的变化,调用请求函数

完整修正后的代码

<template>
    <div>
        Post id: {{ route.params.id }}
        {{ post }}
    </div>
</template>

<script setup>
import { ref, onMounted, watch } from 'vue';
import { useRoute } from 'vue-router'

const route = useRoute();
const post = ref({});

// 封装请求逻辑
const fetchPost = async (postId) => {
    const endpoint = "/file/" + postId;
    const response = await fetch(endpoint);
    const json = await response.json();
    post.value = json.data; // 保持响应式
};

// 首次加载时请求数据
onMounted(() => {
    fetchPost(route.params.id);
});

// 监听路由参数变化,重新请求数据
watch(() => route.params.id, (newId) => {
    fetchPost(newId);
}, { immediate: true });
</script>

额外说明

  • 刷新页面时,组件会重新挂载,onMounted会执行,但如果之前的post赋值错误(直接替换对象),即使请求到数据,模板也无法响应,所以必须通过.value修改。
  • 你之前的v-if="1"完全可以去掉,不影响逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:57:30