vue
附件
0.附件压缩包
1.index.html
查看代码
<! DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>标签页组件</title>
<script src="./vue.js"></script>
<script src="./pane.js"></script>
<script src="./tabs.js"></script>
<style>
[v-cloak]{
display:none;
}
.tabs{
font-size:14px;
color:#434b59;
}
.tabs-bar:after{
content:"";
display:block;
width:100%;
height:lpx;
background-color:pink;
margin-top:-lpx;
}
.tabs-tab{
display:inline-block;
padding:4px 16px;
margin-right:6px;
border:lpx solid pink;
position:relative;
}
.tabs-tab-active{
color:#3399ff;
border-top:1px solid #3399ff;
border-bottom:lpx solid #ffffff;
}
.tabs-tab-active:before{
content:"";
display:block;
height:1px;
top:0;
left:0;
right:0;
}
.tabs-content{
padding:8px 0;
}
</style>
</head>
<body>
<div id="app"v-cloak>
<tabs v-model="activeKey">
<pane label="标签一"name="1">标签一的内容</pane>
<pane label="标签二"name="2">标签二的内容</pane>
<pane label="标签三"name="3">标签三的内容</pane>
<pane label="标签四"name="4">标签四的内容</pane>
</tabs>
</div>
<script>
var vm=new Vue({
el:"#app",
data:{
activeKey:'1',
}
})
</script>
</body>
</html>
》》tabs.js
查看代码
Vue.component('tabs',{
template:`
<div class="tabs">
<div class="tabs-bar">
<div :class="tabCls(item)" v-for="(item,index) in navList" @click="handleChange(index)">
{{item.label}}
</div>
</div>
<div class="tabs-content">
<! --这里的slot 用来嵌套pane-->
<slot></slot>
</div>
</div>`,
props:{
value:{
type:[String,Number]
}
},
data:function (){
return{
navList:[],
currentValue:this.value
}
},
methods:{
getTabs(){
return this.$children.filter((item) =>{
return item.$options.name==='pane'
})
},
updateNav() {
this.navList=[]
this.getTabs().forEach((pane,index)=>{
this.navList.push({
label:pane.label,
name:pane.name||index
})
if (!pane.name){
pane.name=index
}
if (index===0){
if(!this.currentValue){
this.currentValue=pane.name | lindex
}
}
})
this.updateStatus()
},
updateStatus(){
var tabs=this.getTabs()
tabs.forEach((tab) =>{
return tab.show=tab.name===this.currentValue
})
},
tabCls:function(item){
return ['tabs-tab',{'tabs-tab-active' :item.name===this.currentValue}]
},
handleChange:function(index){
var nav=this.navList[index]
this.currentValue=nav.name
this.$emit('input',nav.name)
this.$emit('on-click',nav.name)
}
},
watch:{
value:function (val){
this.currentValue=val
},
currentValue:function(){
this.updateStatus()
}
}
})
》pane.js
查看代码
Vue.component('pane',{
name:'pane',
template:'<div class="pane"v-show="show"><slot></slot></div>',
data:function (){
return{
show:true
}
},
props:{
name:{
type:String
},
label:{
type:String,
default:''
}
},
methods:{
updateNav(){
this.$parent.updateNav()
}
},
watch:{
label:function(){
this.updateNav()
}
},
mounted(){
this.updateNav()
}
})

浙公网安备 33010602011771号