VUE前后端学习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>
  <!--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,如果增加了按钮、查询条件、分页控件,这个数据包的结构要变成多复杂呀?挖坑也不带这么挖的呀。

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

(0)

相关推荐

  • Vue.js实现tab切换效果

    Vue是一个小巧轻便的JavaScript库.它有一个简单易懂的API,能够让开发者在开发web应用的时候更加简易便捷.实际上,一直让Vue引以为豪的是它的便捷性.执行力.灵活性. 目前在学习Vue.js.在学习的时候需要把手动操作DOM的思维去掉,因为Vue是数据驱动,不需要手动操作DOM.他通过一些特殊的hmtl语法,将DOM和数据绑定起来.一旦创建了绑定,DOM就会和数据保持同步,每当变更了数据,DOM也会相应的发生改变,更新. 下面是我用vue.js来实现的tab切换功能. <!--这里

  • vue项目中将element-ui table表格写成组件的实现代码

    表格中我们经常需要动态加载数据, 如果有多个页面都需要用到表格, 那我希望可以有个组件, 只传数据过去显示, 不用每个页面都去写这么一段内容: <el-table :data="tableData" border size="mini" fit highlight-current-row height="500"> <el-table-column type="index" align="cente

  • vue滚动tab跟随切换效果

    分享一个我前几天做的移动端 tab滚动跟随的例子 随着滚动条的滚动,tab会对应进行切换 首先我们需要监听当前页面的滚动 mounted(){ //记录每个内容对用的dom数组 this.arrDom = document.getElementsByClassName("item-content"); window.addEventListener('scroll', this.handleScroll); }, destroyed(){ window.removeEventListe

  • vue子路由跳转实现tab选项卡

    现在很多的后台管理系统都采用tab选项卡的布局,左边是导航栏固定,右边是对应的页面,每次点击左边的导航标题,只有右面的对应页面再切换,而vue要做tab选项卡,推荐使用<router-link></router-link>实现a标签的效果,然后使用<router-view></router-view>实现插槽的效果,把对应的页面 "塞" 进去,具体实现看下面的案例: 1.这是tab选项卡的页面,布局就不说了,主要是<router-l

  • vue elementUI使用tabs与导航栏联动

    不使用tabs标签页时,点击导航菜单,router-view映射相应的组件即可显示页面.但我们想在点击导航栏时在tabs中映射相应的组件,这就需要使用tabs组件 在slider.vue中点击路由后,把当前选择的路由@select使用bus传出去 <el-menu class="sidebar-el-menu" :default-active="onRoutes" :collapse="collapse" background-color=

  • VUE前后端学习tab写法实例

    动态创建一个tab,里面放一个table,这样一个后台管理的基本功能(之一)就出来了. 好吧,这里其实只是试试水,感受一下vue的数据驱动可以怎么玩,通过一个个实例学习一下vue的各个知识点.这里要看看方法和css如何设置. 一.目标 1.  可以动态创建tab. 2.  可以切换(废话).可以关闭tab. 3.  Css的设置. 4.  方法的处理方式. 5.  效果图 二.思路 应该有好多种方式可以实现,这里先试一个,其他的以后再说. 还是数据驱动,那么就建立一个大的数据包,把tab信息和t

  • vue+mockjs模拟数据实现前后端分离开发的实例代码

    本文介绍了vue+mockjs模拟数据实现前后端分离开发的实例代码,分享给大家,也给自己留个笔记. 在项目中尝试了mockjs,mock数据,实现前后端分离开发. 关于mockjs,官网描述的是 1.前后端分离 2.不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据. 3.数据类型丰富 4.通过随机数据,模拟各种场景. 等等优点. 总结起来就是在后端接口没有开发完成之前,前端可以用已有的接口文档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接口返回

  • SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法

    当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助.本系列文章并不是手把手的教程,主要介绍了核心思路并讲解了核心代码,完整的代码小伙伴们可以在GitHub上star并clone下来研究.另外,原本计划把项目跑起来放到网上供小伙伴们查看,但是之前买服务器为了省钱,内存只有512M,两个应用跑不起来(已经有一个V部落开

  • django简单的前后端分离的数据传输实例 axios

    前端使用的是vue,下面是axios的主要代码 methods: { search: function () { var params = { content1: this.content1 } this.$axios.post("http://127.0.0.1:8000/search/", params) .then((response)=> { console.log(response); this.response1=response.data['content1'] }

  • 如何理解Vue前后端数据交互与显示

    一.技术概述 将后端所计算的数据呈现在前端页面的相应位置并根据用户点击操作改变相应的数据和界面,再传值给后端.该技术是Web开发必备,是前后端交互的纽带.难点在于获取后端数据并且防止数据联动. 二.技术详述 1. 从接口获取后端数据 (1) 仔细查看后端所传数据的类型.主要是区分数组和单个数据.查看后端的请求方式,区分post或者get. (2) 首先,在data中return一个xxxData:[]数组或一个变量xxxData:<类型>来接收后端传来的数据. (3) 在方法中定义一个请求函数

  • Vue2.0 axios前后端登陆拦截器(实例讲解)

    vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐使用axios.前段时间第一次在项目里用到vue,关于登陆问题,这里写一下心得. 首先后端: import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.lovnx.gateway.po.User; import javax.servlet.http.HttpServletRequest; import jav

  • SpringBoot+Vue前后端分离实现请求api跨域问题

    前言 最近过年在家无聊,刚好有大把时间学习Vue,顺便做了一个增删查改+关键字匹配+分页的小dome,可是使用Vue请求后端提供的Api的时候确发现一个大问题,前后端分离了,但是请求的时候也就必定会有跨域这种问题,那如何解决呢? 前端解决方案 思路:由于Vue现在大多数项目但是用脚手架快速搭建的,所以我们可以直接在项目中创建一个vue.config.js的配置文件,然后在里面配置proxy代理来解决,话不多说,直接上代码 module.exports = { devServer: { proxy

  • Vue前后端不同端口的实现方法

    前端Vue 8080端口,后端Node.js 8085端口 主要记录下前后端不同端口遇到的问题 1.写服务器端程序,我的在(node_proxy/index.js)下 app.all('*', function (req, res, next) { res.header('Access-Control-Allow-Origin', req.headers.origin || '*'); res.header('Access-Control-Allow-Headers', 'Content-Typ

  • Vue调用后端java接口的实例代码

    前段时间 做了个学校的春萌项目,其中用到vue连接后端java接口. 先上后端接口代码: package controller; import net.sf.json.JSONObject; import util.DBUtil; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax

  • ssm+vue前后端分离框架整合实现(附源码)

    前言 本文针对Spring+SpringMVC+Mybatis后台开发框架(基于maven构建)与vue前端框架(基于webpack构建)的项目整合进行介绍,对于ssm和vue单独项目的搭建不作为本文的重点,而着重介绍两者之间交互的要点. SSM 项目结构 说明 项目有service和web两个子项目组成,web依赖于service,其中web主要是control层内容,service则对应service层,而MyBatis内容放在了service项目中,spring配置文件放在了web项目中.

随机推荐