element-ui的表格二次封裝

在使用element-ui的時候荞膘,雖然說element官方的el-table組件已經(jīng)相當好了面氓,但針對的是所以群體绝骚,如果我們在寫后臺系統(tǒng)的時候希望更多的去封裝已減少重復勞動蜜葱。這次趁自己在寫后臺系統(tǒng)的時間來具體記錄下如何去封裝的田柔。

分析element-ui官方的el-table組件

表格屬性

首先需要分析出那些屬性是項目中必須每次都需要的俐巴,這種屬性適合默認值,如果不是必須的但又用到了的可以作為可配置項硬爆。根據(jù)自己的項目其實最常用的屬性data欣舵、stripe,其它的屬性大家可以根據(jù)自己的項目視具體情況而定缀磕。

表格方法

方法中在目前的項目中是沒有使用到的缘圈,但是有一個應該是會有人用到的,sort-change

表格項的屬性

表格的每一項的屬性應該是最多的了袜蚕,畢竟需要配置的也就是表格的每一項了糟把,主要有l(wèi)abel、prop牲剃、width遣疯、fixed、sortable凿傅、formatter缠犀、show-overflow-tooltip,其實這里根據(jù)自己的項目還需要加一個是否為圖片的屬性聪舒,畢竟表格里面顯示圖片還是顯示不下的需要使用其他組件來顯示圖片辨液,暫定屬性為isImg。

表格操作按鈕

通常后臺系統(tǒng)最后一列都需要一個操作箱残,畢竟有很多數(shù)據(jù)時需要人工進行操作的室梅,所以需要添加一些操作的按鈕來對某一行數(shù)據(jù)進行操作。

定義想象的數(shù)據(jù)模型

根據(jù)上面的分享接下來我們先把需要的數(shù)據(jù)或則是配置項定義下來疚宇,這樣后面定義組件的時候就可以根據(jù)定義的數(shù)據(jù)或則配置項來生成表格的內(nèi)容。

表格數(shù)據(jù)的屬性

根據(jù)上面的分享表格數(shù)據(jù)的屬性就兩個data和stripe赏殃,這里需要外加一個loading敷待,所以結(jié)構(gòu)就像下面這樣的:

<template>
  <div class="home">
      test
  </div>
</template>

<script>

export default {
  name: "home",
  data() {
    return {
      table: {
        stripe: false, //是否為斑馬紋
        loading: false, // 數(shù)據(jù)加載loading
      }
    };
  },
  mounted() {}
};
</script>

目前沒有數(shù)據(jù)所以可以先關閉loading和stripe

接下來就是最重要的數(shù)據(jù)了,目前沒有接口所以這里使用自己手動添加數(shù)據(jù)仁热,也就是在table對象中添加data這樣一個數(shù)組來保存表格的數(shù)據(jù)榜揖,如下:

data() {
    return {
      table: {
        stripe: false, //是否為斑馬紋
        loading: false, // 數(shù)據(jù)加載loading
        data: [
          {
            date: "2016-05-02",
            name: "王小虎",
            address: "上海市普陀區(qū)金沙江路 1518 弄"
          },
          {
            date: "2016-05-04",
            name: "王小虎",
            address: "上海市普陀區(qū)金沙江路 1517 弄"
          },
          {
            date: "2016-05-01",
            name: "王小虎",
            address: "上海市普陀區(qū)金沙江路 1519 弄"
          },
          {
            date: "2016-05-03",
            name: "王小虎",
            address: "上海市普陀區(qū)金沙江路 1516 弄"
          }
        ]
      }
    };
  }

這樣表格的屬性也就差不多了勾哩。

表格的方法

表格的方法也就一個就是排序的,因項目中沒有用到所以這里只是提供一個思路举哟,具體實現(xiàn)的細節(jié)大家可以自己去補充思劳,在table對象里面新添加一個event配置項如下:

event: {
    sortEvent: this.tableSort
}

這里的tableSort就不具體寫了,大家可以自己參考element-ui官方來寫這個排序的查詢妨猩。

表格每一項數(shù)據(jù)的屬性

