这是我在Tabs组件中使用VUE 2的旧代码:

created() {
   this.tabs = this.$children;
}

标签:

<Tabs> 
  <Tab title="tab title">
    ....
  </Tab>
  <Tab title="tab title">
    ....
  </Tab> 
</Tabs>

VUE 3:

推荐答案

这是我的Vue 3组件.我曾经在child Tab组件中获取信息.

<template>
  <div class="tabs">
    <div class="tabs-header">
      <div
        v-for="(tab, index) in tabs"
        :key="index"
        @click="selectTab(index)"
        :class="{'tab-selected': index === selectedIndex}"
        class="tab"
      >
        {{ tab.props.title }}
      </div>
    </div>
    <slot></slot>
  </div>
</template>

<script lang="ts">
import {defineComponent, reactive, provide, onMounted, onBeforeMount, toRefs, VNode} from "vue";

interface TabProps {
  title: string;
}

export default defineComponent({
  name: "Tabs",
  setup(_, {slots}) {
    const state = reactive({
      selectedIndex: 0,
      tabs: [] as VNode<TabProps>[],
      count: 0
    });

    provide("TabsProvider", state);

    const selectTab = (i: number) => {
      state.selectedIndex = i;
    };

    onBeforeMount(() => {
      if (slots.default) {
        state.tabs = slots.default().filter((child) => child.type.name === "Tab");
      }
    });

    onMounted(() => {
      selectTab(0);
    });

    return {...toRefs(state), selectTab};
  }
});
</script>

选项卡组件:

export default defineComponent({
  name: "Tab",
  setup() {
    const index = ref(0);
    const isActive = ref(false);

    const tabs = inject("TabsProvider");

    watch(
      () => tabs.selectedIndex,
      () => {
        isActive.value = index.value === tabs.selectedIndex;
      }
    );

    onBeforeMount(() => {
      index.value = tabs.count;
      tabs.count++;
      isActive.value = index.value === tabs.selectedIndex;
    });
    return {index, isActive};
  }
});


<div class="tab" v-show="isActive">
    <slot></slot>
</div>

Vue.js相关问答推荐

虚拟DOM在Vue中姗姗来迟

正在try 访问vutify中v-select(ItemProps)的嵌套json值

传单 vue3 组件变体打开错误的标记 - 单击时弹出

如何在 Nuxt3 中使用 nuxtjs/auth-next 模块?

vue 计算的 ant watch 不会在嵌套属性更改时触发

禁用 vue-cli webpack 编码图像 base64

使用 Laravel 作为后端刷新 Vue.js SPA 的身份验证令牌

为什么在 Vue.js 中使用 `var` 关键字?

如何从特定索引呈现 v-for

如何将 axios/axios 拦截器全局附加到 Nuxt?

在没有组件的vue js中拖放

数据更新后触发 Vue.js 事件

如何在 vue 3 中获取路由的参数?

为 Vue 组件动态添加属性

嵌套组件

Vue cli 在 css 中构建生产更改不透明度

在vue中单击时如何模糊元素

使用 Vee-validate 禁用按钮,直到正确填写表单

如何修复套接字 io 中的 400 错误错误请求?

在另一个 props 的验证器中访问 props 值