在 Vuetify 日历中使用嵌入式属性

Using embedded attributes in Vuetify Calendar

我正在尝试使用 Vuetify 中的 v-calendar 组件。

我在 documentation 中看到,如果我的事件没有相同的属性名称,我可以使用 event-start 道具。

问题是我的事件有嵌入式属性,我不知道 event-start 是否处理这种情况。

我的活动:

events: [
      {
        id: 'b9d93291-6d95-47b9-994a-ee9f266fb6b8',
        type: 'reservation_item',
        attributes: {
          start_date: '2020-09-23T00:00:00.000Z',
          end_date: '2020-09-25T00:00:00.000Z',
        },
      },
    ]

来自 vuetify 的事件示例:

events: [
      {
        name: 'Weekly Meeting',
        start: '2020-09-07 09:00',
        end: '2020-09-07 10:00',
      },
    ],

我尝试过类似的操作,但没有用。

<v-calendar
  ref="calendar"
  locale="fr-fr"
  :now="today"
  :value="today"
  :events="events"
  event-start="attributes.start"
  color="primary"
  type="month"
></v-calendar>

在探索源代码 for the vuetify plugin 之后,后者希望该值作为直接 属性 出现在事件 object 中。所以你不能访问其他嵌套的“children”,它必须是直接的属性.

有两种方法可以使这项工作有效:

1- 通过将 attributes 中的属性移动到 object 的根来映射事件数组,然后将此道具传递给 v-calendarevent-start="startDate"

2- 使用 fromJson 方法创建 javascript class (MyEvent),从 API 中获取原始 JSON(这样你将 JSON 封装到域 objects) 和 return MyEvent 实例数组中。这样你可以做例如: events[0].start 你甚至不必将它作为值传递给 event-start 道具,因为默认情况下它期望 start 属性作为默认值值。

此替代方案的另一个优点是,由于事件现在被封装到它自己的 javascript class 中,您可以添加辅助方法,或 getters/setter 或任何逻辑否则就在你的“视图”逻辑中,并有助于更好地分离关注点。

为了让它工作,我必须更改我的 events 数据

    <template>
      <v-calendar
        ref="calendar"
        locale="fr-fr"
        :events="myEvents"
        event-start="start"
        color="primary"
        type="month"
      ></v-calendar>
    </template>

  data: () => ({
    events: [
      {
        id: 'b9d93291-6d95-47b9-994a-ee9f266fb6b8',
        type: 'reservation_item',
        attributes: {
          start_date: '2020-09-23T00:00:00.000Z',
          end_date: '2020-09-25T00:00:00.000Z',
        },
      },
    ],
  }),
  computed: {
    myEvents() {
      const reservations = this.reservations
      reservations.forEach((element) => {
        element.start = element.attributes.start_date
        element.name = 'test'
        element.end = element.attributes.end_date
      })

      return reservations
    },
  }