vue3 tabs在父路由中显示隐藏

注意:

1.vue2获取实例的方法和vue3不一样

在vue2写法中

<router-view @get-tabs="getTabs" ref="chirdrentRef"/>

this.$refs.chirdrentRef.changTabs(v.name)

vue3写法

<router-view v-slot="{Component}">

                <component ref="chirdrentRef" :is="Component" @get-tabs="getTabs"></component>

 </router-view>

父路由

<template>
	<el-row>
		<div class="left">
			<div v-for="(v,index) in list" :key="index" class="menuItem" :class="{'active': index == active}" @click="clickMenu(v,index)">
				{{ index }}
			</div>
		</div>
		<div class="right">
			<span v-for="v in tabs" :key="v" @click="changTabs(v)">{{ v }}</span>--{{ activeTab }}
			<!-- <router-view @get-tabs="getTabs" ref="chirdrentRef"/> -->
			<router-view v-slot="{Component}">
				<component ref="chirdrentRef" :is="Component" @get-tabs="getTabs"></component>
			</router-view>
		</div>
	</el-row>
	
	
</template>
<script>
import { reactive, toRefs, defineComponent, onBeforeMount, watch, inject } from 'vue';
// import { asyncRoutes } from '@/router';
import { useUserStore } from '@/store';
import { useRouter } from 'vue-router';
import router from '../../router';
import { getStorage } from '@/utils/storageData';
export default defineComponent({
	components: {},
	setup() {
		const { errorImg, afterLogout, menus } = useUserStore();
		const router = useRouter();
		const state = reactive({
			chirdrentRef: null,
			tabs: [],
			list:[
				{
					path: '/test'
				},
				{
					path: '/test1'
				},
			]
		});
		watch(
			() => router,
			() => {
			},
			{ deep: true, immediate: true }
		);
		const getTabs = (v)=>{
			state.tabs = v;
			state.activeTab = v[0].name;
		}
		return {
			...toRefs(state),
			getTabs,
		};
	},
	methods: {
		clickMenu(v,index){
			this.tabs = null;
			this.active = index;
			router.push(v.path)
		},
		changTabs(v){
			this.activeTab = v.name;
			this.$refs.chirdrentRef.changTabs(v.name)
			// setTimeout(() => {
			// 	console.log(this.chirdrentRef.changTabs,'...')
			// }, 1000);
			
			// this.chirdrentRef.changTabs(v.name);
		}
	}
});
</script>
<style lang="scss" scoped>
.left{
	width: 200px;
}
.menuItem{
	width: 100%;
	height: 40px;
	line-height: 40px;
	background: pink;
	color: #fff;
	margin-bottom: 20px;
	&.active{
		color: red !important;
	}
}
</style>

子路由

<template>
    <div>test页面11</div>
  </template>
  <script>
  import { reactive, toRefs, defineComponent, onMounted, provide } from "vue";
  export default defineComponent({
    components: {},
      setup(props,{ emit }) {
        const state = reactive({
          form:{
            name:"",
          },
          queryData:{
            pageIndex: 1,
            pageSize: 10,
          },
          tableData:[],
          tabs:[
            {
              text: 'tab1',
              name: 'h',
            },
            {
              text: 'tab2',
              name: 'hh'
            },
          ]
        })
        onMounted(()=>{
          fetchData();
        })
        const fetchData = async ()=>{
          console.log("哈哈哈哈")
          emit("get-tabs",state.tabs)
        }
        const changTabs = (name)=>{
          console.log("我是tabs切换",name)
        }
        return {
            ...toRefs(state),
            fetchData,
            changTabs,
        };
      },
      methods:{}
  })
  </script>
  <style scoped>
  
  </style>
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 ,Ant Design VueTabs 组件的使用方法与 Vue 2 基本相同。具体实现步骤如下: 1. 在路由配置,添加 `meta` 字段用于标识当前路由是否需要在标签栏显示,例如: ```javascript const routes = [ { path: '/', name: 'Home', component: Home, meta: { title: '首页', keepAlive: true, // 是否缓存组件 showTab: true, // 是否在标签栏显示 }, }, // ... ]; ``` 2. 在 App.vue ,使用 Tabs 组件来渲染标签栏,并使用 `router-view` 组件来渲染当前路由对应的组件: ```vue <template> <div> <a-tabs v-model:selectedTabKey="selectedTabKey" type="editable-card" hide-add @edit="handleTabEdit" style="margin: 0 24px;"> <a-tab-pane v-for="(tab, index) in tabs" :key="tab.key" :tab="tab.title" :closable="index !== 0" @close="handleTabClose(index)"> </a-tab-pane> </a-tabs> <router-view /> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const selectedTabKey = ref('/'); const tabs = ref([ { key: '/', title: '首页', }, ]); const addTab = (key, title) => { const index = tabs.value.findIndex((tab) => tab.key === key); if (index === -1) { tabs.value.push({ key, title, }); } }; const removeTab = (key) => { const index = tabs.value.findIndex((tab) => tab.key === key); if (index !== -1) { tabs.value.splice(index, 1); } }; const handleTabClose = (index) => { const { key } = tabs.value[index]; removeTab(key); selectedTabKey.value = tabs.value[tabs.value.length - 1].key; }; const handleTabEdit = (targetKey, action) => { if (action === 'add') { selectedTabKey.value = targetKey; addTab(targetKey, ''); } else if (action === 'remove') { handleTabClose(tabs.value.findIndex((tab) => tab.key === targetKey)); } }; return { selectedTabKey, tabs, handleTabClose, handleTabEdit, }; }, }; </script> ``` 在这个示例,我们使用了 `selectedTabKey` 和 `tabs` 两个响应式变量来分别存储当前选的标签页和所有已打开的标签页。在 `addTab` 方法,我们使用 `tabs` 数组来存储已打开的标签页,防止重复添加。在 `removeTab` 方法,我们使用 `tabs` 数组来删除已关闭的标签页。在 `handleTabClose` 方法,我们使用 `tabs` 数组来关闭标签页,并将选的标签页设置为最后一个标签页。在 `handleTabEdit` 方法,我们通过判断用户的操作来决定是添加标签页还是关闭标签页。在 Vue 3 ,我们使用 `ref` 来创建响应式变量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值