vue 2.0封裝tab組件

需求

  1. 簡易版
    tab對應的選項卡只是普通文本,多用于展示性組件。
  2. 復雜版
    tab對應的選項卡包括表格,按鈕,圖標,表單等多種元素,包括數據交互、與父組件的通信等。
  3. 性能優化
    切換tab時,緩存組件。

方案

  • Prop
    父組件向子組件傳遞參數。
    tabList(tabs標題列表)、tabIndex(當前的tab序號)
  • 自定義事件
    切換tab事件
  • slot
    內容分發
  • 動態組件
    keep-alive:如果把切換出去的組件保留在內存中,可以保留它的狀態或避免重新渲染

復雜化

如果是第一中需求,可以不必自己寫組件,UI框架中現有的功能完全可以滿足需求。

如果是第二種需求,一般沒有完全合適的UI組件,而本例是我個人的一種解決方案。

  • 封裝tabs公共部分
  • tab對應的內容區域使用slot內容分發
  • ajax請求數據等操作是在分發內容組件中執行的。
  • 鉤子函數activated
    通過activated監聽組件是否激活。

具體實現

template

  <div class="my-tabs">
    <div class="tabs-bar">
      <div class="tabs-bar-nav">
        <div class="tabs-tab" v-for="tab in tabList"
        :class="[tabIndex == tab.index ? 'tabs-active' : '']"
        @click="changeTab(tab)">
          {{tab.name}}
        </div>
      </div>
    </div>
    <div class="tabs-content">
      <slot></slot>
    </div>
  </div>

script

  export default {
  name: 'MyTabs',
  props:
  {
    tabList: Array,
    tabIndex: Number
  },
  data () {
    return {
    }
  },
  methods: {
    changeTab: function (tab) {
      this.$emit('changeTab', tab)
    }
  }
}

style

  <style scoped lang="scss">
.my-tabs {
  font-size: 14px;
  color: #444;
}
 .tabs-bar {
   border-bottom: 1px solid #eee;
   position: relative;
   padding: 5px 0;
 }
 .tabs-bar-nav {
   display: table;
   margin-left: 35px;
   position: absolute;
   bottom: -1px;
 }
 .tabs-tab {
   min-width: 110px;
   padding: 5px 0;
   position: relative;
   display: inline-block;
   text-align: center;
   cursor: pointer;
 }
 .tabs-active {
   border-top: 1px solid pink;
   border-left: 1px solid pink;
   border-right: 1px solid pink;
   border-bottom: 1px solid #fff;
 }
 .tabs-content {
   padding-left: 20px;
   padding-right: 20px;
   padding-bottom: 30px;
 }
</style>

引用

以下one,two內部只是一個div。

  <!-- Tabs -->
    <my-tabs :tabList="tabList" :tabIndex="tabIndex" @changeTab="changeTab">
      <keep-alive>
        <component :is="currentContent">
        </component>
      </keep-alive>
    </my-tabs>
import MyTabs from '../componets/tabs.vue'
import One from './one.vue'
import Two from './two.vue'

export default {
  name: 'Home',
  components: {
    MyTabs,
    'one': One,
    'two': Two
  },
  data () {
    return {
      tabIndex: 0,
      currentContent: 'one',
      tabList: [
        {
          index: 0,
          name: '選項一',
          component: 'one'
        },
        {
          index: 1,
          name: '選項二',
          component: 'two'
        }
      ]
    }
  },
  methods: {
     // 切換選項卡
    changeTab: function (tab) {
      this.tabIndex = tab.index
      this.currentContent = tab.component
    }
  }
}

demo

tabs.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容