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 相关文章推荐
利用jQuery的$.event.fix函数统一浏览器event事件处理
Dec 21 Javascript
div+css布局的图片连续滚动js实现代码
May 04 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
Oct 09 Javascript
获取鼠标在div中的相对位置的实现代码
Dec 30 Javascript
JS构造函数与原型prototype的区别介绍
Jul 04 Javascript
jQuery制作网页版选项卡
Jul 28 Javascript
Bootstrap基本组件学习笔记之分页(12)
Dec 08 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
Jun 28 Javascript
vue iview组件表格 render函数的使用方法详解
Mar 15 Javascript
Angularjs中date过滤器失效的问题及解决方法
Jul 06 Javascript
Bootstrap table表格初始化表格数据的方法
Jul 25 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
Sep 25 Javascript
解决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
php中文本操作的类
2007/03/17 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
Python内存管理实例分析
2019/07/10 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
详解python破解zip文件密码的方法
2020/01/13 Python
python 实现字符串下标的输出功能
2020/02/13 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
中科方德软件测试面试题
2016/04/21 面试题
校园环保建议书
2014/05/14 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
总结一些Java常用的加密算法
2021/06/11 Java/Android