先看下面我的el-table二次封装相关代码。
index.vue
<el-table
ref="table"
v-loading="searching"
:data="pagedData"
:border="border"
stripe
highlight-current-row
v-bind="$attrs"
v-on="$listeners"
@selection-change="handleSelectionChange"
>
<template v-for="(item, index) in columnList">
<el-table-column
v-if="item.slotScope"
:key="item.prop + index"
v-bind="item"
:label="$t(item.label)"
>
<template slot-scope="scope">
<slot
:name="item.prop"
v-bind="scope"
>
{{ "-" }}
</slot>
</template>
</el-table-column>
<el-table-column
v-else-if="item.selection"
:key="`selection${index}`"
type="selection"
:width="item.width || 50"
:align="item.align || 'center'"
/>
<column
v-else
:key="item.prop + index"
:column="item"
/>
</template>
</el-table>
column.vue
<template>
<el-table-column
center
v-bind="column"
v-on="$listeners"
:label="$t(column.label)"
>
<!-- <template
slot="header"
slot-scope="scope"
>
<render
v-if="column.renderHeader"
:scope="scope"
:render="column.renderHeader"
/>
<span v-else>{{ scope.column.label }}</span>
</template> -->
<template slot-scope="scope">
<render
v-if="column.render"
:scope="scope"
:render="column.render"
/>
<!-- 嵌套表格 -->
<template v-else-if="column.children">
<column
v-for="col in column.children"
:key="col.prop"
:column="col"
/>
</template>
</template>
</el-table-column>
</template>
然后在页面中使用:
<EleTable
id="eleTable"
ref="eleTable"
:row-key="getRowKeys"
:column-list="columnList"
:remote-method="getTableData"
@page-change="handlePageChange"
@sort-change="handleSortChange"
@selection-change="handleSelectionChange"
>
<template v-slot:vip_state="{ row }">
<span>{{ filterVal('vip_state', row.vip_state) }}</span>
</template>
<template v-slot:appeal_type="{ row }">
<span>{{ filterCasVal('appeal_type',row.appeal_type) }}</span>
</template>
<template v-slot:priority="{ row }">
<span>{{ filterVal('priority',row.priority) }}</span>
</template>
<template v-slot:appeal_stage="{ row }">
<span>{{ filterVal('appeal_stage',row.appeal_stage) }}</span>
</template>
<template v-slot:maintain_mode="{ row }">
<span>{{ filterVal('maintain_mode',row.maintain_mode) }}</span>
</template>
<template v-slot:language="{ row }">
<span>{{ filterVal('lang',row.language) }}</span>
</template>
<template v-slot:comment_counter="{ row }">
<span>{{ filterComment(row.comment_counter) }}</span>
</template>
<template v-slot:task_id="{ row }">
<span>{{ row.task_id }}</span>
<el-badge class="task-badge" :value="row.over_process ? $t('text_overtime') : ''">
</el-badge>
</template>
</EleTable>
但是这样使用中间会有很多插槽,而且插槽内还有一些过滤方法,感觉封装还是没有减少代码量,一时不知道该如何解决这种情况,希望大家帮我出出主意。
你看看,我这个封装