.waiting { background: yellow; }
.working { background: green; }
.completed { background: blue; }
const highlight = {
'Ожидание': 'waiting',
'Работа': 'working',
'Завершено': 'completed',
};
<el-table-column label="Процесс">
<template #default="{ row: { process } }">
<span :class="highlight[process]">{{ process }}</span>
</template>
</el-table-column>
const cellClassName = ({ column, row }) =>
column.property === 'process'
? (highlight[row.process] ?? '')
: '';
<el-table
:cell-class-name="cellClassName"
...
>
prefix-icon="calendar-icon"
const blocks = ref(Array.from({ length: 5 }, (_, i) => (-~i) ** 2));
const active = ref(0);
function next() {
active.value = (active.value + 1 + blocks.value.length) % blocks.value.length;
}
let intervalId = null;
onMounted(() => intervalId = setInterval(next, 500));
onUnmounted(() => clearInterval(intervalId));
<div
v-for="(n, i) in blocks"
v-text="n"
:class="[ 'box-item', { active: i === active } ]"
></div>
:nth-child
- не круто. Лучше сделать компонент, принимающий массив цветов и создающий блоки на его основе. Соответственно, вместо класса будет назначаться цвет фона напрямую, как-то так:<div
v-for="(n, i) in colors"
:style="{ backgroundColor: i === active ? n : '' }"
...
почему при изменении даты передаваемой в пропс не обновляется значение в самом компоненте таймера?
targetDate
при изменении props.date
. Нет, можете себя не утруждать - ничего такого у вас нет.targetDate
, рассчитываем дни-часы-минуты-секунды сразу на основе props.date
- так при изменении props.date
не придётся предпринимать никаких дополнительных телодвижений, всё посчитается как надо при следующем вызове updateCountdown
. Вот как-то так. .no-overflow {
overflow: hidden;
}
mounted() {
this.$watch(
() => this.isModalAddVisible || this.activeId,
val => document.body.classList.toggle('no-overflow', val),
{ immediate: true }
);
},
transition-group
. Вот так всё просто. v-model
, кого показывать в модальном окне - отправляйте наверх эту информацию вместе с событием. Свойство, управляющее видимостью модального окна - пусть оно вместо логического значения хранит id или объект или что там у вас должно показываться в окне, если не null
, значит открываем окно. Вот так всё просто.v-model
, конечно только на уровне таблицы, в строках всё по-прежнему.const addCard = (cardName) => { cards.value.push({ id: Date.now(), component: cardName, order: cards.value.length + 1, isRequired: false }) }
const components = {
ShortTextCard,
LongTextCard,
SingleQuestionCard,
MultiQuestionCard,
};
- @click="addCard(ShortTextCard)"
+ @click="addCard('ShortTextCard')"
- :is="card.component"
+ :is="components[card.component]"
<el-menu mode="horizontal" router :default-active="$route.name">
<el-menu-item
v-for="n in $router.getRoutes()"
v-text="n.name"
:index="n.name"
:route="n"
/>
</el-menu>
<router-view />
computed: {
activeRouteName: {
get() {
return this.$route.name;
},
set(name) {
this.$router.push({ name });
},
},
},
<router-view>
, но рендерить будем его только в активной вкладке. Вот такой получается говнокод:<el-tabs v-model="activeRouteName">
<el-tab-pane v-for="{ name: n } in $router.getRoutes()" :label="n" :name="n">
<router-view v-if="activeRouteName === n" />
</el-tab-pane>
</el-tabs>
handleEdit(row){
@click="handleEdit(scope.$index, scope.row)"
path:'/protocol_information/:id/edit/', params:{ id:row.id }
path: `/protocol_information/${row.id}/edit/`,
currentPriority: {
get() {
return this.filterPriorities;
},
set(val) {
this.$emit('update:filterPriorities', val);
},
},
currentStopsId: {
get() {
return this.filterStops;
},
set(val) {
this.$emit('update:filterStops', val);
},
},
v-for="(address, i) in form.addresses_to" :key="i"
всегда удаляется последний
Vue использует алгоритм, минимизирующий перемещение элементов
const formMeta = ref([
{
name: '...',
component: '...',
props: { ... },
},
...
]);
name
элементов formMeta
. Изначально можно сделать пустым: const formData = ref({});
. Можно явно задать начальные значения:const formData = ref({
имяПоля1: значение1,
имяПоля2: значение2,
...
});
const formData = ref(Object.fromEntries(formMeta.value.map(n => [
n.name,
n.defaultValue ?? null,
])));
formMeta
создаётся форма, через v-model
свойства formData
связываются с экземплярами компонентов:<form>
<div v-for="n in formMeta">
<component
:is="components[n.component]"
v-model="formData[n.name]"
v-bind="n.props"
/>
</div>
</form>