Допустим, я хочу создать многослойный компонент для повторного использования, например 'Tab' Ui .
Чтобы разработчик мог написать:
<tabs>
<tab label="My First Tab">
Content for first tab which could contain components, html, etc.
</tab>
<tab label="My Second Tab">
More Content
</tab>
</tabs>
По сути, они будут использовать компоненты Tabs и Tab таким образом, что я понятия не имею, сколько компонентов Tab будет использовать dev во вкладках. Как получить доступ к компонентам вкладок, чтобы, например, отображать и скрывать их для каждого пользовательского интерфейса вкладки?
Я пытался использовать this.$children
и this.slots.default
, но на самом деле не смог получить доступ к данным вкладки, чтобы показать и скрыть их. Если честно, я пишу в Typescript, и проблема может быть более сложной из-за этого.
Что-то вроде:
<template>
<div class="tabs">
<slot /> <!-- Location of the Tab's -->
</div>
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
@Component({
...
})
export default class Tabs extends Vue {
public tabs: any[] = [];
public created() {
this.tabs = this.$slots.default;
// this.tabs is a set of VNode's,
// I can't figure out how to access the components
// I see a prop 'componentInstance' but when I try to
// access it, it says undefined
// this.select(0);
let tab = this.tabs.find((obj: any, index: number) => {
return index === 0;
}); // tab is undefined :(
}
public select(index: number) {
(this.$slots.default[index] as any).show = true;
// Accessing Vnode instead of Component :(
// this.$children[0]["show"] = true; // Read only :(
// this.tabs[index].show = true; // blerrggg :(
// Vue.nextTick();
}
}
</script>
Я посмотрел некоторые библиотеки GitHub для Tabs в Vue, и логика кажется очень сложной. Я предполагаю, что из наличия слотов / потомков существует более простой подход к доступу к дочерним компонентам. Может быть, это слишком обнадеживает с моей стороны.
Кто-нибудь знает, как получить доступ, передать или изменить данные в дочернем слоте, если вы не знаете, сколько там будет детей (то есть вы явно не записали их в родительский компонент)?