axios 从onMounted()上的API获取的Vue数据未显示在DOM中,当我在VSCode中修改模板并保存时出现

qrjkbowd  于 2023-01-25  发布在  iOS
关注(0)|答案(3)|浏览(368)

首先,感谢那些谁将看这个。我是一个初学者与vue,所以我可能会错过一些明显的在这里,但经过几天的卡住,我在这里
在SFC上,我有一个onMounted从API(Spring Boot)获取数据。API调用工作正常,我可以在Chrome的Netwwork下看到它,响应包含我需要的数据。
我的AppLeague. vue文件

<template lang="">
    <div class="row">
        <div class="col-md-12">
            <h3>Leagues</h3>
        </div>
        <div class="col-md-12">
            <ul class="list-group">
                <li
                    v-for="(leagueItem, index) in leagues"
                    :key="index"
                    class="list-group-item"
                >
                    {{ index + 1 }}.{{ leagueItem.league_name }}
                    , Status:
                    {{ leagueItem.league_status }}, Code: {{ leagueItem.league_code }}
                </li>
            </ul>
        </div>
    </div>
</template>

<script setup lang="ts">
import { onMounted } from "vue";
import customAxios from "@/lib/customAxios";

interface League {
    league_id: number,
    league_name: string;
    league_code: string;
    league_status: string;
}

let leagues: League[];

onMounted(async () => {
    await customAxios
        .get<League[]>(`account/leagues`, {
            withCredentials: true,
    })
    .then((response) => {
        leagues = response.data;
    });
});
</script>

我的自定义axios文件

import axios from "axios";

export const customAxios = axios.create({
    baseURL: "http://localhost:8080/api/",
});

customAxios.interceptors.response.use(
    (response) => response,
    (error) => {
        if (error.response.status === 401) {
            window.location.href = '/';
        }
        if (error.response) {
            alert(error.response.data.message);
        }
    }
);

export default customAxios;

在Google Chrome浏览器的网络选项卡中,我可以看到HTTP 200代码和响应:[{"league_id":1,"league_status":"created","league_name":"Test League","league_code":"Test League Code"}]
但是,这里是呈现的页面:Rendered page
如果我返回VSCode并在中更改任何内容(例如添加一个空格并保存),则页面将刷新,值将按预期显示:Rendered image after altering DOM in VSCode
我想在页面加载时显示这些值,但似乎找不到方法。我猜它在第一次加载时不起作用,因为它显示的是let leagues: League[];的空值,并且DOM的更改强制在获取数据后获取这些值,但不确定如何强制DOM显示获取的值(如果有意义的话)。
我找不到vue3和的任何例子。
谢谢!

ubby3x7f

ubby3x7f1#

也许等待 leagues 值是一个好主意。也许你会得到一个错误,因为组件在加载一些尚未加载的 leagues 属性值时失败。当你保存在VSCode中时,组件已经被挂载,你的 leagues 数据已经被获取,所以在这种情况下你不会得到这个错误。我首先想到的是:
在组件内部创建一个新的v-if,如果axios响应返回一个非空列表,那么就绑定数据,例如第6行:

<template lang="">
    <div class="row">
        <div class="col-md-12">
            <h3>Leagues</h3>
        </div>
        <div v-if="leagues.length > 0"class="col-md-12">
            <ul class="list-group">
                <li
                    v-for="(leagueItem, index) in leagues"
                    :key="index"
                    class="list-group-item"
                >
                    {{ index + 1 }}.{{ leagueItem.league_name }}
                    , Status:
                    {{ leagueItem.league_status }}, Code: {{ leagueItem.league_code }}
                </li>
            </ul>
        </div>
    </div>
</template>
lyr7nygr

lyr7nygr2#

这看起来像是React性问题。
如果你还不知道,这里有一些资源可以解释React性:

我想改变联盟的宣言:

import {reactive} from 'vue'
...
const league = reactive<Leagues[]>([])
olmpazwi

olmpazwi3#

正如@dan-obregon在他的回答中所写的,你错过了Vue最基本的部分,它的React性。Dan的回答是不完整的,因为你不能将数组赋给React对象本身。在这种情况下,我将使用ref代替:

<script setup lang="ts">
import { Ref, ref, onMounted } from "vue";
import customAxios from "@/lib/customAxios";

interface League {
    league_id: number,
    league_name: string;
    league_code: string;
    league_status: string;
}

const leagues: Ref<Array<League>> = ref([]);

onMounted(async () => {
    await customAxios
        .get<League[]>(`account/leagues`, {
            withCredentials: true,
    })
    .then((response) => {
        leagues.value = response.data;
    });
});
</script>

相关问题