谢谢你的帮助.

在一个名为"Students List"的组件中,我试图从API中获取数据,并将该数据实例化到学生类中的对象中,然后将这些对象插入到onBepremount函数中名为StudentList的学生数组中.

在onBepremount函数上一切正常,数据如预期的那样被提取并插入到数组StudentList中,然而,当我判断onmount函数中的数组数据时,它显示该数组为空,其中没有数据.

感谢您阅读我的帖子并帮助我走出困境.

以下是组件StudentList.Vue中的模板部分 显示的子组件根据StudentList的大小而变化,如果StudentList数组不为空,则应该显示子组件TableList.否则,应该显示NodataFound子组件.

<template>
  <section class="col-12" v-if="studentList.length !=0">
    <TableList :student-list="studentList" :page="pageNumber"/>
    <PaginationTable @pageNumberEmit="pageEmitReceived"/>
  </section>
  <section v-else>
    <NodataFound dede="test"/>
  </section>
</template>

以下是组件StudentList.vue的脚本部分

<script setup lang="ts">
import {inject, onBeforeMount, onMounted, ref} from "vue";
import TableList from "@/components/TableList.vue";
import {Student} from "@/types/Student";
import PaginationTable from "@/components/PaginationTable.vue";
import NodataFound from "@/components/NodataFound.vue";

const axios = inject('axios');
const pageNumber = ref(0);
const sizeNumber = ref(2);
const studentList: Array<Student> = new Array<Student>;


const props = defineProps({
  japanese: {type: String, required: true},
  english: {type: String, required: true},
  page: {type: Number, required: false},
})

function pageEmitReceived(page): void {
  pageNumber.value = page;
}

onMounted(() => {
  console.log(studentList.length);
})

onBeforeMount(async () => {
  try {
    const response = await axios.get('/' + props.english + '?page=' + pageNumber.value + '&size=' + sizeNumber.value);
    response.data.forEach(student => {
      let newStudent = new Student(student.uuid, student.name, student.email, student.dob);
      studentList.push(newStudent);
    })
  } catch (error) {
    console.log(error)
  }
  console.log(studentList.length)
})
</script>

当我使用VUE WebTool扩展判断数组值时,我可以清楚地看到数组不是空的.

sstudentList variable values in it inspection

推荐答案

正如 comments 所说,Onmount并不是在安装完成之前才运行. 这意味着您的FETCH是在已经调用onmount之后解析的.

Timeline:

-->;设置

-->;bepremount()调用-FETCH开始

-->;onmount()-以空数据运行

-->;bepremount()解析-数据从FETCH填充

要解决这个问题,您可以将FETCH放在脚本设置的顶层,尽管这需要较新的ES支持以及组件周围的悬念父级.

或者,您可以将FETCH放在onmount函数中.

另一个问题是,您的StudentList数组不是react 性的,这意味着当获取数据并将其推送到学生列表中时,显示将不会更新以反映这一点,并且NoDataFound将始终显示.将该行更改为:

const studentList = ref<Student[]>([])

在推送数据时使用studentList.value可以解决这个问题.

希望这个能帮上忙!

Vue.js相关问答推荐

在Nuxt项目中混合Scrolltrigger与Lenis

如何默认打开一个v-list-group?

更新 Shopware 管理 CMS 组件中的编辑器视图

Vue.js 3 没有组件的实例?

Vue3如何将自定义事件绑定到路由视图中的特定组件?

在 Vuex Store 模块中使用 Vue.js 插件

如何解决 Vue.js 中的相邻 JSX 元素必须包含在封闭标记中问题

如何在 vue.js 2 的其他组件中调用方法?

在基于 TypeScript 的 Vue 中将 vuex 状态和Mutations绑定到复选框组件属性

Vuejs在复选框 Select 上切换div可见性

Vue&TypeScript:在项目目录外的 TypeScript 组件中实现导入时如何避免错误 TS2345?

Keycloak:用户基于角色的客户端登录访问限制

重新加载发布到 Github 页面的 Vue 网站时出现 404

如何在 vue 3 中获取路由的参数?

动态更改我的 Vue.js SPA 主题的最佳方式?

我如何能够在 vue js html 中以给定格式进行多项 Select 和传递数据?

Vuejs - 使用 v-if 切换的保持活动组件

Axios 捕获错误请求失败,状态码 404

VS Code - 在 .vue 文件中启用 autoClosingTags 选项

Vue 3 – 渲染无法动画的非元素根 node