vue3中结合component :is使用tabs切换组件

<template>
    <div class="mine-ask">
        <van-tabs v-model:active="active">
            <van-tab
                :title="item.title"
                v-for="item in componentList"
                :key="item.comName"
            >
                <component :is="item.comName"></component>
            </van-tab>
        </van-tabs>
    </div>
</template>

<script>
import {
    shallowRef,
    defineComponent,
    getCurrentInstance,
    reactive,
    ref,
} from "vue";
import Child1 from "./components/Child1.vue";
import Child2 from "./components/Child2.vue";

export default defineComponent({
    name: "",
    // 注册你的组件
    components: {
        Child2,
        Child1,
    },
    props: {},
    emits: {},
    setup(props, { attrs, slots, emit, expose }) {
        const active = ref("");
        return {
            active,
            componentList: [
                {
                    title: "Child1",
                    comName: "Child1",
                },
                {
                    title: "Child2",
                    comName: "Child2",
                },
            ],
        };
    },

    methods: {},
});
</script>

使用router实现tabs切换

router.js
 {
    path: "/parent",
    name: "parent",
    component: () => import("@/views/parent/index.vue"),
    meta: {
      title: "父路由",
    },
    children: [
      {
        path: "child1",
        name: "child1",
        component: () =>
          import("@/views/parent/components/child1.vue"),
        meta: {
          title: "",
        },
      },
      {
        path: "child2",
        name: "child2",
        component: () => import("@/views/parent/components/child2.vue"),
        meta: {
          title: "",
        },
      },
    ],
  },
parent组件中
<template>
    <div class="mine-ask">
        <van-tabs v-model:active="active">
            <van-tab
                :title="item.title"
                v-for="item in componentList"
                :key="item.comName"
                :to="item.routeName"
            >
                <router-view></router-view>
            </van-tab>
        </van-tabs>
    </div>
</template>
import {
    shallowRef,
    defineComponent,
    getCurrentInstance,
    reactive,
    ref,
} from "vue";
import Child1 from "./components/Child1.vue";
import Child2 from "./components/Child2.vue";

export default defineComponent({
    name: "",
    // 注册你的组件
    components: {
        Child2,
        Child1,
    },
    props: {},
    emits: {},
    setup(props, { attrs, slots, emit, expose }) {
        const active = ref("");
        return {
            active,
            componentList: [
                {
                    title: "",
                    routeName: "/mineAsk/askListMine",
                    comName: "AskList",
                },
                {
                    title: "",
                    routeName: "/mineAsk/answernListMine",
                    comName: "AnswernList",
                },
            ],
        };
    },

    methods: {},
});
</script>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建一个Tabs组件,包含多个Tab组件和一个动态组件用于渲染当前选的Tab内容。 ```vue <template> <div class="tabs"> <div class="tab-header"> <div v-for="(tab, index) in tabs" :key="index" :class="{active: activeTab === index}" @click="activeTab = index" > {{tab.label}} </div> </div> <div class="tab-content"> <component :is="tabs[activeTab].component"></component> </div> </div> </template> <script> export default { data() { return { activeTab: 0, tabs: [ { label: 'Tab 1', component: 'Tab1' }, { label: 'Tab 2', component: 'Tab2' }, { label: 'Tab 3', component: 'Tab3' } ] } } } </script> ``` 2. 创建多个Tab组件,每个组件都需要提供一个唯一的名称(这里使用了动态组件的名称)。 ```vue <template> <div> <h2>Tab 1 Content</h2> </div> </template> <script> export default { name: 'Tab1' } </script> ``` ```vue <template> <div> <h2>Tab 2 Content</h2> </div> </template> <script> export default { name: 'Tab2' } </script> ``` ```vue <template> <div> <h2>Tab 3 Content</h2> </div> </template> <script> export default { name: 'Tab3' } </script> ``` 3. 在父组件引入所有的Tab组件,并为每个Tab组件设置一个名称。注意,这里只需引入组件,不需要在父组件显示它们。 ```vue <template> <div> <Tabs></Tabs> <keep-alive> <component :is="component"></component> </keep-alive> </div> </template> <script> import Tabs from './Tabs.vue' import Tab1 from './Tab1.vue' import Tab2 from './Tab2.vue' import Tab3 from './Tab3.vue' export default { components: { Tabs, Tab1, Tab2, Tab3 }, data() { return { component: 'Tab1' } } } </script> ``` 4. 将Tabs组件作为父组件的子组件,并在父组件动态设置当前选的Tab对应的组件名称。 ```vue <template> <div> <Tabs></Tabs> <keep-alive> <component :is="component"></component> </keep-alive> </div> </template> <script> import Tabs from './Tabs.vue' import Tab1 from './Tab1.vue' import Tab2 from './Tab2.vue' import Tab3 from './Tab3.vue' export default { components: { Tabs, Tab1, Tab2, Tab3 }, data() { return { component: 'Tab1' } } } </script> ``` 5. 完成!现在你可以通过点击Tabs组件的选项卡来切换显示不同的Tab内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值