VUE前后端学习tab写法实例


Posted in Javascript onAugust 06, 2019

动态创建一个tab,里面放一个table,这样一个后台管理的基本功能(之一)就出来了。

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

一、目标

1、  可以动态创建tab。

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

3、  Css的设置。

4、  方法的处理方式。

5、  效果图

 VUE前后端学习tab写法实例

二、思路

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

还是数据驱动,那么就建立一个大的数据包,把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>
  <!--tab标签-->
  <ul 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)" rel="external nofollow" > {{t.title}} 
        <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" 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,如果增加了按钮、查询条件、分页控件,这个数据包的结构要变成多复杂呀?挖坑也不带这么挖的呀。

那么怎么办呢?下次再说。(好吧,现在还没想好,似乎要写组件,或者要用到插槽)感谢大家对三水点靠木的支持。

Javascript 相关文章推荐
限制textbox或textarea输入字符长度的JS代码
Oct 16 Javascript
Javascript基础教程之数据类型转换
Jan 18 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
jQuery中Find选择器用法示例
Sep 21 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
Jan 13 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
Mar 09 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
d3绘制基本的柱形图的实现代码
Dec 12 Javascript
JS实现多选框的操作
Jun 24 Javascript
Vue组件跨层级获取组件操作
Jul 27 Javascript
Vue与React的区别和优势对比
Dec 18 Vue.js
Vue路由前后端设计总结
Aug 06 #Javascript
vue实现行列转换的一种方法
Aug 06 #Javascript
微信小程序点餐系统开发常见问题汇总
Aug 06 #Javascript
详解使用WebPack搭建React开发环境
Aug 06 #Javascript
vue-cli3+typescript新建一个项目的思路分析
Aug 06 #Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 #Javascript
angularjs请求数据的方法示例
Aug 06 #Javascript
You might like
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
2019/05/24 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
Python实现list反转实例汇总
2014/11/11 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python中的 enum 模块源码详析
2019/01/09 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
大型主题婚礼活动策划方案
2014/09/15 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript
Python创建SQL数据库流程逐步讲解
2022/09/23 Python