Все слоты имеют название.Если вы не дадите ему имя в явном виде, тогда оно будет называться default
.
Так что вы можете проверить на $slots.default
.
Слово предостережения.$slots
не реагирует, поэтому, когда он изменяется, он не делает недействительными никакие вычисленные свойства, которые его используют.Однако это вызовет повторную визуализацию компонента, поэтому, если вы используете его непосредственно в шаблоне или с помощью метода, он должен работать нормально.
Вот пример, иллюстрирующий, что кэширование вычисляемых свойств нестановится недействительным при изменении содержимого слота.
const child = {
template: `
<div>
<div>computedHasSlotContent: {{ computedHasSlotContent }}</div>
<div>methodHasSlotContent: {{ methodHasSlotContent() }}</div>
<slot></slot>
</div>
`,
computed: {
computedHasSlotContent () {
return !!this.$slots.default
}
},
methods: {
methodHasSlotContent () {
return !!this.$slots.default
}
}
}
new Vue({
components: {
child
},
el: '#app',
data () {
return {
show: true
}
}
})
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<div id="app">
<button @click="show = !show">Toggle</button>
<child>
<p v-if="show">Child text</p>
</child>
</div>