nuxt_site/components/Tab/index.vue
2024-05-02 21:28:18 +08:00

82 lines
2.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="Tab-main">
<div class="Tab-container">
<div class="Tab-box" @click="switchIdx($event)">
<template v-for="(item,idx) in props.tabList" >
<div class="Tab-items" >
<nuxt-link :data-idx = 'idx' :class="props.active.idx === idx ? '_Tab-item active':'_Tab-item'" :to="getHerf(item?.nuxtLink)" @click="changChildren(!!item.children,$event)">{{item.name}}</nuxt-link>
<div class="Tab-child-box dNone" v-if="item?.children">
<template v-for="(_item,_idx) in item.children">
<nuxt-link :to="getHerf(_item?.nuxtLink)" class="Tab-child-items" @click="switchCIdx(_idx,$evnet)">{{_item.name}}</nuxt-link>
</template>
</div>
</div>
</template>
</div>
</div>
</div>
</template>
<script setup>
/**
*
* @type {Readonly<ExtractPropTypes<{tabList: ArrayConstructor, active: ObjectConstructor}>>}
* @description 接收两个参数第一个是tabList第二个是active
* @example
* tabList[
* {
name: '招生新闻', //名字
target: news //组件 也可以是a标签路径,可选
},
//。。。
* ]
* activereactive({idx:0}) //必须用reactive包裹成一个对象里面必须包含idx属性
这个idx为默认先展示第几个
* @return 这个组件没有返回值如果你选中了一个选项它会更新这个active你可以用watch监听这个active
*/
const props = defineProps({
tabList:Array,
active:Object
})
let idx = 0
const switchIdx = function (e){
let tag = e.target,
cl = tag.classList
if(cl.value.indexOf('_Tab-item')!==-1){
tag.parentElement.parentElement.children[idx].children[0].classList.remove('active')
idx = Number(tag.dataset.idx)
tag.parentElement.parentElement.children[idx].children[0].classList.add('active')
props.active.idx = idx
props.active.name = tag.innerText;
if('target' in props.active){
props.active.target = props.tabList[idx].target
}
props.active.nuxtLink = props.tabList[idx].nuxtLink
}
}
const changChildren = function (has,e){
if(has){
let tag = e.target,
cl = tag.classList
if(cl.value.indexOf('_Tab-item')!==-1){
tag.nextElementSibling.classList.toggle('dNone')
}
}else {
[...document.getElementsByClassName('Tab-child-box')].map(item=>{
item.classList.add('dNone')
})
}
}
const switchCIdx = function (_idx,e){
props.active.cIdx = _idx
}
</script>
<style scoped src="~/assets/css/Tab/index.scss"></style>
<style scoped src="~/assets/css/Tab/media.scss"></style>