const appSingle = new Vue({
.planslider-enter-from {
.planslider-leave-from {
<transition-group tag="div" class="single-estate-planimetry__slider" name="planslider" appear> <div v-if="index === currentPlanimetry" :data-index="index" class="single-estate__descr-img" v-for="(item, index) in planimetry" :key="item.nome">
transition-group
на transition
. Убрать v-if
и v-for
. Сделать вычисляемое свойство, представляющее текущий элемент. transition
на transition-group
, сдвигаем его влево на ширину слайда; показываем слайды не с активного, а с предшествующего активному; чтобы не видеть, как первый слайд, ставший последним, уезжает в конец, задаём слайдам z-index
. Вот говнокод. <div class="error" v-if="$v.forms.additional.$dirty && $v.forms.additional.$invalid">
additional: this.visible ? { required } : {},
data() {
return {
selectedValue: this.initialValue,
};
},
set(val) {
this.$emit('input', val);
},
mounted() { console.log(this.props)
onClick : () => { console.log(this.props);
<transition-group name="slide" tag="div" class="table-body">
<div class="table-tr" v-for="item in items" :key="item.id">
<div class="table-td">{{ item.id }}</div>
<div class="table-td">{{ item.user }}</div>
</div>
</transition-group>
.table-tr {
transition: 0.5s;
}
.table-body {
overflow: hidden;
}
.slide-enter-from {
transform: translateY(-100%);
}
.slide-enter-to {
transform: translateY(0);
}
const handlers = new Map();
function updateHandler(el, binding) {
el.removeEventListener('input', handlers.get(el));
const handler = () => {
const value = el.value.replace(/\D/g, '').slice(0, binding.value);
if (value !== el.value) {
el.value = value;
el.dispatchEvent(new Event('input'));
}
};
handler();
handlers.set(el, handler);
el.addEventListener('input', handler);
}
Vue.directive('maxlen', {
bind: updateHandler,
update: updateHandler,
unbind(el) {
el.removeEventListener('input', handlers.get(el));
handlers.delete(el);
},
});
<input type="number" v-maxlen="2">
methods: {
onCellClick(item) {
console.log(item.digit);
},
<td @click="onCellClick(item)">
props
, используете v-bind
для привязки функции к экземпляру дочернего компонента.<button @click="$emit('click')"
.<component @click="onClick"
.$listeners
, так что вместо $emit('click')
или (если надо передать родителю какие-то данные) $emit('click', аргумент)
можно (но не нужно) написать $listeners.click
или $listeners.click(аргумент)
. expanded-item
:<v-data-table
:headers="mainTableHeaders"
:items="mainTableItems"
item-key="mainTableItemKey"
show-expand
>
<template #expanded-item="{ headers, item }">
<td :colspan="headers.length">
<v-data-table
:headers="nestedTableHeaders"
:items="item.nestedTableItems"
></v-data-table>
</td>
</template>
</v-data-table>
при клике на строчку
show-expand
, добавляем обработчик клика, где отображение дополнительного контента будет переключаться вручную:methods: {
onRowClick(item, row) {
row.expand(!row.isExpanded);
},
...
<v-data-table
@click:row="onRowClick"
...
v-text-field
подобной возможности не предоставляет, так что придётся закостылить.<v-text-field @click.native="onClick">
methods: {
onClick({ target: t }) {
if (
t.classList.contains('v-messages__message') &&
t.closest('.v-messages.error--text')
) {
// ну да, кликнули по сообщению об ошибке
}
},
},
v-model
, обновил данные в компоненте; устанавливаете отформатированное значение. Для предотвращения рекурсивной обработки событий input проверяете isTrusted:function updateValue(el) {
el.value = el.value, из которого удалено всё, кроме цифр;
el.dispatchEvent(new Event('input'));
el.value = форматированное значение el.value;
}
function onInput(e) {
if (e.isTrusted) {
updateValue(e.target);
}
}
Vue.directive('number', {
bind(el) {
el.addEventListener('input', onInput);
updateValue(el);
},
update(el) {
updateValue(el);
},
unbind(el) {
el.removeEventListener('input', onInput);
},
});