Связи между компонентом и слотом во Vue 3
В отношениях родитель-ребенок-слот содержимому слота ребенок может передавать пропсы, как указано во Vue.js
документации:
<!-- <MyComponent> template -->
<div>
<slot :text="msg"></slot>
</div>
<MyComponent v-slot="{ text }">
{{ text }}
</MyComponent>
Часто нужно и событие из слота переслать в ребенка. Напрямую сделать это нельзя, но можно также пропсом передать слоту ссылку на метод в ребенке, который тот и вызовет по событию:
<!-- FormField -->
<script setup>
const touched = ref(false);
</script>
<template>
<div class="form-field">
<slot :touch="() => { touched = true }" />
...
</div>
</template>
<!-- использование -->
<FormField v-slot="{ touch }">
<BaseInput @input="touch()" />
</FormField>
Этот хак бывает очень полезен и не выходит за рамки правила: "Пропсы вниз, события вверх".
Источник