Неопределенная ошибка при переборе массива объектов

Я работаю над отображаемым списком дат для страницы расписания мероприятий, и у меня возникли проблемы с отображением списка extraRounds. Это в основном работает точно так же, как и верхний начальный экземпляр, но мне нужен цикл, чтобы пройти через массив объектов, которые потенциально могут быть добавлены.

У меня есть условное состояние, чтобы показать extraRounds, если они есть, чтобы дать каждому элементу заголовок с индексом показанного события, но когда дело доходит до подачи информации о каждом объекте в мои вычисляемые свойства Я получаю эту ошибку: Expected Object, got Date

Я думал, что атрибут Date сам по себе является объектом, но, похоже, это не так.

Как я могу правильно отображать интерполированные даты без этой ошибки? Где я ошибаюсь с этим циклом?

index.dateVotingOpenConverted и extraRound.dateVotingOpenConverted оба не работают.

Любые указатели/помощь будут очень признательны!

Ваше здоровье!

CodeSandbox: https://codesandbox.io/s/event-schedule-gukrb

Расписание событий

<template>
  <div class="event-schedule-info">
    <div class="_pill _color">Round 1</div>
    <div class="_row">
      <div class="_pill _clear">Applications</div>
      <div class="_date">
        {{ dateSubmissionOpenConverted }}〜{{ dateSubmissionCloseConverted }}
      </div>
    </div>
    <div class="_row">
      <div class="_pill _clear">Voting</div>
      <div class="_date">
        {{ dateVotingOpenConverted }}〜{{ dateVotingCloseConverted }}
      </div>
    </div>
    <div class="_row">
      <div class="_pill _clear">Results</div>
      <div class="_date">{{ dateResultAnnouncementConverted }}</div>
    </div>
    <br />
    <div v-if="extraRounds">
      <div
        v-for="(extraRound, index) in extraRounds"
        :key="'extraRound' + index"
        class="event-schedule-info"
      >
        <div class="_pill _color">Round {{ index + 2 }}</div>
        <div class="_row">
          <div class="_pill _clear">Applications</div>
          <div class="_date">
            {{ index.dateVotingOpenConverted }}〜{{
              index.dateVotingCloseConverted
            }}
          </div>
        </div>
        <div class="_row">
          <div class="_pill _clear">Results</div>
          <div class="_date">{{ index.dateResultAnnouncementConverted }}</div>
        </div>
      </div>
    </div>
  </div>
</template>

<style lang="sass" scoped>
.event-schedule-info > *
  margin-bottom: 10px

._pill
  height: 21px
  width: 83px
  left: 207px
  top: 814px
  font-size: 14px
  font-style: normal
  font-weight: 400
  line-height: 21px
  letter-spacing: 0em
  text-align: center
  border-radius: 20px

._color
  color: white
  background-color: indianred

._clear
  color: indianred
  background-color: white
  border: solid 1px indianred

._row
  display: flex
  justify-content: flex-start
  align-items: center

._date
  font-family: Hiragino Maru Gothic Pro
  font-size: 18px
  font-style: normal
  font-weight: 400
  line-height: 27px
  letter-spacing: 0em
  text-align: left
  padding: 0 5px

._vote
  padding-right: 5px
  text-decoration: underline
  font-family: Hiragino Maru Gothic Pro
  font-style: normal
  font-weight: normal
  font-size: 13px
  line-height: 19px
  color: indianred
</style>

<script>
export default {
  name: "EventScheduleInfo",
  props: {
    /**
     * @type {Date}
     */
    dateSubmissionOpen: { type: Object },
    /**
     * @type {Date}
     */
    dateSubmissionClose: { type: Object },
    /**
     * @type {Date}
     */
    dateVotingOpen: { type: Object },
    /**
     * @type {Date}
     */
    dateVotingClose: { type: Object },
    /**
     * @type {Date}
     */
    dateResultAnnouncement: { type: Object },
    /**
     * @type {[{ dateVotingOpen: {Date}, dateVotingClose: {Date}, dateResultAnnouncement: {Date} }]}
     */
    extraRounds: { type: Array },
  },
  data() {
    return {};
  },
  methods: {
    monthDayConverted(d) {
      return d.toLocaleString("ja", { month: "long", day: "numeric" });
    },
    monthDayTimeConverted(d) {
      return d.toLocaleString("ja", {
        month: "long",
        day: "numeric",
        hour: "2-digit",
        minute: "2-digit",
      });
    },
  },
  computed: {
    dateSubmissionOpenConverted() {
      return this.monthDayConverted(this.dateSubmissionOpen);
    },
    dateSubmissionCloseConverted() {
      return this.monthDayConverted(this.dateSubmissionClose);
    },
    dateVotingOpenConverted() {
      return this.monthDayConverted(this.dateVotingOpen);
    },
    dateVotingCloseConverted() {
      return this.monthDayConverted(this.dateVotingClose);
    },
    dateResultAnnouncementConverted() {
      return this.monthDayTimeConverted(this.dateResultAnnouncement);
    },
  },
};
</script>

