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 cookie解码函数(兼容ff)
Mar 17 Javascript
JS+CSS简单树形菜单实现方法
Sep 12 Javascript
js实现n秒倒计时后才可以点击的效果
Dec 20 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
Jul 07 Javascript
BootStrap中Datepicker控件带中文的js文件
Aug 10 Javascript
node网页分段渲染详解
Sep 05 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
Nov 16 Javascript
Bootstrap Search Suggest使用例子
Dec 21 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
Sep 14 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 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 版本]
2007/03/20 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
容易被忽略的JS脚本特性
2011/09/13 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
js 操作符汇总
2014/11/08 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
javascript连续赋值问题
2015/07/08 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
python中sys模块是做什么用的
2020/08/16 Python
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
缓刑人员思想汇报500字
2014/09/12 职场文书
工程移交协议书
2016/03/24 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL