2019-09-17 vue項(xiàng)目中將element-ui table表格寫成組件

表格中我們經(jīng)常需要?jiǎng)討B(tài)加載數(shù)據(jù)拳喻, 如果有多個(gè)頁面都需要用到表格, 那我希望可以有個(gè)組件行冰, 只傳數(shù)據(jù)過去顯示被碗, 不用每個(gè)頁面都去寫這么一段內(nèi)容:

<el-table :data="tableData"  border size="mini" fit highlight-current-row height="500">
    <el-table-column type="index" align="center" fixed></el-table-column>
    <el-table-column prop="DHM" min-width="140px" label="時(shí)間" align="center"></el-table-column>
    <el-table-column prop="PLAZANO" min-width="100px" label="編碼" align="center"></el-table-column>
    <el-table-column prop="PLAZANAME"  min-width="100px" label="名稱" align="center"></el-table-column>
    <el-table-column prop="CAR_PLATE" label="號碼" align="center"></el-table-column>
    <el-table-column prop="CARD_NO" min-width="120px" label="卡號" align="center"></el-table-column>
    <el-table-column prop="DATATYPE" label="數(shù)據(jù)類型" align="center" :formatter="formatDATATYPE"></el-table-column>
    <el-table-column prop="STAFFNAME" min-width="100px" label="姓名" align="center"></el-table-column>
    <el-table-column prop="MEDIATYPE" label="付款方式" align="center"></el-table-column>
    <el-table-column prop="COMP_CASH" label="計(jì)算費(fèi)額" align="center"></el-table-column>
    <el-table-column prop="FACT_CASH" label="實(shí)收費(fèi)額" align="center"></el-table-column>
    <el-table-column label="操作" min-width="140px" align="center">
       <template slot-scope="scope">
          <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
          <el-button type="text" size="small">編輯</el-button>
       </template>
    </el-table-column>
</el-table>

上面這段代碼是一個(gè)element-ui中tabele表格的形式,這里表頭都是已經(jīng)固定的福压, 如果每個(gè)頁面都寫上這么一段掏秩, 不同的是表頭名字和字段,這樣子就有點(diǎn)重復(fù)荆姆,而且頁面的篇幅也就比較大了蒙幻,于是把這塊寫成一個(gè)組件, 每個(gè)頁面引入這個(gè)組件胆筒, 再傳入數(shù)據(jù)邮破。

1. 表格組件:

首先 table.vue 組件可以這樣寫:

<el-table :data="tableData"  border size="mini" fit highlight-current-row height="500" :row-style="rowStyle" @row-dblclick="rowDblclick"
      v-loading="loading"
      element-loading-text="拼命加載中"
      element-loading-spinner="el-icon-loading"
      element-loading-background="rgba(0, 0, 0, 0.3)">
      <el-table-column type="index" align="center" fixed></el-table-column>
      <!-- prop: 字段名name, label: 展示的名稱, fixed: 是否需要固定(left, right), minWidth: 設(shè)置列的最小寬度(不傳默認(rèn)值), oper: 是否有操作列
           oper.name: 操作列字段名稱, oper.clickFun: 操作列點(diǎn)擊事件, formatData: 格式化內(nèi)容 -->
      <el-table-column v-for="(th, key) in tableHeader"
        :key="key"
        :prop="th.prop"
        :label="th.label"
        :fixed="th.fixed"
        :min-width="th.minWidth" align="center">
          <!-- 加入template主要是有操作一欄诈豌, 操作一欄的內(nèi)容是相同的, 數(shù)據(jù)不是動態(tài)獲取的抒和,不過我這里操作一欄的名字定死了(oper表示是操作這一列矫渔,否則就不是) -->
          <template slot-scope="scope">
            <div v-if="th.oper">
              <el-button v-for="(o, key) in th.oper" :key="key" @click="o.clickFun(scope.row)" type="text" size="small">{{o.name}}</el-button>
            </div>
            <div v-else>
              <span v-if="!th.formatData">{{ scope.row[th.prop] }}</span>
              <span v-else>{{ scope.row[th.prop] | formatters(th.formatData) }}</span>
            </div>
          </template>
      </el-table-column>
</el-table>
// 這里是傳入的數(shù)據(jù) 
props: {
    tableData: {
      type: Array,
      default: function () {
        return []
      }
    },
    rowDblclick: {
      type: Function,
      default: (row, event, column) => { console.log('default: ' + row + '---' + event + '---' + column) }
    },
    tableHeader: {
      type: Array,
      default: function () {
        return []
      }
    },
    loading: {
      type: Boolean,
      default: false
    }
  },

然后在其他組件中就可以引入table組件, 將數(shù)據(jù)傳給table顯示

<table :tableData="tableData" :rowDblclick="rowDblclick" :tableHeader="tableHeader" :loading="loading"></table>

其中 tableData是表格中要顯示的數(shù)據(jù)內(nèi)容摧莽, 這個(gè)內(nèi)容我的是從后臺查詢出來的庙洼, rowDblclick 是雙擊一行做的操作,如果不需要可以刪除镊辕, tableHeader 是表頭顯示的數(shù)據(jù)油够, loading 是表格加載的loading方式, 默認(rèn)是沒有的

