实现步骤:
- 实现静态UI效果 用传统的方式实现标签结构和样式
- 基于数据重构UI效果 将静态的结构和样式重构为基于Vue模板语法的形式 处理事件绑定和js控制逻辑
- 声明式编程 模板的结构和最终显示的效果基本一致
1.html结构
代码语言:javascript复制<div id="app">
<div class="tab">
<!-- tab栏 -->
<ul>
<li class="active">orange</li>
<li class="">lemon</li>
<li class="">apple</li>
</ul>
<!-- 对应显示的图片 -->
<div class="current"><img src="img/orange.png"></div>
<div class=""><img src="img/lemon.png"></div>
<div class=""><img src="img/apple.png"></div>
</div>
</div>
2、 提供的数据
代码语言:javascript复制list: [{
id: 1,
title: 'orange',
path: 'img/orange.png'
},
{
id: 2,
title: 'lemon',
path: 'img/lemon.png'
}, {
id: 3,
title: 'apple',
path: 'img/apple.png'
}
]
3、 把数据渲染到页面
- 把tab栏 中的数替换到页面上
- 把 data 中 title 利用 v-for 循环渲染到页面上
- 把 data 中 path利用 v-for 循环渲染到页面上
<div id="app">
<div class="tab">
<ul>
<!--
1、绑定key的作用 提高Vue的性能
2、 key 需要是唯一的标识 所以需要使用id, 也可以使用index ,
index 也是唯一的
3、 item 是 数组中对应的每一项
4、 index 是 每一项的 索引
-->
<li v-on:click='change(index)' :class='currentIndex==index?"active":""' :key='item.id'
v-for='(item,index) in list'>{{item.title}}
</li>
</ul>
<div :class='currentIndex==index?"current":""' :key='item.id' v-for='(item, index) in list'>
<img :src="item.path">
</div>
</div>
</div>
<script>
var vm = new Vue({
// 指定 操作元素 是 id 为app 的
el: '#app',
data: {
currentIndex: 0, // 选项卡当前的索引
list: [{
id: 1,
title: 'orange',
path: 'img/orange.png'
},
{
id: 2,
title: 'lemon',
path: 'img/lemon.png'
}, {
id: 3,
title: 'apple',
path: 'img/apple.png'
}
]
}
})
</script>
4.给每一个tab栏添加事件,并让选中的高亮
- 4.1 、让默认的第一项tab栏高亮
- tab栏高亮 通过添加类名active 来实现 (CSS active 的样式已经提前写好)
- 在data 中定义一个 默认的 索引 currentIndex 为 0
- 给第一个li 添加 active 的类名
- 通过动态绑定class 来实现 第一个li 的索引为 0 和 currentIndex 的值刚好相等
- currentIndex === index 如果相等 则添加类名 active 否则 添加 空类名
- tab栏高亮 通过添加类名active 来实现 (CSS active 的样式已经提前写好)
- 4.2 、让默认的第一项tab栏对应的div 显示
- 实现思路 和 第一个 tab 实现思路一样 只不过 这里控制第一个div 显示的类名是 current
<body>
<script src="vue.js"></script>
<div id="app">
<div class="tab">
<ul>
<!--
1、绑定key的作用 提高Vue的性能
2、 key 需要是唯一的标识 所以需要使用id, 也可以使用index ,
index 也是唯一的
3、 item 是 数组中对应的每一项
4、 index 是 每一项的 索引
-->
<li v-on:click='change(index)' :class='currentIndex==index?"active":""' :key='item.id'
v-for='(item,index) in list'>{{item.title}}
</li>
</ul>
<div :class='currentIndex==index?"current":""' :key='item.id' v-for='(item, index) in list'>
<img :src="item.path">
</div>
</div>
</div>
<script>
var vm = new Vue({
// 指定 操作元素 是 id 为app 的
el: '#app',
data: {
currentIndex: 0, // 选项卡当前的索引
list: [{
id: 1,
title: 'orange',
path: 'img/orange.png'
},
{
id: 2,
title: 'lemon',
path: 'img/lemon.png'
}, {
id: 3,
title: 'apple',
path: 'img/apple.png'
}
]
},
methods: {
change: function (index) {
// 在这里实现选项卡切换操作:本质就是操作类名
//如何操作类名?就是通过currentIndex
this.currentIndex = index;
}
}
})
</script>
</body>