Привет, мир

<template>
  <div class="hello">
    <EventSchedule
      :dateSubmissionOpen="new Date('2020/06/01')"
      :dateSubmissionClose="new Date('2020/06/30')"
      :dateVotingOpen="new Date('2020/06/30')"
      :dateVotingClose="new Date('2020/07/10')"
      :dateResultAnnouncement="new Date('2020/07/14 12:00:00')"
      :extraRounds="[
        {
          dateVotingOpen: new Date('2020/07/16'),
          dateVotingClose: new Date('2020/07/26'),
          dateResultAnnouncement: new Date('2020/07/31 12:00:00'),
        },
        {
          dateVotingOpen: new Date('2020/08/20'),
          dateVotingClose: new Date('2020/08/26'),
          dateResultAnnouncement: new Date('2020/08/31 12:00:00'),
        },
        {
          dateVotingOpen: new Date('2020/09/16'),
          dateVotingClose: new Date('2020/09/26'),
          dateResultAnnouncement: new Date('2020/09/31 12:00:00'),
        },
      ]"
    />
  </div>
</template>

<script>
import EventSchedule from "./EventSchedule";
export default {
  name: "HelloWorld",
  components: { EventSchedule },
  props: {},
};
</script>

person LovelyAndy    schedule 22.06.2021    source источник


Ответы (1)


просто вместо type: Object используйте type: Date в разделе prop вашего компонента. так, например, реквизит dateSubmissionOpen должен выглядеть так: dateSubmissionOpen: { type: Date }. он работал в коде, который вы предоставили.

person Noy Gafni    schedule 22.06.2021
comment
Спасибо за ответ! Где именно я это помещаю? - person LovelyAndy; 22.06.2021
comment
в типах реквизита я обновил свой ответ, чтобы он был понятнее - person Noy Gafni; 22.06.2021
comment
Интересный. Ошибка исчезает для меня, но даты по-прежнему не отображаются для меня. Я даже изменил его в codepen, и он вообще не меняется. И в реальном проекте я теперь получаю эту ошибку: TypeError: Cannot read property toLocaleString of undefined - person LovelyAndy; 22.06.2021
comment
Я вижу, у вас есть еще одна проблема с кодом, в otherRounds вы используете index.dateVotingOpenConverted, что я считаю неправильным. - person Noy Gafni; 22.06.2021
comment
Ах, да. Я пытался с index.dateVotingOpenConverted в интерполяции в Codesandbox, но я также пробовал extraRound.dateVotingOpenConverted и все равно получаю ту же ошибку typeError. - person LovelyAndy; 22.06.2021
comment
Поскольку у вас нет extraRound.dateVotingOpenConverted, у вас есть extraRound.dateVotingOpen, вам нужно использовать метод или создать вычисляемое свойство, которое возвращает функцию, чтобы она могла получать параметры. (вы также можете использовать фильтры vue, но они устарели в vue3) см. этот ответ stackoverflow.com/a/40539522/11545271 - person Noy Gafni; 22.06.2021
comment
Я думаю, что у меня это получилось! В итоге я просто поместил метод в интерполяцию, например `monthDayConverted(extraRounds[index].dateVotingOpen)`, и теперь все они отображаются так, как я хочу! Я по-прежнему получаю ошибку TypeError: Cannot read property 'toLocaleString' of undefined и понятия не имею, откуда она взялась, поскольку кажется, что все работает. Спасибо за всю помощь до сих пор! - person LovelyAndy; 22.06.2021