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 相关文章推荐
Knockoutjs的环境搭建教程
Nov 26 Javascript
深入理解Javascript里的依赖注入
Mar 19 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
May 05 Javascript
node.js中的url.resolve方法使用说明
Dec 10 Javascript
jQuery实现自动切换播放的经典滑动门效果
Sep 12 Javascript
JS判断图片是否加载完成方法汇总(最新版)
May 13 Javascript
Angular2利用组件与指令实现图片轮播组件
Mar 27 Javascript
Vue如何引入远程JS文件
Apr 20 Javascript
js字符串与Unicode编码互相转换
May 17 Javascript
基于AngularJS的拖拽文件上传的实例代码
Jul 15 Javascript
JQuery获得内容和属性方法解析
May 30 jQuery
JavaScript实现手风琴效果
Feb 18 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实现Ftp用户的在线管理
2012/02/16 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
PHP代码优化技巧小结
2015/09/29 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
javascript中xml操作实现代码
2011/11/21 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python cookielib 登录人人网的实现代码
2012/12/19 Python
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
django批量导入xml数据
2016/10/16 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
TensorFlow实现模型评估
2018/09/07 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
python爬虫超时的处理的实例
2018/12/19 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
本科毕业生求职信
2014/06/15 职场文书
物流管理专业自荐信
2014/06/23 职场文书
爱心捐款感谢信
2015/01/20 职场文书
单位病假条范文
2015/08/17 职场文书