vue3 多个tab自动切换时只有第一个tab的组件显示

首先有三个tab对应三个组件(BarChart)

const showTab1 = ref(true)
const showTab2 = ref(false)
const showTab3 = ref(false)
const data1 = ref({})
const tab1style = ref(active)
const tab2style = ref()
const tab3style = ref()
cnost tabnidex = ref()
<div class="tab" id="tab">
	<ul>
		<li><a :class="tab1style" @click.stop.prevent="tabClick(1)">xxx</a></li>
		<li><a :class="tab2style" @click.stop.prevent="tabClick(2)">yyy</a></li>
		<li><a :class="tab3style" @click.stop.prevent="tabClick(3)">zzz</a></li>
	</ul>
</div>
<div>
	<BarChart :id="chart1" :data="data1" v-show="showTab1"/>
	<BarChart :id="chart2" :data="data1" v-show="showTab2"/>
	<BarChart :id="chart3" :data="data1" v-show="showTab3"/>
</div>
  1. 对于只有一个组件显示的问题,v-show是使用display:block/none来实现显示和隐藏的,因此初始化onMounted的时候只有显示为true的第一个组件加载了数据,而第二个和第三个组件都未加载数据,所以当切换到第二个和第三个tab的时候,这两个组件都是只有dom没有数据的,因此不会显示。
    Fix: 初始先给showTab1, showTab2和showTab3赋值为true,待其加载完成之后再赋值为false。
    const showTab1 = ref(true)
    const showTab2 = ref(true)
    const showTab3 = ref(true)
    onMounted(() => {
    	 data1.value = {}
    	showTab2.value = false
    	showTab3.value = false
    })
    
  2. tab自动切换的实现
    首先实现一个tab点击方法:
    const tabClick = (index:any) => {
    	tabindex = index
    	if(index == 1){
    		tab1style.value = active
    		tab2style.value = ""
    		tab3style.value = ""
    		showTab1.value = true
    		showTab2.value = false
    		showTab3.value = false
    	}
    	else if(index == 2){
    		tab1style.value = ""
    		tab2style.value = active
    		tab3style.value = ""
    		showTab1.value = false
    		showTab2.value = true
    		showTab3.value = false
    	}
    	else if(index == 3){
    		tab1style.value = ""
    		tab2style.value = ""
    		tab3style.value = active
    		showTab1.value = false
    		showTab2.value = false
    		showTab3.value = true
    	}
    }
    
    然后在onMounted方法中加入定时调用函数,定时调用点击tab方法,即可实现tab自动切换的效果。
    const timer = ref()
    onMounted(() => {
    	tabindex.value = 1
    	timer.value = setInterval(() => {
    		tabClick(tabIndex.value%4)
    		tabindex.value++
    		if(tabindex.value == 4)  tabindex.value = 1
    	}, 3000)
    })
    onUnmounted(()=> {
    	clearInterval(timer.value)
    }
    
### 回答1: 这是一个使用 Vue.js 实现 tab 切换简单代码示例: ``` <template> <div> <ul class="tab-header"> <li v-for="(tab, index) in tabs" :key="index" :class="{ active: currentTab === index }" @click="currentTab = index"> {{ tab.title }} </li> </ul> <div class="tab-content"> <slot :tab="tabs[currentTab]"></slot> </div> </div> </template> <script> export default { data() { return { currentTab: 0, tabs: [ { title: 'Tab 1', content: 'Tab 1 content' }, { title: 'Tab 2', content: 'Tab 2 content' }, { title: 'Tab 3', content: 'Tab 3 content' }, ], }; }, }; </script> <style> .tab-header { display: flex; list-style: none; margin: 0; padding: 0; } .tab-header li { padding: 10px; cursor: pointer; } .tab-header li.active { background-color: #ddd; } </style> ``` 在父组件使用该组件: ``` <template> <tab-component> <template v-slot:default="{ tab }"> {{ tab.content }} </template> </tab-component> </template> <script> import TabComponent from './TabComponent.vue'; export default { components: { TabComponent, }, }; </script> ``` 该代码实现了一个通过单击标签切换内容的简单 tab 组件。 ### 回答2: 用Vue写一个tab切换可以使用Vue组件和指令来实现。 首先,需要创建一个父组件,里面包含多个组件和一个数据来记录当前选tab。可以使用v-for指令和数组来生成多个组件,并使用v-bind指令来绑定当前选tab。 ```html <template> <div> <div class="tabs"> <div v-for="(tab, index) in tabs" :key="index" @click="selectTab(index)" :class="{ active: activeTab === index }">{{ tab }}</div> </div> <div class="content"> <div v-for="(tab, index) in tabs" :key="index" v-show="activeTab === index">{{ tab }}</div> </div> </div> </template> <script> export default { data() { return { activeTab: 0, tabs: ['Tab 1', 'Tab 2', 'Tab 3'] }; }, methods: { selectTab(index) { this.activeTab = index; } } }; </script> ``` 父组件有一个`activeTab`数据用来记录当前选tab,一个`tabs`数组用来存储所有的tab名称。 `<div class="tabs">`使用`v-for`指令生成多个tab,同使用`v-bind`绑定点击事件和样式,并通过`activeTab`判断是否选当前tab。 `<div class="content">`也使用`v-for`指令生成多个tab内容,使用`v-show`指令根据`activeTab`来显示当前选tab内容。 最后,在父组件的`selectTab`方法,通过点击事件来改变`activeTab`的值,从而实现tab切换功能。 这样就实现了一个简单tab切换功能。 ### 回答3: Vue是一种流行的JavaScript框架,可以用来构建交互式的Web界面。如果要使用Vue来编写一个Tab切换,可以按照以下步骤进行: 1. 首先,在Vue项目安装并导入Vue库,可以使用命令"npm install vue"进行安装,并在JavaScript文件导入Vue。 2. 在HTML文件创建一个包含Tab切换的容器,可以使用div元素,并为其设置一个唯一的id属性。 3. 在JavaScript文件,创建一个Vue实例,并将其关联到容器。可以使用"new Vue()"语法来创建Vue实例,并使用el选项指定容器的id。 4. 在Vue实例的data选项,定义一个变量来跟踪当前活动的Tab索引。可以设置默认值为0,表示初始状态下第一个Tab处于活动状态。 5. 在模板,使用v-for指令遍历一个包含所有Tab标题的数组,并将每个标题显示为可点击的标签。可以在点击标签,调用一个方法来更新当前活动的Tab索引。 6. 在模板,使用v-show指令将只有当前活动Tab的内容显示出来,其他Tab的内容隐藏起来。可以使用当前活动的Tab索引来判断哪个Tab应该显示。 7. 最后,在CSS文件定义样式来控制Tab标题和内容的外观,可以根据需要进行调整。 通过以上步骤,就可以使用Vue完成一个简单Tab切换功能。可以随意添加更多的Tab,并根据实际需要进行样式和功能的定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W如Q扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值