Насколько я понимаю Vue 2+, компонент должен перерисовываться при изменении содержимого слота. В моем случае у меня был компонент error-message
, который должен был скрываться до тех пор, пока у него не появилось содержимое слота для отображения. Сначала у меня был этот метод, прикрепленный к v-if
в корневом элементе моего компонента (свойство computed
не будет работать, Vue, похоже, не реагирует на this.$slots
).
checkForSlotContent() {
let checkForContent = (hasContent, node) => {
return hasContent || node.tag || (node.text && node.text.trim());
}
return this.$slots.default && this.$slots.default.reduce(checkForContent, false);
},
Это хорошо работает, когда в слоте происходит 99% изменений, включая любое добавление или удаление элементов DOM. Единственным пограничным случаем было такое использование:
<error-message> {{someErrorStringVariable}} </error-message>
Здесь обновляется только текстовый узел, и по непонятным мне причинам мой метод не срабатывает. Я исправил этот случай, подключившись к beforeUpdate()
и created()
, оставив мне это для полного решения:
<script>
export default {
data() {
return {
hasSlotContent: false,
}
},
methods: {
checkForSlotContent() {
let checkForContent = (hasContent, node) => {
return hasContent || node.tag || (node.text && node.text.trim());
}
return this.$slots.default && this.$slots.default.reduce(checkForContent, false);
},
},
beforeUpdate() {
this.hasSlotContent = this.checkForSlotContent();
},
created() {
this.hasSlotContent = this.checkForSlotContent();
}
};
</script>
person
Mathew Sonke
schedule
19.04.2019