VUE+Element-ui实战之el-tabs切换实时加载el-table表格数据

本文介绍如何在Vue项目中实现Tab内容动态加载,避免页面加载时因同时加载多个数据导致卡顿。采用v-if控制Tab组件的显示隐藏,利用Tab切换事件触发数据请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实战场景描述

实际开发过程中,需要Tab切换不同类型的数据,如果是每个Tab表单是静态数据还好,但通常情况下基本上涉及的都是table数据,页面打开时,我们看到的是一个打开的Tab内容,但其实vue是把所有的内容都渲染了,只是其他都隐藏了,这种可能就会造成打开页面时因为需要同时加载多个数据而卡顿,最佳实现思路肯定是Tab切换时才进行实时加载

1、确定好每个Tab内容

参考官网的例子改成我们的内容就好

2、Tab切换事件

今天的列子每个tab都涉及表格,为了方便后期维护和切换刷新,把每个Tab内容都单独抽离成一个组件,并且用v-if控制显示隐藏。这个操作在Tab点击切换时进行设置即可。

 

3、完整代码

主页面:

<template>
    <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick" >
        <!-------------------------------------------------------->
        <el-tab-pane label="待审核" name="audit">
            <AuditList  v-if="activeName == 'audit'" ref="audit"></AuditList>
        </el-tab-pane>
        <!-------------------------------------------------------->
        <el-tab-pane label="已通过" name="pass">
            <PassList v-if="activeName == 'pass'" ref="pass"></PassList></el-tab-pane>
        <!-------------------------------------------------------->
        <el-tab-pane label="已否决" name="noPass">
            <NoPassList v-if="activeName == 'noPass'" ref="noPass"></NoPassList>
        </el-tab-pane>
        <!-------------------------------------------------------->
        <el-tab-pane label="已忽略" name="ignore">
            <IgnoreList v-if="activeName == 'ignore'" ref="ignore"></IgnoreList>
        </el-tab-pane>
    </el-tabs>
</template>

<script>
  import PassList from "./PassList2";
  import NoPassList from "./NoPassList2";
  import IgnoreList from "./IgnoreList2";
  import AuditList from "./AuditList2";
  export default {
    name: "TEMPLATE",
    components: {
      PassList,
      NoPassList,
      IgnoreList,
      AuditList
    },
    data(){
      return {
        activeName: 'audit'
      };
    },
    mounted(){
      this.onQuery();
    },
    methods:{
      handleClick(tab, event) {
        this.activeName = tab.name;
        var that = this;
        setTimeout(function(){
            that.onQuery();
        },500);
      },
      
      onQuery() {
        this.$refs[this.activeName].getList();
      },

    }
  }
</script>

<style scoped>

</style>
已通过PassList2.vue:
<template>
   <div>
       <el-table
               :data="tableData"
               border
               stripe
               style="width: 100%">
           <el-table-column
                   label="序号"
                   align="center"
                   width="70px">
               <template slot-scope="scope">
                   {{(formInline.currentPage-1)*formInline.pageSize + scope.$index + 1}}
               </template>
           </el-table-column>
           <el-table-column
                   label="人员姓名"
                   prop="pName">
           </el-table-column>
           <el-table-column
                   label="联系电话"
                   prop="phone">
           </el-table-column>
           <el-table-column
                   label="所在楼层"
                   prop="floor">
           </el-table-column>
           <el-table-column
                   label="房间编号"
                   prop="spaceNum">
           </el-table-column>
           <el-table-column
                   label="人员备注"
                   prop="notes">
           </el-table-column>
           <el-table-column
                   label="提交时间"
                   prop="submitTime">
           </el-table-column>
           <el-table-column
                   label="审核时间"
                   prop="auditTime">
           </el-table-column>
       </el-table>
       <el-pagination background
                      layout="total, prev, pager, next, sizes,jumper"
                      :page-sizes="[5, 10, 15]"
                      :page-size="formInline.pageSize"
                      :total="dataTotalCount"
                      @size-change="handleSizeChange"
                      @current-change="handleCurrentChange">
       </el-pagination>
   </div>
</template>

<script>
  export default {
    name: "PassList",
    data(){
      return {
        dataTotalCount: 0,      //查询条件的总数据量
        formInline: {
          currentPage: 1,
          pageSize:10,
        },
        tableData: [],
      }
    },
    methods:{

      //分页 初始页currentPage、初始每页数据数pagesize和数据testpage--->控制每页几条
      handleSizeChange: function(size) {
        this.formInline.pageSize = size;
        this.getList();
      },

      // 控制页面的切换
      handleCurrentChange: function(currentpage) {
        this.formInline.currentPage = currentpage;
        this.getList();
      },

      getList() {
        var that = this;
        that.axios.get('/dev-api/server/accessAudit/passList', {params:this.formInline})
          .then(function (response) {
            that.tableData = response.data.data.items;
            that.dataTotalCount = response.data.data.total;
          })
          .catch(function (error) {
            that.$message({
              type: 'error',
              message: '系统异常:'+error
            });
          });
      },

    }
  }
</script>

<style scoped>

