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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
javascript实现的基于金山词霸网络翻译的代码
Jan 15 Javascript
JavaScript Eval 函数使用
Mar 23 Javascript
Javascript中产生固定结果的函数优化技巧
Jan 16 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
清除输入框内的空格
Dec 21 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
微信小程序收货地址API兼容低版本解决方法
May 18 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
Vue数据双向绑定原理实例解析
May 15 Javascript
详解JavaScript 作用域
Jul 14 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 日期时间函数的高级应用技巧
2009/10/10 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
动态加载js的几种方法
2006/10/23 Javascript
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
javascript Keycode对照表
2009/10/24 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
详解Python中的Cookie模块使用
2015/07/06 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
python语言中with as的用法使用详解
2018/02/23 Python
python如何对实例属性进行类型检查
2018/03/20 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
python操作cfg配置文件方式
2019/12/22 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
详解HTML5 window.postMessage与跨域
2017/05/11 HTML / CSS
New delete 与malloc free 的联系与区别
2013/02/04 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
秘书英文求职信
2014/04/16 职场文书
瘦西湖导游词
2015/02/03 职场文书
《风筝》教学反思
2016/02/23 职场文书
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
Python字符串常规操作小结
2022/04/03 Python