表頭數(shù)據(jù)格式如下: formatData 是表格里面的數(shù)據(jù)需要做處理的方法征懈, oper是操作列石咬,查看和編輯是兩個(gè)按鈕,handleClick和editClick點(diǎn)擊按鈕的方法受裹, 自行補(bǔ)充碌补。

export const tableHeader = [ // 表頭數(shù)據(jù)
  { prop: 'dhm', label: '時(shí)間', minWidth: '140px' },
  { prop: 'plazano', label: '編碼', minWidth: '100px' },
  { prop: 'plazano', label: '名稱', minWidth: '100px', formatData: val => store.getters.allPlazano2Map.get(val) },
  { prop: 'car_plate', label: '號碼' },
  { prop: 'card_no', label: '卡號', minWidth: "120px" },
  { prop: 'laneno', label: '數(shù)據(jù)類型', formatData: function(val) { return val.substr(2, 1) == '1' ? '出口' : '入口' } },
  { prop: 'staffname', label: '姓名', minWidth: '100px' },
  { prop: 'mediatype', label: '付款方式' },
  { prop: 'comp_cash', label: '計(jì)算費(fèi)額' },
  { prop: 'fact_cash', label: '實(shí)收費(fèi)額' },
  { prop: 'oper', label: '操作', fixed: 'right', minWidth: '140px',
    oper: [
      { name: '查看', clickFun: handleClick },
      { name: '編輯', clickFun: editClick }
    ]
  }
]

現(xiàn)在的代碼可能會報(bào)錯(cuò), 下面這處的代碼是在全局注冊了一個(gè)過濾器棉饶,如果不注冊就找不到這個(gè)方法就會報(bào)錯(cuò)厦章,所以還需要注冊一個(gè)全局過濾器,如果你不需要對數(shù)據(jù)做處理可以不要這個(gè)過濾器

image

2. 注冊全局過濾器照藻, 我的是這樣寫的袜啃, 先新建個(gè)文件 filter.js 然后在里面寫個(gè)方法, export 出去

export function formatters(val, format) {
   if (typeof (format) === 'function') {
     return format(val)
   } else return val
}

然后再在main.js中引入進(jìn)來注冊全局的過濾器:

import * as filters from './filters'
 
Object.keys(filters).forEach(key => {
   Vue.filter(key, filters[key])
})

這個(gè)在每個(gè)頁面就都可以使用 formatters 這個(gè)過濾器方法了幸缕, 不過具體的過濾方法是由 format 這個(gè)參數(shù)傳進(jìn)去的群发, 這里主要是因?yàn)椴煌臄?shù)據(jù)過濾的方法不一樣, 所以在表頭傳數(shù)據(jù)的時(shí)候就一并寫上處理數(shù)據(jù)的方法

image

如果很多地方都使用了同一個(gè)方法发乔, 可以將這個(gè)方法注冊成全局方法熟妓, 那么在每個(gè)頁面就可以直接使用該方法, 不用重復(fù)去寫栏尚。

3. 注冊全局方法

建立個(gè)js 文件(我的文件名為validate.js)起愈, 寫入該方法, 這里使用 exports.install 注冊全局方法译仗,掛載到vue原型上

exports.install = (Vue, options) => {
  Vue.prototype.validator = {
    lanenoTransf(val) { return val.substr(2, 1) == '1' ? '出口' : '入口' }
  }
}

然后在main.js中引入

import validator from '@/utils/validate'

Vue.use(validator)

最后頁面上就可以直接使用

{ prop: 'laneno', label: '數(shù)據(jù)類型', formatData: this.lanenoTransf },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抬虽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纵菌,更是在濱河造成了極大的恐慌阐污,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咱圆,死亡現(xiàn)場離奇詭異笛辟,居然都是意外死亡功氨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門隘膘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疑故,“玉大人,你說我怎么就攤上這事弯菊∽菔疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵管钳,是天一觀的道長钦铁。 經(jīng)常有香客問我,道長才漆,這世上最難降的妖魔是什么牛曹? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮醇滥,結(jié)果婚禮上黎比,老公的妹妹穿的比我還像新娘。我一直安慰自己鸳玩,他們只是感情好阅虫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著不跟,像睡著了一般颓帝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窝革,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天购城,我揣著相機(jī)與錄音,去河邊找鬼虐译。 笑死瘪板,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漆诽。 我是一名探鬼主播篷帅,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拴泌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惊橱,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚪腐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后税朴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體回季,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡家制,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泡一。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颤殴。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鼻忠,靈堂內(nèi)的尸體忽然破棺而出涵但,到底是詐尸還是另有隱情,我是刑警寧澤帖蔓,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布矮瘟,位于F島的核電站,受9級特大地震影響塑娇,放射性物質(zhì)發(fā)生泄漏澈侠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一埋酬、第九天 我趴在偏房一處隱蔽的房頂上張望哨啃。 院中可真熱鬧,春花似錦写妥、人聲如沸拳球。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醇坝。三九已至,卻和暖如春次坡,著一層夾襖步出監(jiān)牢的瞬間呼猪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工砸琅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宋距,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓症脂,卻偏偏與公主長得像谚赎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子诱篷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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