开发者问题收集

Vue 3 等待对象被获取

2022-02-02
4048

我是 Vuejs 新手,请帮忙。我正在调用一个组件来创建一个“成员”。在调用此组件并传递成员数据时,该组件引发了与内部函数之一相关的错误。考虑到成员数据是通过 API 获取的,问题似乎是成员数据最初并未得到满足。我尝试将导致错误的函数转换为异步,但这似乎也不起作用。下面是一些针对我的问题的代码片段。

Home.vue

<Member :member="memb" />

data() {
  return {
    memb: {},
  };
},

//Method fetching the member from api
async fetchMember(memberId) {
      const res = await axios.get(`http://localhost:3000/members/${memberId}`, { apiHeaders });
      return res.data;
},

//Method which fetched the member
async created() {
    this.memb = await this.fetchMember(1);
},

Member.vue

<template>
  <div class="m-auto">
    <p>Name: {{ member.name }}</p>
    <p>Surname: {{ member.surname }}</p>
    <p>Date of Birth: {{ formatDob(member.dob) }}</p>
    <p>Age: {{ calculateAge(member.dob) }}</p>
    <p>Relationship: {{ member.relationship }}</p>
    <button class="bg-blue-500 py-1 px-4 rounded-md text-gray-100 text-sm mx-1 mt-3 font-bold" @click="$emit('get-member-id', member.id)">Update</button>
    <button class="bg-red-500 py-1 px-4 rounded-md text-gray-100 text-sm mx-1 mt-3 font-bold" @click="$emit('delete-member', member.id)">Delete</button>
  </div>
</template>

<script>
export default {
  name: 'Member',
  props: {
    member: Object,
  },
  methods: {
    // Converting the date of birth format
    formatDob(dob) {
      return dob.split('/').reverse().join('/');
    },
    // Calculating the date of birth by comparing today's date with the member's date of birth
    calculateAge(dob) {
      const birthdate = new Date(dob);
      const todayDate = new Date();
      const difference = todayDate - birthdate; // This is the difference in milliseconds
      return Math.floor(difference / 31557600000);
    },
  },
};
</script>

我遇到的问题与从 Member 组件调用 formatDOB 有关。实际上,问题是:未捕获(在承诺中)TypeError:无法读取未定义的属性(读取“split”)

提前致谢。

1个回答
  1. 如果我们可以实现一个进度指示器,用于通知用户数据加载活动,那就太酷了
  2. 一旦成员数据加载完毕,您就可以开始显示成员组件并隐藏进度指示器。
  3. 伪代码如下所示。
<Member v-if="isLoaded" :member="memb" />
<ProgressBar v-if="!isLoaded" />

<script>
export default {
 data: (() => {
  return {
   isLoaded: false,
   memb: null
  }
 })
 async mounted() {
  this.isLoaded = false;
  this.memb = await this.fetchMember(1);
  this.isLoaded = true;
 }
}
</script>

Allan Chua
2022-02-02