這個也是重點需要配置的潜叛,先定義幾組數(shù)據(jù)模型,也就是在table對象中添加一個數(shù)組header用于表格的生成壶硅,如下:

header: [
          {
            prop: "selection",
            width: "55"
          },
          {
            prop: "date",
            label: "日期11"
          },
          {
            prop: "date",
            label: "日期11",
            width: "180",
            formatter: "",
            tooltip: false,
            sortable:false,
            fixed: "right"
          },
          {
            prop: "date",
            label: "日期11",
            width: "180",
            formatter: "",
            tooltip: false,
            sortable:false,
            isImg:false,
            fixed: "right"
          },
          {
            prop: "options",
            label: "操作",
            width: "180",
            fixed: "right"
          }
        ]

數(shù)組中第一個和最后一個位置最好不要動威兜,第一個是多選操作,最后一個是操作欄

表格數(shù)據(jù)的操作按鈕

有了操作欄那么就需要有操作的按鈕庐椒,先定義一個試試看椒舵,如下:

options: [
          {
            type: "success",
            label: "通過",
            event: this.submitBtn,
            isShow: item => {
              return item.status == 0 ? false : true;
            }
          }
        ]

isShow為什么時候顯示該按鈕,這里有一個回調(diào)來配置约谈,需要返回一個布爾值

表格組件的定義

表格的基礎數(shù)據(jù)定義好了就可以開始定義表格組件了笔宿,新建一個table組件,然后添加如下代碼:

<template>
  <el-table :data="table.data" v-loading="table.loading" :stripe="table.stripe">
      
  </el-table>
</template>

<script>
export default {
  props: {
    table: Object
  }
};
</script>

這時候是看不到任何效果的棱诱,所以先在頁面中引入該組件(上面生成數(shù)據(jù)的頁面中)泼橘,接下來就是生成表格的內(nèi)容了。

生成多選操作

多選操作在配置的時候就是prop的值為selection军俊,所以直接在循環(huán)中判斷即可侥加,如下:

<template v-for="item in table.header">
        <el-table-column type="selection" :width="item.width" v-if="item.prop == 'selection'"></el-table-column>
</template>

效果如下:


1.png

生成列表項

列表項就是具體的表格項屬性了,配置好基本上表格的數(shù)據(jù)也就能看到了粪躬,這里就不單個去說了担败,直接看最終代碼吧:

<template>
  <el-table :data="table.data" v-loading="table.loading" :stripe="table.stripe">
    <template v-for="item in table.header">
      <el-table-column type="selection" :width="item.width" v-if="item.prop == 'selection'"></el-table-column>
      <template v-else-if="item.prop == 'options'">
        <template v-if="table.options.length">
          <el-table-column :label="item.label" :width="item.width" :fixed="item.fixed">
            <template slot-scope="scope">
              <template v-for="btn in table.options">
                <el-button
                  :type="btn.type"
                  v-if="btn.isShow ? btn.isShow(scope.row) : true"
                  @click="btn.event(scope.row)"
                >{{btn.label}}</el-button>
              </template>
            </template>
          </el-table-column>
        </template>
      </template>
      <template v-else>
        <template v-if="item.isImg">
          <el-table-column :prop="item.prop" :label="item.label" :width="item.width">
            <template slot-scope="scope">
              <el-popover placement="left" trigger="click">
                <div>
                  <el-image
                    style="width: 300px; height: auto;"
                    :src="scope.row[item.prop]"
                    fit="contain"
                    slot="reference"
                  ></el-image>
                </div>
                <el-image
                  style="width: 100px;height: 100px;"
                  :src="scope.row[item.prop]"
                  fit="contain"
                  slot="reference"
                ></el-image>
              </el-popover>
            </template>
          </el-table-column>
        </template>
        <el-table-column
          :prop="item.prop"
          :label="item.label"
          :width="item.width"
          :formatter="item.formatter?item.formatter:null"
          :show-overflow-tooltip="item.tooltip?item.tooltip:false"
          :sortable="item.sortable?item.sortable:false"
          v-else
        ></el-table-column>
      </template>
    </template>
  </el-table>
