У меня есть компонент Vue, который принимает указатель функции для выполнения действия удаления.
<template>
<q-card class = "my-card" >
<q-img :src = "media.normal || media.original">
<div class = "absolute-bottom text-center">
{{ media.title || 'No Title'}}
</div>
</q-img>
<q-card-section>
<div class = "text-h6">{{ media.title}}</div>
</q-card-section>
<q-card-section class = "q-pt-none">
<q-btn @click = "actionDelete(media.uuid)">Delete</q-btn>
</q-card-section>
</q-card>
</template>
<script setup lang = "ts">
import { PropType, ref } from 'vue';
import { MediaItem } from 'src/data/mediaItem';
const props = defineProps({
media: {
type: Object as PropType<MediaItem>,
required: true
},
actionDelete: {
type: Function,
required: true
}
});
</script>
Согласно тому, что я нашел в документации и руководствах, я передаю функцию из родительского компонента дочернему компоненту:
<MediaItemComponent :media = "media" :actionDelete = "actionDelete(media.uuid)" />
Однако. VueJs (или TypeScript?) жалуется на это:
ERROR(vue-tsc) Type 'void' is not assignable to type 'Function'.
Что я делаю не так?
«Согласно тому, что я нашел в документации и руководствах» — вы их неверно истолковали, вы можете связать их, если вам интересно узнать разницу






Ошибка типа показывает ошибку в коде. :actionDelete = "actionDelete(media.uuid)" приводит к тому, что actionDelete prop является результатом вызова actionDelete, что в данном случае является undefined, тогда как ожидается, что prop будет функцией. actionDelete не следует вызывать с одним и тем же аргументом дважды.
В Vue редко требуется передавать обратный вызов через свойство, это обрабатывается с помощью событий Vue, которые легче отлаживать в инструментах разработчика.
Должно быть в родителе:
<MediaItemComponent :media = "media" @delete = "actionDelete" />
У ребенка:
<q-btn @click = "$emit('delete', media.uuid)">
Большое спасибо! Можете ли вы также помочь мне, как генерировать такие события вне события щелчка? Для этой цели я написал еще один вопрос здесь: stackoverflow.com/questions/78398303/…
Пожалуйста. С синтаксисом настройки сценария используется useEmit, как было предложено в ответе.
Я не использовал Vue.js, но похоже на эту проблему. Возможно
:actionDelete = "() => actionDelete(media.uuid)"(но вполне может быть более похожий на Vue.js способ сделать это).