上一篇写了一下table,然后要写什么呢?当然是tab了。动态创建一个tab,里面放一个table,这样一个后台管理的基本功能(之一)就出来了。

  好吧,这里其实只是试试水,感受一下vue的数据驱动可以怎么玩,通过一个个实例学习一下vue的各个知识点。这里要看看方法和css如何设置。

一、目标

1、  可以动态创建tab。

2、  可以切换(废话)、可以关闭tab。

3、  Css的设置。

4、  方法的处理方式。

5、  效果图

二、思路

  应该有好多种方式可以实现,这里先试一个,其他的以后再说。

  还是数据驱动,那么就建立一个大的数据包,把tab信息和table信息都放进去,然后绑定就好了。似乎不是太难的样子。Emmmmmm大概是吧。

  Tab切换,暂时使用css的方式来控制。

  关闭tab,就是干掉对应的数据。

三、设计与编码

1.    数据包

var tab = new Vue({
el: '#tab',
data: {
tabNumber: 1, //标签数量,这个是临时的,便于自动重新绑定
currentTabId: 1, //当前激活的tab的id
beforeTabId: 1, //上一个被激活的tab的id
tabs: {
tab1: { //可以有多个标签,这里先默认一个tab
id: "1", //标签识别标示
title: "我的桌面",
isShow:true, //是否显示
message: '桌面',
orderBy: [], //可以控制字段的先后顺序,想调整列的先后顺序,改这个数组就行,可以做个性化设置
tableTh: {}, //表头的描述信息
dataList: [] //数据包,字段名作为关键字,便于列的调整先后顺序
}
}
},
methods: {
tabClick: function (id) {
//切换tab
//alert("切换tab" + id);
//隐藏当前的tab
var oldId = tab.currentTabId; //记录切换前tab的id
tab.beforeTabId = oldId;
tab.tabs["tab" + oldId].isShow = false; //隐藏切换前的tab tab.currentTabId = id; //记录切换后的id
tab.tabs["tab" + id].isShow = true; //显示切换后的tab },
closeTab: function (id) {
if (id === "1") {
alert("这是桌面,建议不要关闭哦:)");
return;
} delete tab.tabs["tab" + id]; //这种方式不会被vue监控到,所以不会触发视图的刷新
tab.tabNumber = tab.tabNumber - 1; //这样子凑合一下。触发视图的刷新 //设置“激活”状态
var oldId = tab.beforeTabId; //上一个激活tab
var nowId = tab.currentTabId; //现在激活tab if (nowId === id) {
//关掉的是激活tab,需要设置上一个tab为激活状态
tab.currentTabId = oldId;
tab.tabs["tab" + oldId].isShow = true; //这么写好像可以触发视图的刷新
tab.beforeTabId = 1;
}
else if (oldId === id) {
//关闭的是上一个激活tab,修改前一个tab的id
tab.beforeTabId = 1; }else {
//需要强制修改一下,否则不会刷新,emmm,好吧还是没自动刷新
tab.currentTabId = nowId;
}
}
}
});

  methods 这个也是一个保留字(关键字),就是放方法的。里面可以有多个方法,方法名称和标签里的v-on:XXXX=’00000’ 对应。

  这里写了两个方法,一个是切换tab的,一个是关闭tab的。

  切换tab:按照数据驱动视图的思路,在方法里面改变数据的isShow 属性值,然后通过模板的设置来实现切换效果。

  关闭tab:干掉对应的数据即可,只是实现的时候遇到点小问题,delele的方式不能被监控,到时视图不能及时更新,所以加了一个tab数量的属性,关掉一个tab,数量-1,这样数据变化就可以被监控到了,然后一起重新绑定。

2.    模板

<div id="tab">
<!--tab标签-->
<ul id="ulTab" class="tabs left">
<li v-for="t in tabs" v-bind:class="{'selectTag':t.isShow}">
<a v-on:click="tabClick(t.id)" href="javascript:void(0)"> {{t.title}}&nbsp;
<em class="arrup" v-on:click.stop="closeTab(t.id)">x</em>
</a>
</li>
</ul> <div v-for="t in tabs" v-show="t.isShow">
{{ t.message }}{{tabNumber}}
<table class="table_default1" style="" v-show="t.message!=='桌面'">
<tr>
<th>序号</th>
<th v-for="key in t.orderBy">
{{t.tableTh[key].title}}
</th>
</tr>
<tr v-for="(tr,i) in t.dataList">
<td>{{i+1}}</td>
<td v-for="index in t.orderBy" v-bind:align="t.tableTh[index].align">
{{tr[index]}}
</td> </tr>
</table>
</div>
</div>

切换tab

  用v-show的方法来控制div是否显示。

  v-show是通过修改style的属性来实现的。

  用v-bind:class="{'selectTag':t.isShow}" 的方式来实现tab的激活效果。

  v-bind:class 可以绑定css名称。因为css名称总是要被换来换去的,所以vue就很贴心的提供了这种if true 才设置的方式,冒号后面为真,才会设置设个css名称,这样数据驱动的时候就方便多了。

四、运行效果

  调试了半天,好吧上年纪了,思维不够敏捷,这么点逻辑问题就卡住了,哎。

  不过最后还是调试成功了。

