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 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
js onmousewheel事件多次触发问题解决方法
Oct 17 Javascript
jquery实现用户信息修改验证输入方法汇总
Jul 18 Javascript
Bootstrap每天必学之媒体对象
Nov 30 Javascript
jQuery验证插件validate使用详解
May 11 Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 Javascript
jquery事件与绑定事件
Mar 16 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
详解Webpack loader 之 file-loader
Nov 07 Javascript
JS阻止事件冒泡的方法详解
Aug 26 Javascript
解决vue打包后刷新页面报错:Unexpected token
Aug 27 Javascript
微信小程序HTTP接口请求封装代码实例
Sep 05 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
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
PHP教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Python设计模式之观察者模式实例
2014/04/26 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
消防宣传口号
2014/06/16 职场文书
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技