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 相关文章推荐
jquery tools系列 expose 学习
Sep 06 Javascript
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
jquery 使用简明教程
Mar 05 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
Node.js开发者必须了解的4个JS要点
Feb 21 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
May 05 Javascript
JS中parseInt()和map()用法分析
Dec 16 Javascript
详谈js中数组(array)和对象(object)的区别
Feb 27 Javascript
vue开发调试神器vue-devtools使用详解
Jul 13 Javascript
详解vue中localStorage的使用方法
Nov 22 Javascript
Vue项目服务器部署之子目录部署方法
May 12 Javascript
Javascript中的奇葩知识,你知道吗?
Jan 25 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 date()日期时间函数详解
2010/05/16 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
jQuery Mobile 导航栏代码
2013/11/01 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
护理专业自荐信
2013/12/03 职场文书
办公室岗位职责
2014/02/12 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
金秋助学感谢信
2015/01/21 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
运动会通讯稿200字
2015/07/20 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python
TS 类型收窄教程示例详解
2022/09/23 Javascript