Как заставить элемент-класс работать в v-data-table (чтобы я мог раскрасить строку)?
- Я пытаюсь раскрасить строку в таблице v-данных на основе значения одного из полей в таблице.
- Я пробовал все решения, предлагаемые здесь и в других местах, и пробовал еще несколько.
- Я использую текущую версию Vuetify (2.3.9)
- Я все перезагрузил, очистил кеш браузера, файлы cookie и т. Д.
- Пробовал со слотами и без них.
- Мое приложение завернуто в v-app
== без слотов ==
<v-data-table
:items-per-page="50"
:headers="headers"
:items="jobs"
:height="600"
:search="search"
:hide-default-footer="true"
:item-key="jobs.JobID"
:item-class="row_class"
mobile-breakpoint="300"
no-data-text="No jobs today!"
dense
>
</v-data-table>
methods: {
row_class (item) { return "jobGreen" }
}
.jobGreen {
background-color: lightgreen;
}
Результат:
- Класс не применяется.
- Использование item-class="jobGreen" (т. Е. Не реагирующее) также не работает.
- применение класса jobGreen к таблице v-данных (т.е. class='jobGreen') работает должным образом
== используя слот ==
(упрощенный)
<v-data-table>
<template v-slot:item="{item}">
<tr :class="row_class(item)">
<td>
{{ item.JobNumber }}
</td>
</tr>
</template>
</v-data-table>
methods: {
row_class (item) { return "jobGreen" }
}
Хорошо, это работает, но к первой строке таблицы никогда не применялся класс! Сортировка таблицы таким образом, чтобы наверху была другая запись, ничего не меняет, так что это не имеет ничего общего с данными. Метод вызывается для каждой строки таблицы.
3 ответа
Попробуйте это (это единственное, что у меня сработало, но оно нарушает некоторые базовые функции таблиц):
<template v-slot:body="{ items }">
<tbody>
<tr :class="row_class(item)" v-for="item in items" :key="item.<name>">
<td class="text-start">{{ item.<name> }}</td>
</tr>
</tbody>
</template>
У меня была такая же проблема! Вот что у меня работает с not-working :item-class :(я хотел отформатировать только одну defRow)
<template>
<v-data-table
:headers="headersForTable"
:items="chosenTableData"
>
<template v-slot:item="{item}">
<tr :class="isDefRow(item) ? 'defRow' : ''" @click="rowInTableClicked(item) >
<td v-for="(head,i) in headersForTable" :key="i">
{{ item[head.value] }}
</td>
</tr>
</template>
</v-data-table>
</template>
<script lang="ts">
isDefRow(row: any): boolean {
// ...
}
get headersForTable() {
// returns the array of header objects
}
get chosenTableData() {
// returns the data array
}
</script>
<style scoped>
.defRow {
font-weight: bold;
}
</style>
Не то
@click="rowInTableClicked(item)
теперь ведет себя так же, как и в противном случае
@click:row="rowInTableClicked"
бы!
:item-class должен делать то, что вам нужно. Вы можете использовать :item-class, чтобы указать функцию JavaScript, которая будет возвращать имя применяемого класса.
Я прикрепил ссылку jsfiddle с простым рабочим образцом, используя :item-class.
https://jsfiddle.net/kug6xeLo/15/
В качестве альтернативы вы можете использовать класс элементов, чтобы указать свойство данных, которые поддерживают эту конкретную строку. Данные в данной строке для указанного свойства будут указывать имя класса CSS.
В ходе тестирования я обнаружил, что это не сработает, если указанный класс css находится в стиле с ограниченной областью действия.
<style scoped>
Не работал в моем тестировании.
<style>
Работал в моем тестировании.
Разметка:
<v-data-table
:headers="headers"
:items="contacts"
:item-class="isHighlighted"
></v-data-table>
Скрипт:
methods: {
isHighlighted(item) {
return item.firstName === "Joe" ? "selectedColor" : "";
}
},
CSS
.selectedColor {
background-color: blue;
}