</style>

 已否决列表NoPassList2.vue

<template>
   <div>
       <el-table
               :data="tableData"
               border
               stripe
               style="width: 100%">
           <el-table-column
                   label="序号"
                   align="center"
                   width="70px">
               <template slot-scope="scope">
                   {{(formInline.currentPage-1)*formInline.pageSize + scope.$index + 1}}
               </template>
           </el-table-column>
           <el-table-column
                   label="人员姓名"
                   prop="pName">
           </el-table-column>
           <el-table-column
                   label="联系电话"
                   prop="phone">
           </el-table-column>
           <el-table-column
                   label="所在楼层"
                   prop="floor">
           </el-table-column>
           <el-table-column
                   label="房间编号"
                   prop="spaceNum">
           </el-table-column>
           <el-table-column
                   label="提交时间"
                   prop="submitTime">
           </el-table-column>
           <el-table-column
                   label="人员备注"
                   prop="notes">
           </el-table-column>
           <el-table-column
                   label="审核时间"
                   prop="auditTime">
           </el-table-column>
           <el-table-column
                   label="否决原因"
                   prop="reason">
           </el-table-column>
       </el-table>
       <el-pagination background
                      layout="total, prev, pager, next, sizes,jumper"
                      :page-sizes="[5, 10, 15]"
                      :page-size="formInline.pageSize"
                      :total="dataTotalCount"
                      @size-change="handleSizeChange"
                      @current-change="handleCurrentChange">
       </el-pagination>
   </div>
</template>

<script>
  export default {
    name: "NoPassList",
    data(){
      return {
        dataTotalCount: 0,      //查询条件的总数据量
        formInline: {
          currentPage: 1,
          pageSize:10,
        },
        tableData: [],
      }
    },
    methods:{

      //分页 初始页currentPage、初始每页数据数pagesize和数据testpage--->控制每页几条
      handleSizeChange: function(size) {
        this.formInline.pageSize = size;
        this.getList();
      },

      // 控制页面的切换
      handleCurrentChange: function(currentpage) {
        this.formInline.currentPage = currentpage;
        this.getList();
      },

      getList(data) {
        if(data){
          this.formInline.info = data.info;
          this.formInline.pType = data.pType;
          this.formInline.floor = data.floor;
        }

        var that = this;
        that.axios.get('/dev-api/server/accessAudit/noPassList', {params:this.formInline})
          .then(function (response) {
            that.tableData = response.data.data.items;
            that.dataTotalCount = response.data.data.total;
          })
          .catch(function (error) {
            that.$message({
              type: 'error',
              message: '系统异常:'+error
            });
          });
      },

    }
  }
</script>

<style scoped>

</style>

已忽略列表IgnoreList2.vue

<template>
   <div>
       <el-table
               :data="tableData"
               border
               stripe
               style="width: 100%">
           <el-table-column
                   label="序号"
                   align="center"
                   width="70px">
               <template slot-scope="scope">
                   {{(formInline.currentPage-1)*formInline.pageSize + scope.$index + 1}}
               </template>
           </el-table-column>
           <el-table-column
                   label="人员姓名"
                   prop="pName">
           </el-table-column>
           <el-table-column
                   label="联系电话"
                   prop="phone">
           </el-table-column>
           <el-table-column
                   label="所在楼层"
                   prop="floor">
           </el-table-column>
           <el-table-column
                   label="房间编号"
                   prop="spaceNum">
           </el-table-column>
           <el-table-column
                   label="人员备注"
                   prop="notes">
           </el-table-column>
           <el-table-column
                   label="提交时间"
                   prop="submitTime">
           </el-table-column>
           <el-table-column
                   label="审核时间"
                   prop="auditTime">
           </el-table-column>
       </el-table>
       <el-pagination background
                      layout="total, prev, pager, next, sizes,jumper"
                      :page-sizes="[5, 10, 15]"
                      :page-size="formInline.pageSize"
                      :total="dataTotalCount"
                      @size-change="handleSizeChange"
                      @current-change="handleCurrentChange">
       </el-pagination>
   </div>
</template>

<script>
  export default {
    name: "IgnoreList",
    data(){
      return {
        dataTotalCount: 0,      //查询条件的总数据量
        formInline: {
          currentPage: 1,
          pageSize:10,
        },
        tableData: [],
      }
    },
    methods:{

      //分页 初始页currentPage、初始每页数据数pagesize和数据testpage--->控制每页几条
      handleSizeChange: function(size) {
        this.formInline.pageSize = size;
        this.getList();
      },

      // 控制页面的切换
      handleCurrentChange: function(currentpage) {
        this.formInline.currentPage = currentpage;
        this.getList();
      },

      getList(data) {
        if(data){
          this.formInline.info = data.info;
          this.formInline.pType = data.pType;
          this.formInline.floor = data.floor;
        }

        var that = this;
        that.axios.get('/dev-api/server/accessAudit/ignoreList', {params:this.formInline})
          .then(function (response) {
            that.tableData = response.data.data.items;
            that.dataTotalCount = response.data.data.total;
          })
          .catch(function (error) {
            that.$message({
              type: 'error',
              message: '系统异常:'+error
            });
          });
      },

    }
  }
</script>

<style scoped>

</style>

待审核列表AuditList2.vue

<template>
    <div>
        <el-table
                :data="tableData"
                border
                stripe
                style="width: 100%">
            <el-table-column
                    align="center"
                    label="序号"
                    width="70px">
                <template slot-scope="scope">
                    {{(formInline.currentPage-1)*formInline.pageSize + scope.$index + 1}}
                </template>
            </el-table-column>
            <el-table-column
                    label="人员姓名"
                    prop="pName">
            </el-table-column>
            <el-table-column
                    label="联系电话"
                    prop="phone">
            </el-table-column>
            <el-table-column
                    label="所在楼层"
                    prop="floor">
            </el-table-column>
            <el-table-column
                    label="房间编号"
                    prop="spaceNum">
            </el-table-column>
            <el-table-column
                    label="认证图片"
                    prop="imgUrl">
            </el-table-column>
            <el-table-column
                    label="提交时间"
                    prop="submitTime">
            </el-table-column>
            <el-table-column
                    label="人员备注"
                    prop="notes">
            </el-table-column>
            <el-table-column align="center" fixed="right" label="操作" width="300">
                <template slot-scope="scope">
                    <el-button icon="el-icon-s-claim" size="mini">通过</el-button>
                    <el-button icon="el-icon-s-release" size="mini">否决</el-button>
                    <el-button icon="el-icon-takeaway-box"  size="mini">忽略</el-button>
                </template>
            </el-table-column>
        </el-table>
        <el-pagination :page-size="formInline.pageSize"
                       :page-sizes="[5, 10, 15]"
                       :total="dataTotalCount"
                       @current-change="handleCurrentChange"
                       @size-change="handleSizeChange"
                       background
                       layout="total, prev, pager, next, sizes,jumper">
        </el-pagination>
    </div>
</template>

<script>
  export default {
    name: "TEMPLATE",
    data() {
      return {
        dataTotalCount: 0,      //查询条件的总数据量
        formInline: {
          currentPage: 1,
          pageSize: 10,
        },
        tableData: [],
      }
    },
    methods: {
      //分页 初始页currentPage、初始每页数据数pagesize和数据testpage--->控制每页几条
      handleSizeChange: function (size) {
        this.formInline.pageSize = size;
        this.getList();
      },

      // 控制页面的切换
      handleCurrentChange: function (currentpage) {
        this.formInline.currentPage = currentpage;
        this.getList();
      },

      getList() {
        var that = this;
        that.axios.get('/dev-api/server/accessAudit/list', {params: that.formInline})
          .then(function (response) {
            that.tableData = response.data.data.items;
            that.dataTotalCount = response.data.data.total;
          })
          .catch(function (error) {
            that.$message({
              type: 'error',
              message: '系统异常:' + error
            });
          });
      }
    }
  }
</script>

<style scoped>

</style>

最终效果

注:表格中所有数据均为mock模拟数据,如有雷同纯属巧合^_^

`element-ui` 是一个基于 Vue.js 的桌面端组件库,提供了丰富的 UI 组件,用于构建交互式的用户界面。`el-tabs` 是 `element-ui` 中的一个标签页组件,它可以创建包含多个面板的标签页,用户可以通过切换标签页来查看不同的内容。 `el-tabs--top` 是 `el-tabs` 组件的一个属性,用于指定标签页的布局位置。当使用 `el-tabs--top` 时,标签页将显示在内容区域的上方。 关于“动态table切换”,通常是指在使用 `el-tabs` 组件时,根据切换的不同标签页,表格table)也会相应地进行动态更新。这通常涉及到数据的动态绑定和组件的条件渲染。 在 `element-ui` 中,你可以使用 `v-if` 或者 `v-show` 指令来实现动态切换表格内容。通过监听 `el-tabs` 的 `tab-click` 事件来判断当前选中的标签页,然后根据这个标签页来决定显示哪个表格数据。 以下是一个简单的示例代码: ```html <template> <el-tabs v-model="activeName" @tab-click="handleTabClick"> <el-tab-pane label="用户管理" name="first">用户表格数据</el-tab-pane> <el-tab-pane label="订单管理" name="second">订单表格数据</el-tab-pane> <!-- 更多tab-pane --> </el-tabs> <el-table v-if="activeName === 'first'" :data="userTableData"> <!-- 用户表格内容 --> </el-table> <el-table v-else-if="activeName === 'second'" :data="orderTableData"> <!-- 订单表格内容 --> </el-table> <!-- 更多表格 --> </template> <script> export default { data() { return { activeName: 'first', // 当前激活的标签页名称 userTableData: [], // 用户表格数据 orderTableData: [], // 订单表格数据 }; }, methods: { handleTabClick(tab, event) { // 根据tab.name来更新数据或者其他逻辑 }, }, }; </script> ``` 在这个示例中,当用户点击不同的标签页时,会触发 `handleTabClick` 方法,在该方法中可以编写更新表格数据的逻辑,然后根据 `activeName` 的值来决定显示哪个表格
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛七分

随多随少随你心意^-^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值