javascript - Hur registrerar man komponent i vue+ts korrekt?


Jag har denna kod:
App.vue

<template>
  <v-container>
    <div>
      <schedule-table
      v-if = "schedule.length > 0"
      :exercises="schedule[0].exercises"
      />
    </div>
  </v-container>
</template>
<script lang="ts">

import Vue from "vue";
import { Component } from "vue-property-decorator";
import ScheduleTable from '@/components/ScheduleTable.vue'

@Component({
  components: {
    ScheduleTable,
  }
})
</script>

SchemaTabell.vue

<template>
  <v-container>
    <schedule-week
    :exercises="exercises"
    />
  </v-container>
</template>
<script lang="ts">
import Vue from "vue";
import { Component, Prop } from "vue-property-decorator";
import { IExercise } from "@/interfaces"
import ScheduleWeek from '@/components/ScheduleWeek.vue'

@Component({
  name: 'ScheduleWeek',
  components: {
    ScheduleWeek,
  }
})

@Component
export default class ScheduleTable extends Vue {
  @Prop( {required: true, type: Array } ) readonly exercises!: IExercise;
}
</script>

ScheduleWeek.vue

<template>
  <v-container
  :ex="exercises"
  >
    here is tables (but this tables dosn't show and any other text dosn't show)
  </v-container>
</template>
<script lang="ts">
import Vue from "vue";
import { Component, Prop } from "vue-property-decorator";
import { IExercise } from "@/interfaces"


@Component
export default class ScheduleWeek extends Vue {
  @Prop( {required: true, type: Array } ) readonly exercises!: IExercise;
}
</script>

Och låt Vue varna:

Okänt anpassat element: < schedule-week > - har du registrerat komponenten korrekt? För rekursiva komponenter, se till att ange alternativet "name".

Hur fixar man detta problem? Hur registrerar man komponenten korrekt?

Svar #1

Det finns flera sätt att deklarera en Vue-komponent när du använder TypeScript. Den klassbaserade SFC-metoden (den du använder) behöver följa en något annorlunda syntax. Du använde TypeScript-decorator två gånger i din schedule-week-komponent

App.vue

<v-container>
    <div>
      <schedule-table
      v-if = "schedule.length > 0"
      :exercises="schedule[0].exercises"
      />
    </div>
  </v-container>
</template>
<script lang="ts">

import { Component, Vue } from "vue-property-decorator"; // you can import vue here
import ScheduleTable from '@/components/ScheduleTable.vue'

@Component({
  components: {
    ScheduleTable,
  }
})
export default class App extends Vue {} // the @Component() decorator needs to be followed by the exported class

Motsvarande dina andra komponenter:

ScheduleTable.vue

<template>
  <v-container>
    <schedule-week
    :exercises="exercises"
    />
  </v-container>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator"; // see above
import { IExercise } from "@/interfaces"
import ScheduleWeek from '@/components/ScheduleWeek.vue'

@Component({
  name: 'ScheduleTable',
  components: {
    ScheduleWeek,
  }
}) // >>>don't use the decorator twice<<<
export default class ScheduleTable extends Vue {
  @Prop( {required: true, type: Array } ) readonly exercises!: IExercise;
}
</script>

ScheduleWeek.vue

<template>
  <v-container
  :ex="exercises"
  >
    here is tables (but this tables dosn't show and any other text dosn't show)
  </v-container>
</template>
<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator"; // see above
import { IExercise } from "@/interfaces"


@Component
export default class ScheduleWeek extends Vue {
  @Prop( {required: true, type: Array } ) readonly exercises!: IExercise;
}
</script>

##REDIGERA:

Från den officiella TypeScript-dokumentationen:

Med införandet av klasser i TypeScript och ES6 finns det nu vissa scenarier som kräver ytterligare funktioner för att stödja att annotera eller modifiera klasser och klassmedlemmar. Dekoratorer ger ett sätt att lägga till både annotationer och en metaprogrammeringssyntax för klassdeklarationer och medlemmar.

Dekoratörer är i princip TypeScript(JavaScript)-funktioner som används för att lägga till ytterligare information till följande klass (din komponent) eller klassmedlemmar. Detta betyder också att en dekoratör inte kan stå ensam. @Component()-dekoratören tar ett Objekt som parameter vilket översätts 'as-is' till komponentalternativ.

Relaterade artiklar