часто используемыйelement-uiтоварищи должны быть правыel-table
Компонент очень знакомый, обычно он выглядит так:
<template>
<el-table :data="tableData">
<el-table-column
prop="date"
label="日期">
</el-table-column>
<el-table-column
prop="name"
label="姓名">
</el-table-column>
<el-table-column
prop="address"
label="地址">
</el-table-column>
</el-table>
</template>
<script>
export default {
data () {
return {
tableData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}]
}
}
}
</script>
Приведенный выше код очень правильный, но мне всегда кажется, что чего-то не хватает?
Да, в шаблонеel-table-column
почти идентичный, повторяющийся
Используйте v-for для оптимизации столбца el-table в шаблонах
Используется следующееv-for
version, передавая каждый столбец как элемент конфигурации:
<template>
<el-table :data="tableData">
<el-table-column
v-for="{ prop, label } in colConfigs"
:key="prop"
:prop="prop"
:label="label">
</el-table-column>
</el-table>
</template>
<script>
export default {
data () {
this.colConfigs = [
{ prop: 'date', label: '日期' },
{ prop: 'name', label: '姓名' },
{ prop: 'address', label: '地址' }
]
return {
tableData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}]
}
}
}
</script>
Преимущество этого в том, что если вы хотите добавить еще один столбец, вам не нужно перемещатьtemplate
, простоthis.colConfigs
Добавьте элемент конфигурации в этот массив{ prop: 'xxx', label: 'xxx' }
Только что
Хотя добавить конфигурацию таким образом очень просто, и масштабируемость лучше, чем писать шаблон непосредственно перед, но если у меня есть колонка для рендеринга нескольких кнопок, вышеописанный способ не сработает
Другими словами, нам нужны простые атрибуты, которые можно отображать напрямую, добавляя элемент конфигурации, а также мы надеемся, что сложный рендеринг можно будет прописать в шаблоне.Как этого добиться?
Умело используйте слот, чтобы инкапсулировать слой для el-table
Давайте сначала посмотрим на упакованные компонентыmy-table
:
// my-table.vue
<template>
<el-table :data="data">
<template v-for="colConfig in colConfigs">
<slot v-if="colConfig.slot" :name="colConfig.slot">
<el-table-column v-bind="colConfig"></el-table-column>
</template>
</el-table>
</template>
<script>
export default {
props: ['colConfigs', 'data']
}
</script>
Этот пакет на самом делеcolConfigs
какprop
Входящий, но отличие от вышеприведенного примера в том, что есть еще один элемент конфигурацииslot
Атрибут, через этот атрибут мы можем написать в шаблоне как начало статьи, использование следующее:
<template>
<my-table
:data="tableData"
:col-configs="colConfigs">
<!-- slot="opt" 不能省略,需要与下面配置项中的对应 -->
<el-table-column slot="opt">
<el-button size="mini" slot-scope="{ row }">查看</el-button>
</el-table-column>
</my-table>
</template>
<script>
export default {
data () {
this.colConfigs = [
{ prop: 'date', label: '日期' },
{ prop: 'name', label: '姓名' },
{ prop: 'address', label: '地址' },
// 模版中的元素需要对应的有 slot="opt" 属性
{ slot: 'opt' }
]
return {
tableData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}]
}
}
}
</script>
Теперь мы хотим добавить столбец, просто добавьте элемент конфигурации или добавьте слот, отлично~
Подождите, предположим, у меня есть несколько столбцов в таблице, которые сложнее отобразить, и все эти столбцы похожи, например:
<template>
<my-table
:data="tableData"
:col-configs="colConfigs">
<el-table-column label="变化" slot="change">
<span :slot-scope="row">
{{ row['change'] > 0 ? '+' + row['change']: row['change'] }}
</span>
</el-table-column>
<el-table-column label="趋势" slot="trend">
<span :slot-scope="row">
{{ row['trend'] > 0 ? '+' + row['trend']: row['trend'] }}
</span>
</el-table-column>
</my-table>
</template>
Снова переписываем шаблон...
Используйте :is="компонент"
Мы можем добавить еще одно свойство к элементу конфигурацииcomponent
, пользователь может указатьcomponent
атрибут для специальной обработки столбца, реализованный следующим образом:
// my-table.vue
<template>
<el-table :data="data">
<template v-for="colConfig in colConfigs">
<slot v-if="colConfig.slot" :name="colConfig.slot">
<component
v-else-if="colConfig.component"
:is="config.component"
:col-config="colConfig">
</component>
<el-table-column v-else v-bind="colConfig"></el-table-column>
</template>
</el-table>
</template>
<script>
export default {
props: ['colConfigs', 'data']
}
</script>
Затем приведенный выше пример можно переписать как:
<template>
<my-table
:data="tableData"
:col-configs="colConfigs">
</my-table>
</template>
<script>
const PrefixPlusText = {
props: ['colConfig'],
template: `
<el-table-column :label="colConfig.label">
<span :slot-scope="{ row }">
{{ parseInt(row[colConfig.prop]) > 0 ? '+' + row[colConfig.prop] : row[colConfig.prop] }}
</span>
</el-table-column>
`
}
export default {
data () {
this.colConfigs = [
{ prop: 'change', label: '变化' component: PrefixPlusText },
{ prop: 'name', label: '趋势', component: PrefixPlusText },
]
return {
tableData: [{
change: '12%',
trend: '10%
}, {
change: '-12%',
trend: '-10%'
}]
}
}
}
</script>
Суммировать
В качестве компонента отображения данных таблица часто используется в повседневной разработке.В этой статье вы можете увидеть комбинациюvue
изslot/component
Функции, сделать слой инкапсуляции, может значительно упростить использование таблицы, большую часть времени нужно только написать свойство конфигурации.
Наконец, дайте небольшойdemo