<select v-model="user.name">
<option value="">Выбрать</option>
<option v-for="o in getOptions(index)" :value="o.value" v-text="o.label"></option>
</select>getOptions(index) {
return this.options.filter(o => this.users.every((u, i) => u.name !== o.value || i === index));
},
<span class="prev" data-step="-1">Prev</span>
<span class="next" data-step="+1">Next</span>eq позволяет указывать отрицательные индексы, которые используются для отсчёта позиции элемента начиная с конца; в случае чистого js надо будет добавить к сумме количество элементов, чтобы потенциальное отрицательное значение стало положительным, и при этом не изменился остаток от деления.const itemSelector = 'li';
const buttonSelector = '[data-step]';
const activeClass = 'active';$(buttonSelector).click(function() {
const { step } = this.dataset;
const $items = $(itemSelector);
const $active = $items.filter(`.${activeClass}`);
$active.removeClass(activeClass);
$items.eq(($active.index() + +step) % $items.length).addClass(activeClass);
});
// или
const items = document.querySelectorAll(itemSelector);
let index = 0;
document.querySelectorAll(buttonSelector).forEach(n => {
n.addEventListener('click', onClick);
});
function onClick({ currentTarget: { dataset: { step } } }) {
items[index].classList.remove(activeClass);
index = (index + items.length + +step) % items.length;
items[index].classList.add(activeClass);
}
.xxx {
background: silver;
display: inline-flex;
justify-content: center;
align-items: center;
font-size: 24px;
padding: 0.3em 0.6em;
position: relative;
}
.xxx::before {
content: "";
width: 1em;
height: 1em;
left: -0.2em;
top: -0.2em;
background: orange;
position: absolute;
z-index: -1;
}
watch: {
'$route.params.id': {
immediate: true,
handler() {
/*
* здесь идёт выполнение каких-то действий,
* направленных на обновление компонента - запрос данных, например...
* тут уж вам виднее, что это должно быть
*/
},
},
},
Math.min или перебираем вручную и сравниваем):const minDigit = num =>
Number.isFinite(num)
? Math.min(...`${num}`.replace(/\D/g, ''))
: null;
// или
const minDigit = num =>
(String(num).match(/\d/g) || []).reduce((min, n) => {
return min === null || n < min ? +n : min;
}, null);minDigit(1) // 1
minDigit(759486394) // 3
minDigit(-56.209) // 0
minDigit(Infinity) // null
minDigit(NaN) // null
minDigit('hello, world!!') // null
запрос на сервер отправляется два раза, хотя есть переменная, которая это блокирует
есть переменная end, статус которой проверяется постоянно
this.end = false в finally (однако, само по себе это не гарантирует, что вы не сможете отправлять следующий запрос до окончания предыдущего).
li на его же текст:$('.breadcrumb').children().last().text((i, text) => text);
// или
document.querySelector('.breadcrumb').lastElementChild.innerText += '';a есть элементы, они не будут удалены):$('.breadcrumb > :last > *').replaceWith((i, html) => html);
// или
(el => el.replaceWith(...el.childNodes))
(document.querySelector('.breadcrumb > :last-child > *'));
const containerSelector = 'ul';
const buttonSelector = 'a';
const elementSelector = '.drop';const $el = $(elementSelector);
$(containerSelector).on('click', buttonSelector, function(e) {
$(e.currentTarget).after($el);
// или
$(this).parent().append($el);
// или
$el.insertAfter(this);
});const el = document.querySelector(elementSelector);
document.querySelector(containerSelector).addEventListener('click', ({ target: t }) => {
if (t = t.closest(buttonSelector)) {
t.after(el);
// или
t.insertAdjacentElement('afterend', el);
// или
t.parentNode.insertBefore(el, t.nextSibling);
// или
t.parentNode.append(el);
// или
t.parentNode.appendChild(el);
}
});
<span class="b-span" :class="{ 'b-span_active': active }">hello, world!!</span>
<button @click="onClick">click me</button>data: () => ({
active: false,
time: 300,
}),
methods: {
onClick() {
setTimeout(() => this.active = true, this.time);
},
},
fade: true из настроек слайдера, из обработчиков клика - второй параметр из вызова slickGoTo (это который тоже true). Кстати, а зачем отдельный обработчик каждой кнопке? - можно повесить один общий:const $slider = $('#slider').slick({
slidesToShow: 1,
slidesToScroll: 1,
adaptiveHeight: true,
dots: false,
prevArrow: false,
nextArrow: false,
speed: 900,
});
const $buttons = $('button').click(function() {
$slider.slick('slickGoTo', $buttons.index(this));
});
var pos = this.getAttribute('data-goto'); myMap.panTo(pos, {
data-goto="[59.938531, 30.313497]"this.getAttribute('data-goto') ---> JSON.parse(this.dataset.goto)
item.pricethis.cartItems.reduce((sum, n) => sum + n.price, 0)
words.replace(index, 1, word.charAt(0));replace у массивов нет. Есть splice.как реализовали бы данную задачу вы?
const newWords = words.flatMap(RegExp.prototype.exec.bind(/.{0,1}/));
// или
const newWords = [];
for (const n of words) {
newWords.push(n[0] || '');
}
// или
const newWords = (function get(i, n = words[i]) {
return n != null ? [ n.slice(0, 1), ...get(-~i) ] : [];
})(0);words.forEach(([ n = '' ], i, a) => a[i] = n);
// или
words.splice(0, words.length, ...words.map(n => n.charAt()));
// или
for (let i = 0; i < words.length; i++) {
words[i] = words[i].replace(/(?<=.).+/, '');
}
Вью держит значение индекса, почему он не может выполнить такую простую операцию?
:delay="i * 0.5"? - попробуйте, вдруг подойдёт.
проблема в том, что видимо когда по первому запросу поле name заполняется, соответственно поле name_changed становится равно true и кнопка сохранения получается изначально доступна
watch:{ name(val, old){ this.name_changed = true; } }
this.$watch('name', () => this.name_changed = true);
Смотрел в документации angular material, но не нашёл такой функции. Это странно, потому что такая функция скорее всего есть в любой подобной таблице.
<span (click)="item.showTags = !item.showTags">Теги:</span>
<div *ngIf="item.showTags">
const $form = $('.order__form-contacts').on('change', '[name="legal-status"]', e => {
$form.find('.order__form-file')[e.target.value === '2' ? 'slideDown' : 'slideUp']();
});