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 相关文章推荐
取得父标签
Nov 14 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
Oct 27 Javascript
Span元素的width属性无效果原因及解决方案
Jan 15 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
Mar 21 Javascript
JavaScript使用function定义对象并调用的方法
Mar 23 Javascript
AngularJS 中的事件详解
Jul 28 Javascript
bootstrap table小案例
Oct 21 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
Vue2递归组件实现树形菜单
Apr 10 Javascript
微信小程序--组件(swiper)详细介绍
Jun 13 Javascript
基于Require.js使用方法(总结)
Oct 26 Javascript
ant-design-vue 实现表格内部字段验证功能
Dec 16 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 strcmp使用说明
2010/04/22 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
python中去空格函数的用法
2014/08/21 Python
Python魔术方法详解
2015/02/14 Python
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Python类反射机制使用实例解析
2019/12/30 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
历史系毕业生自荐信
2013/10/28 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
机械专业技术员求职信
2014/06/14 职场文书
授权委托书格式范文
2014/08/02 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
领导欢迎词范文
2015/01/26 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
如何在Python中创建二叉树
2021/03/30 Python
为什么不建议在go项目中使用init()
2021/04/12 Golang