</template>

<script>
export default {
  props: {
    table: Object
  }
};
</script>

修改初始數(shù)據(jù)

這個時候基本封裝好了,對于剛開始的初始數(shù)據(jù)做如下修改即可:

<template>
  <div class="home">
    <my-table :table="table"></my-table>
  </div>
</template>

<script>
import myTable from "@/components/Table";

export default {
  name: "home",
  components: {
    "my-table": myTable
  },
  data() {
    return {
      table: {
        stripe: false, //是否為斑馬紋
        loading: false, // 數(shù)據(jù)加載loading
        data: [
          {
            date: "2016-05-02",
            name: "王小虎",
            img:
              "https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
            address: "上海市普陀區(qū)金沙江路 1518 弄"
          },
          {
            date: "2016-05-04",
            name: "王小虎",
            img:
              "https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg",
            address: "上海市普陀區(qū)金沙江路 1517 弄"
          },
          {
            date: "2016-05-01",
            name: "王小虎",
            img:
              "https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg",
            address: "上海市普陀區(qū)金沙江路 1519 弄"
          },
          {
            date: "2016-05-03",
            name: "王小虎",
            img:
              "https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg",
            address: "上海市普陀區(qū)金沙江路 1516 弄"
          }
        ],
        event: {
          sortEvent: this.tableSort
        },
        header: [
          {
            prop: "selection",
            width: "55"
          },
          {
            prop: "date",
            label: "日期11",
            width: "180",
            formatter: ""
          },
          {
            prop: "name",
            label: "名稱",
            tooltip: false,
            sortable: false
          },
          {
            prop: "img",
            label: "頭像",
            width: "180",
            isImg: true
          },
          {
            prop: "address",
            label: "地址",
            width: "180",
            tooltip: true
          },
          {
            prop: "options",
            label: "操作",
            width: "200",
            fixed: "right"
          }
        ],
        options: [
          {
            type: "success",
            label: "通過",
            event: this.checkPass,
            isShow: item => {
              return item.status == 0 ? false : true;
            }
          },
          {
            type: "danger",
            label: "不通過",
            event: this.checkNoPass,
            isShow: item => {
              return item.status == 1 ? false : true;
            }
          }
        ]
      }
    };
  },
  methods: {
    tableSort(val) {
      console.log(val);
    },
    checkPass(val) {
      console.log(val);
    },
    checkNoPass(val) {
      console.log(val);
    }
  }
};
</script>

效果如下:


2.png
3.png
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镰官,一起剝皮案震驚了整個濱河市提前,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泳唠,老刑警劉巖狈网,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笨腥,居然都是意外死亡拓哺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門脖母,熙熙樓的掌柜王于貴愁眉苦臉地迎上來士鸥,“玉大人,你說我怎么就攤上這事谆级】窘福” “怎么了讼积?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脚仔。 經(jīng)常有香客問我勤众,道長,這世上最難降的妖魔是什么鲤脏? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任们颜,我火速辦了婚禮,結(jié)果婚禮上凑兰,老公的妹妹穿的比我還像新娘掌桩。我一直安慰自己,他們只是感情好姑食,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布波岛。 她就那樣靜靜地躺著,像睡著了一般音半。 火紅的嫁衣襯著肌膚如雪则拷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天曹鸠,我揣著相機與錄音煌茬,去河邊找鬼。 笑死彻桃,一個胖子當著我的面吹牛坛善,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邻眷,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼眠屎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肆饶?” 一聲冷哼從身側(cè)響起改衩,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驯镊,沒想到半個月后葫督,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡板惑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年橄镜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冯乘。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛉鹿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出往湿,到底是詐尸還是另有隱情妖异,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布领追,位于F島的核電站他膳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绒窑。R本人自食惡果不足惜棕孙,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望些膨。 院中可真熱鬧蟀俊,春花似錦、人聲如沸订雾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洼哎。三九已至烫映,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間噩峦,已是汗流浹背锭沟。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留识补,地道東北人族淮。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像凭涂,于是被迫代替她去往敵國和親祝辣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容