vue实现nav tabs标签页切换

效果图,支持右键关闭其他关闭全部

废话不多说直接上代码

1.页面组件tagsView.vue、scrollPane.vue

<template>
    <div class="tags-view-container">
        <scroll-pane
            class="tags-view-wrapper"
            ref="scrollPane"
        >
            <router-link
                ref="tag"
                class="tags-view-item"
                :class="isActive(tag)?'tagActive':''"
                :to="tag"
                @contextmenu.prevent.native="openMenu(tag,$event)"
                v-for="tag in Array.from(visitedViews)"
                :key="tag.path"
            >
                {
  {tag.meta.title}}
                <span
                    class="el-icon-close"
                    @click.prevent.stop='closeSelectedTag(tag)'
                ></span>
            </router-link>
        </scroll-pane>
        <ul
            class='contextmenu'
            v-show="visible"
            :style="{left:left+'px',top:top+'px'}"
        >
            <li @click="closeSelectedTag(selectedTag)">关闭</li>
            <li @click="closeOthersTags">关闭其他</li>
            <li @click="closeAllTags">关闭所有</li>
        </ul>
    </div>
</template>

<script>
import ScrollPane from "@/components/ScrollPane";
export default {
    name: "tags-view",
    components: { ScrollPane },
    data() {
        return {
            visible: false,
            top: 0,
            left: 0,
            selectedTag: {}
        };
    },
    computed: {
        visitedViews() {
            console.log("tabView");
            console.log(this.$store.state.tagsView);
            console.log(this.$store.state);
            return this.$store.state.tagsView.visitedViews;
        }
    },
    watch: {
        $route() {
            this.addViewTags();
            this.moveToCurrentTag();
        },
        visible(value) {
            if (value) {
                document.body.addEventListener("click", this.closeMenu);
            } else {
                document.body.removeEventListener("click", this.closeMenu);
            }
        }
    },
    mounted() {
        this.addViewTags();
    },
    methods: {
        generateRoute() {
            if (this.$route.name) {
                return this.$route;
            }
            return fals
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Vue3中实现动态标签,可以通过以下步骤: 1. 创建一个 `tabs` 数组,用于存储标签的信息,例如标签的名称、组件等。 2. 在模板中使用 `v-for` 循环渲染 `tabs` 数组,生成标签。 3. 当用户点击标签时,根据标签的信息动态加载对应的组件,并将组件添加到标签中。 4. 如果需要关闭标签,可以从 `tabs` 数组中移除对应的标签。 下面是一个简单的示例代码: ```html <template> <div> <nav> <ul> <li v-for="(tab, index) in tabs" :key="index" @click="selectTab(index)"> {{ tab.title }} <span @click="closeTab(index)">x</span> </li> </ul> </nav> <component :is="currentTab.component"></component> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const tabs = ref([ { title: '首', component: 'Home' }, { title: '产品', component: 'Products' }, { title: '关于我们', component: 'About' }, ]); const currentTab = ref(tabs.value[0]); const selectTab = (index) => { currentTab.value = tabs.value[index]; }; const closeTab = (index) => { tabs.value.splice(index, 1); if (tabs.value.length > 0) { currentTab.value = tabs.value[0]; } }; return { tabs, currentTab, selectTab, closeTab, }; }, }; </script> ``` 在此示例中,我们使用了 `ref` 创建了 `tabs` 和 `currentTab` 变量,分别用于存储标签信息和当前选中的标签。在 `selectTab` 方法中,我们根据用户点击的标签索引,更新 `currentTab` 变量,从而动态加载对应的组件。在 `closeTab` 方法中,我们根据用户关闭的标签索引,从 `tabs` 数组中移除对应的标签,并更新 `currentTab` 变量,以确保当前选中的标签是有效的。 需要注意的是,我们在模板中使用了动态组件,通过 `:is` 属性将 `currentTab.component` 设置为组件的名称,从而动态加载对应的组件。在此示例中,我们假设组件的名称与路由路径相同,可以通过 `import` 引入对应的组件,例如: ```javascript import Home from './views/Home.vue'; import Products from './views/Products.vue'; import About from './views/About.vue'; ``` 希望这个简单的示例可以帮助你实现动态标签
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值