Хорошо, после нескольких часов мозгового штурма я нашел довольно хорошее решение. Я размещаю их здесь для других - надеюсь, это кому-нибудь поможет.
Значение, отображаемое в пользовательском столбце, может быть:
простая строка (проп)
отформатированная строка (безопасно, без HTML или компонентов, через оригинальный форматер)
пользовательское значение (HTML, компонент, также безопасно!)
Чтобы добиться этого, мне нужно было создать пользовательские компоненты форматирования, которые я помещаю в папку ie / TableFormatters /
Для этой цели есть простой функциональный компонент DatetimeFormatter, которые отображают дату и время со значком.
TableFormatters / DatetimeFormatter.vue
<template functional>
<span>
<i class="icon-date"></i> {{ props.row[props.column] }}
</span>
</template>
<script>
export default {
name: 'DatetimeFormatter',
}
</script>
Вот конфигурация столбцов:
import DatetimeFormatter from './TableFormatters/DatetimeFormatter'
// ...
data() {
return {
data: [/*...*/],
columns: [
name: {
label: 'Name',
},
state: {
label: 'State',
formatter: row => {
return 'State: '+row.state__label
}
},
created_at: {
label: 'Created at',
formatter: DatetimeFormatter
}
]
}
}
Теперь пришло время определить <el-table>
:
<el-table :data="data">
<el-table-column
v-for="(column, index) in columns"
:key="index"
:label="columns[column] ? columns[column].label : column"
:prop="column"
:formatter="typeof columns[column].formatter === 'function' ? columns[column].formatter : null">
<template #default="{row}" v-if="typeof columns[column].formatter !== 'function'">
<div v-if="columns[column].formatter"
:is="columns[column].formatter"
:row="row"
:column="column">
</div>
<template v-else>
{{ row[column] }}
</template>
</template>
</el-table-column>
</el-table>
Это работает как шарм. Что здесь происходит с форматером? Сначала мы проверяем, установлен ли форматер как function
. Если это так, собственный форматер <el-table-column>
берет на себя управление, потому что <template #default={row}>
не будет создан. В противном случае будет создан компонент форматирования (через атрибут :is
). Однако, если форматера нет, будет показано обычное значение для строки.