vue2.* element tabs tab-pane 動態(tài)加載組件操作
一、重要部分
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如何實現(xiàn)實時加載,以及el-table表格使用總結(jié)...
當(dāng)我們在開發(fā)中遇到tab切換,這時候用el的el-tabs感覺很方便
但當(dāng)我在把代碼都寫完后,發(fā)現(xiàn)一個問題就是頁面打開時
雖然我們只能看見當(dāng)前一個tab頁,但是vue會幫你把你寫的所有tab頁的內(nèi)容都渲染出來了,只是其他的隱藏了,同時其他tab的js也都走了一邊,當(dāng)你點擊tab時js就不會再去請求后臺
這種機制會造成一個問題,就是如果每個tab頁的數(shù)據(jù)都過大的時候,可能就會導(dǎo)致首次打開頁面卡頓現(xiàn)象,同時如果數(shù)據(jù)庫數(shù)據(jù)在實時發(fā)生變化的話,比如你一分鐘前打開的這個頁面,看的是tab1的內(nèi)容,看了1分鐘后我想看tab2的內(nèi)容,但此時tab2的內(nèi)容后臺數(shù)據(jù)庫已經(jīng)發(fā)生變化了,你能看到的只是1分鐘前的數(shù)據(jù),那該怎么解決這個問題呢?
首先一開始一次加載所有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的作用就可以發(fā)揮出來了,當(dāng)v-if的值為false時vue是不會去渲染該標(biāo)簽下的內(nèi)容的
那我們就把tabs下的子模塊標(biāo)簽上加v-if,一開始只設(shè)置其中一個為true其他都為false,當(dāng)點擊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的內(nèi)容,同時點擊tab切換時頁面重新渲染頁面,good!
el-table中動態(tài)表頭的寫法
其實就是一個v-for循環(huán),根據(jù)后臺返回數(shù)據(jù)生成對應(yīng)表頭
<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里的數(shù)據(jù)綁定:
tableHeader: [
{
name: '手機號碼',
key: 'partnerPhone'
},
{
name: '姓名',
key: 'partnerName'
},
{
name: '職位',
key: 'position',
formatter: this.posFormatter
},
{
name: '團隊',
key: 'teamName'
},
{
name: '代理商',
key: 'agentName'
},
{
name: '狀態(tài)',
key: 'state',
formatter: this.stFormatter
}
]
以上這篇vue2.* element tabs tab-pane 動態(tài)加載組件操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3動態(tài)路由刷新出現(xiàn)空白頁的原因與最優(yōu)解
頁面刷新白屏其實是因為vuex引起的,由于刷新頁面vuex數(shù)據(jù)會丟失,這篇文章主要給大家介紹了關(guān)于vue3動態(tài)路由刷新出現(xiàn)空白頁的原因與最優(yōu)解的相關(guān)資料,需要的朋友可以參考下2023-11-11
vue3中如何使用Pinia實現(xiàn)數(shù)據(jù)持久化操作
使用vue3中的pinia,我們可以在多個頁面間共享數(shù)據(jù),但是一旦我們關(guān)閉或刷新頁面,這些數(shù)據(jù)就會丟失,因此,我們需要有一種數(shù)據(jù)持久化的解決方案,下面我們就來看看具體如何解決的吧2023-10-10
基于ant-design-vue實現(xiàn)表格操作按鈕組件
這篇文章主要為大家介紹了基于ant-design-vue實現(xiàn)表格操作按鈕組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
vue系列之requireJs中引入vue-router的方法
這篇文章主要介紹了vue系列之requireJs中引入vue-router的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
vue-router啟用history模式下的開發(fā)及非根目錄部署方法
這篇文章主要介紹了vue-router啟用history模式下的開發(fā)及非根目錄部署方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12