五、总结

  这个有一个明显的问题,这个数据包是不是有点大,创建的tab越多,数据包就越大,有没有性能问题?会不会卡?

  另外这还只是table,如果增加了按钮、查询条件、分页控件,这个数据包的结构要变成多复杂呀?挖坑也不带这么挖的呀。

  那么怎么办呢?下次再说。(好吧,现在还没想好,似乎要写组件,或者要用到插槽)

下集预告:会做一个tree,增加访问后端获得数据,然后绑定数的方法。

从后端到前端之Vue(二)写个tab试试水的更多相关文章

  1. 从后端到前端之Vue(一)写个表格试试水

    目录: 1.脚本式开发. 2.工程化开发 3.工程化和脚本的区别 4.来个table试试水 4,1.目标 4.2.思路 4.3.设计与编码 4.4.效果 5.业务分离 6.功能拓展——个性化设置    ...

  2. 从后端到前端之Vue(三)小结以及一颗真实的大树

    上一篇写了一下tab,下面整理一下用过的知识点,本想按照官网的文档,整理一下可以更清晰,结果也许是我的方法不对吧,总之更模糊了. 按照官网文档的顺序整理到了表单输入绑定之前,因为之前大致也就只涉及到这 ...

  3. 从后端到前端之Vue(四)小试牛刀——真实项目的应用(树、tab、数据列表和分页)

    学以致用嘛,学了这么多,在真实项目里面怎么应用呢?带着问题去学习才是最快的学习方式.还是以前的那个项目,前后端分离,现在把前端换成vue的,暂时采用脚本化的方式,然后在尝试工程化的方式. 现在先实现功 ...

  4. 从后端到前端之Vue(六)表单组件

    表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...

  5. 从后端到前端之Vue(五)小试路由

    一开始我还以为vue的路由只能用在工程化的项目里面呢,然后研究了一下才发现,在脚本化里面也是可以用的.其实呢不管在哪里用,把原理研究明白就对了. 一. 官网demo 这里不得不吐槽一下官网,写的不清不 ...

  6. 写给后端的前端笔记:浮动(float)布局

    写给后端的前端笔记:浮动(float)布局 这篇文章主要面向后端人员,对前端有深刻了解的各位不喜勿喷. 起因 前一阵子我一个后端的伙伴问我,"前端的左飘怎么做?",我立马就懵了,& ...

  7. 写给后端的前端笔记:定位(position)

    写给后端的前端笔记:定位(position) 既然都写了一篇浮动布局,干脆把定位(position)也写了,这样后端基本上能学会css布局了. 类别 我们所说的定位position主要有三类:固定定位 ...

  8. 循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

    循序渐进VUE+Element 前端应用开发的系列文章中,前面介绍了系统各个功能的处理实现,本篇随笔从一个主线上介绍前后端开发的整合,让我们从ABP框架后端的查询接口的处理,前端API接口调用的封装, ...

  9. 0基础菜鸟学前端之Vue.js

    简介:0基础前端菜鸟,啃了将近半月前端VUE框架,对前端知识有了初步的了解.下面总结一下这段时间的学习心得. 文章结构 前端基础 Vue.js简介 Vue.js常用指令 Vue.js组件 Vue.js ...

随机推荐

  1. C# 金额转为大写金额

    /// <summary> /// 金额转为大写金额 /// </summary> public class MoneyConvertChinese { /// <sum ...

  2. 如何在 Linux 中添加一块大于 2TB 的新磁盘?

    你有没有试过使用 fdisk 对大于 2TB 的硬盘进行分区,并且纳闷为什么会得到需要使用 GPT 的警告? 是的,你看到的没错.我们无法使用 fdisk 对大于 2TB 的硬盘进行分区. 在这种情况 ...

  3. Rendering in Delphi using TCanvas (FMX)

    BY CRAIG CHAPMAN · PUBLISHED 2015-08-05 · UPDATED 2015-08-20   I have a customer with an application ...

  4. Linux iostat

    转自 http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html Linux IO实时监控iostat命令详解 简介 iostat ...

  5. qt 自动重启(两种方法)

    所谓自动重启就是程序自动关闭后在重新打开: 一般一个qt程序main函数如下: int main(int argc, char* argv[]) { QApplication app(argc, ar ...

  6. 使用Arcgis Api for Javascript 调用 本地Portal发布的WebMap

    1.环境搭建 安装Arcgis Portal 10.4,Server 10.4,DataStore ,WebAdaptor for IIS,搭建arcgis api for javascript 4. ...

  7. OSGEarth环境搭建

    1.下载OsgEaarth2.8源码 https://codeload.github.com/gwaldron/osgearth/legacy.zip/osgearth-2.8 2.下载perl 编译 ...

  8. python列表的内建函数

    list.append(obj) 向列表中添加一个对象obj list.count(obj) 返回一个对象obj 在列表中出现的次数 list.extend(seq)a 把序列seq 的内容添加到列表 ...

  9. vuejs切换导航条高亮路由高亮做法

    我的GitHub前端经验总结,喜欢的话请点star✨✨Thanks.:https://github.com/liangfengbo/frontend-develop vuejs导航条高亮我的做法: 用 ...

  10. IIS7上传4M文件以上文件出现“Post大小超出允许的限制”错误解决方法

    在web.config文件中的system.web节点中添加如下这句,即40M <system.web> <httpRuntime maxRequestLength = " ...