Vue.js标签页组件使用方法详解


Posted in Javascript onOctober 19, 2019

本文实例为大家分享了Vue.js标签页组件使用的具体代码,供大家参考,具体内容如下

效果

Vue.js标签页组件使用方法详解

入口页 index.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>标签页组件</title>
 <link rel="stylesheet" type="text/css" href="style.css" >
</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>
 </tabs>
 </div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
 <script src="pane.js"></script>
 <script src="tabs.js"></script>
 <script type="text/javascript">
 var app = new Vue({
 el: '#app',
 data: {
 activeKey: '1'
 }
 });
 </script>
</body>
</html>

样式表 style.css

[v-clock]{
 display: none;
}
.tabs{
 font-size: 14px;
 color: #657180
}
.tabs-bar:after{
 content: '';
 display: block;
 width: 100%;
 height: 1px;
 background: #d7dde4;
 margin-top: -1px;
}
.tabs-tab{
 display: inline-block;
 padding: 4px 16px;
 margin-right: 6px;
 background: #fff;
 border: 1px solid #d7dde4;
 cursor: pointer;
 position: relative;
}
.tabs-tab-active{
 color: #ee99ff;
 border-top: 1px solid #3399ff;
 border-bottom: 1px solid #fff;
}
.tabs-tab-active:befor{
 content: '';
 display: block;
 height: 1px;
 background: #3399ff;
 position: absolute;
 top: 0;
 left: 0;
 right: 0;
}
.tabs-content{
 padding: 8px 0;
}

标签页外层的组件tabs tabs.js

Vue.component('tabs',{
 template: '\
 <div class="tabs">\
 <div class="tabs-bar">\
 <!--标签页标题,这里要用v-for-->\
 <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 {
 //用于渲染tabs的标题
 currentValue: this.value,
 navList: []
 }
 },
 methods: {
 tabCls(item){
 return [
 'tabs-tab',
 {
 'tabs-tab-active': item.name === this.currentValue
 }
 ]
 },
 getTabs(){
 //通过遍历子组件,得到所有的pane组件
 return this.$children.filter(function (item) {
 return item.$options.name === 'pane';
 });
 },
 updateNav(){
 this.navList = [];
 //设置对this的引用,在function回调里,this的指向的并不是Vue实例
 var _this = this;

 this.getTabs().forEach((pane, index) => {
 _this.navList.push({
 label: pane.label,
 name: pane.name || index
 });
 //如果没有给pane设置name,默认设置它的索引
 if(!pane.name)
 pane.name = index;
 //设置当前选中的tab的索引
 if(index === 0){
 if(!_this.currentValue){
 _this.currentValue = pane.name || index;
 }
 }
 });
 this.updateStatus();
 },
 updateStatus(){
 var tabs = this.getTabs();
 var _this = this;
 //显示当前选中的tab对应的pane组件,隐藏没有选中的
 tabs.forEach(tab => {
 return tab.show = tab.name === _this.currentValue;
 });
 },
 handleChange: function (index) {
 var nav = this.navList[index];
 var name = nav.name;
 this.currentValue = name;
 this.$emit('input', name);
 this.$emit('on-click', name);
 }
 },
 watch: {
 value: val => {
 this.currentValue = val;
 },
 currentValue: function () {
 this.updateStatus();
 }
 }
});

标签页嵌套的组件pane pane.js

Vue.component('pane',{
 name: 'pane',
 template: '\
 <div class="pane" v-show="show">\
 <slot></slot>\
 </div>',
 data: function () {
 return {
 show: true
 }
 },
 props: {
 name: String
 },
 label: {
 type: String,
 default: ''
 },
 methods: {
 updateNav: function () {
 this.$parent.updateNav();
 }
 },
 watch: {
 label: function () {
 this.updateNav();
 }
 },
 mounted: function () {
 this.updateNav();
 }
});

更多教程点击《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript oop开发滑动(slide)菜单控件
Aug 25 Javascript
jquery实现文字由下到上循环滚动的实例代码
Aug 09 Javascript
js验证上传图片的方法
May 12 Javascript
js采用concat和sort将N个数组拼接起来的方法
Jan 21 Javascript
AngularJS 指令的交互详解及实例代码
Sep 14 Javascript
javascript 中的事件委托详解
Oct 25 Javascript
基于angular实现模拟微信小程序swiper组件
Jun 11 Javascript
React Native之TextInput组件解析示例
Aug 22 Javascript
vue最简单的前后端交互示例详解
Oct 11 Javascript
为什么要使用Vuex的介绍
Jan 19 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
Nov 12 Javascript
关于element的表单组件整理笔记
Feb 05 Javascript
基于JavaScript获取base64图片大小
Oct 18 #Javascript
react MPA 多页配置详解
Oct 18 #Javascript
vue滚动插件better-scroll使用详解
Oct 18 #Javascript
VUE实现密码验证与提示功能
Oct 18 #Javascript
VUE实现图片验证码功能
Nov 18 #Javascript
countUp.js实现数字滚动效果
Oct 18 #Javascript
Vue-cli3项目引入Typescript的实现方法
Oct 18 #Javascript
You might like
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
javascript实现下雨效果
2017/03/27 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
python的else子句使用指南
2016/02/27 Python
Python使用sorted排序的方法小结
2017/07/28 Python
python实现zabbix发送短信脚本
2018/09/17 Python
Python版名片管理系统
2018/11/30 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
送给他或她的礼物:FUN.com
2018/08/17 全球购物
人力资源专员自我评价怎么写
2013/09/19 职场文书
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
汽车促销活动方案
2014/03/31 职场文书
婚内分居协议书范文
2014/11/26 职场文书
2015年大学生实习评语
2015/03/25 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL