vue2.* element tabs tab-pane 动态加载组件操作


Posted in Javascript onJuly 19, 2020

一、重要部分

1、 注意 <component :is=item.content></component> :表明模板

<el-tab-pane
     v-for="(item) in editableTabs"
     :key="item.name"
     :label="item.title"
     :name="item.name"
    >
     <component :is=item.content></component>
 </el-tab-pane>

2、content: 'Jbxx' ,其中 jbxx 是 模板

addTab (targetName, route) {
   let newTabName = ++this.tabIndex + ''
   this.editableTabs.push({
    title: targetName,
    name: newTabName,
    content: 'Jbxx'
   })
   this.editableTabsValue = newTabName
   if (targetName === '基本信息') {
    this.show = true
   } else {
    this.show = false
   }
   // this.$router.push({
   //  path: route
   // })
  }

二、完整代码

<template>
   <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab">
    <el-tab-pane
     v-for="(item) in editableTabs"
     :key="item.name"
     :label="item.title"
     :name="item.name"
    >
     <component :is=item.content></component>
    </el-tab-pane>
   </el-tabs>
</template>
 
<script>
import VueEvent from '../model/VueEvent.js'
import Jbxx from './jgxx/Jbxx'
 
export default {
 data () {
  return {
   show: false,
   editableTabsValue: '2',
   editableTabs: [{
    title: 'Tab 1',
    name: '1',
    content: ''
   }, {
    title: 'Tab 2',
    name: '2',
    content: ''
   }],
   tabIndex: 2
  }
 },
 methods: {
  addTab (targetName, route) {
   let newTabName = ++this.tabIndex + ''
   this.editableTabs.push({
    title: targetName,
    name: newTabName,
    content: 'Jbxx'
   })
   this.editableTabsValue = newTabName
   if (targetName === '基本信息') {
    this.show = true
   } else {
    this.show = false
   }
   // this.$router.push({
   //  path: route
   // })
  },
  removeTab (targetName) {
   let tabs = this.editableTabs
   let activeName = this.editableTabsValue
   if (activeName === targetName) {
    tabs.forEach((tab, index) => {
     if (tab.name === targetName) {
      let nextTab = tabs[index + 1] || tabs[index - 1]
      if (nextTab) {
       activeName = nextTab.name
      }
     }
    })
   }
   this.editableTabsValue = activeName
   this.editableTabs = tabs.filter(tab => tab.name !== targetName)
  }
 },
 mounted () {
  VueEvent.$on('to-main', (name, route) => {
   this.addTab(name, route)
  })
 },
 components: {
  Jbxx
 }
}
</script>
<style scoped>
</style>

补充知识:在vue中使用elementUI饿了么框架使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结...

当我们在开发中遇到tab切换,这时候用el的el-tabs感觉很方便

但当我在把代码都写完后,发现一个问题就是页面打开时

虽然我们只能看见当前一个tab页,但是vue会帮你把你写的所有tab页的内容都渲染出来了,只是其他的隐藏了,同时其他tab的js也都走了一边,当你点击tab时js就不会再去请求后台

这种机制会造成一个问题,就是如果每个tab页的数据都过大的时候,可能就会导致首次打开页面卡顿现象,同时如果数据库数据在实时发生变化的话,比如你一分钟前打开的这个页面,看的是tab1的内容,看了1分钟后我想看tab2的内容,但此时tab2的内容后台数据库已经发生变化了,你能看到的只是1分钟前的数据,那该怎么解决这个问题呢?

首先一开始一次加载所有tab的代码是这样的↓

<el-tabs v-model="activeName" @tab-click="handleClick" type="border-card">
   <el-tab-pane label="待处理" name="first">
    <processed/> <!--这里是自定义的子模块,也就是自定义组件-->
   </el-tab-pane>
   <el-tab-pane label="已处理" name="second">
    <un-processed/>
   </el-tab-pane>
</el-tabs>

这时候v-if的作用就可以发挥出来了,当v-if的值为false时vue是不会去渲染该标签下的内容的

那我们就把tabs下的子模块标签上加v-if,一开始只设置其中一个为true其他都为false,当点击tab切换时去改变v-if的值,代码如下↓

<el-tabs v-model="activeName" @tab-click="handleClick" type="border-card">
   <el-tab-pane label="待处理" name="first" :key="'first'">
    <processed v-if="isFirst"/>
   </el-tab-pane>
   <el-tab-pane label="已处理" name="second" :key="'second'">
    <un-processed v-if="isSecond"/>
   </el-tab-pane>
  </el-tabs>

js的代码↓

<script>
import Breadcrumb from '@/components/Breadcrumb'
import Processed from './processed'
import UnProcessed from './unprocessed'
export default {
 components: {
  Breadcrumb,
  Processed,
  UnProcessed
 },
 data() {
  return {
   // 默认第一个Tab
   activeName: 'first',
   isFirst: true,
   isSecond: false
  }
 },
 methods: {
  handleClick(tab) {
   if (tab.name === 'first') {
    this.isFirst = true
    this.isSecond = false
   } else if (tab.name === 'second') {
    this.isFirst = false
    this.isSecond = true
   }
  }
 }
}
</script>

这样就可以完美解决上面的问题,首次加载页面只会渲染其中一个tab的内容,同时点击tab切换时页面重新渲染页面,good!

el-table中动态表头的写法

其实就是一个v-for循环,根据后台返回数据生成对应表头

<el-table-column v-for="item in 
      tableHeader"
       :key="item.key"
       :prop="item.key"
       :label="item.name"
       :formatter="item.formatter"
       align="center"
       show-overflow-tooltip></el-table-column>

js里的数据绑定:

tableHeader: [
    {
     name: '手机号码',
     key: 'partnerPhone'
    },
    {
     name: '姓名',
     key: 'partnerName'
    },
    {
     name: '职位',
     key: 'position',
     formatter: this.posFormatter
    },
    {
     name: '团队',
     key: 'teamName'
    },
    {
     name: '代理商',
     key: 'agentName'
    },
    {
     name: '状态',
     key: 'state',
     formatter: this.stFormatter
    }
   ]

以上这篇vue2.* element tabs tab-pane 动态加载组件操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
Javascript Request获取请求参数如何实现
Nov 28 Javascript
js弹出窗口之弹出层的小例子
Jun 17 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
Jul 08 Javascript
jQuery获取多种input值的简单实现方法
Jun 20 Javascript
微信小程序 动态传参实例详解
Apr 27 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
Feb 10 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
May 01 Javascript
浅析vue插槽和作用域插槽的理解
Apr 22 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
解决vue中el-tab-pane切换的问题
Jul 19 #Javascript
解决echarts图表使用v-show控制图表显示不全的问题
Jul 19 #Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 #Javascript
vue实现的多页面项目如何优化打包的步骤详解
Jul 19 #Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
Jul 19 #Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
Jul 19 #Javascript
完美解决vue 中多个echarts图表自适应的问题
Jul 19 #Javascript
You might like
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
了解重排与重绘
2019/05/29 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
用js编写留言板
2020/03/17 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
python中的__slots__使用示例
2015/02/26 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
pandas带有重复索引操作方法
2018/06/08 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
python实现简单的tcp 文件下载
2020/09/16 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书