const keyboard = [
'abcde123',
'fghij456',
'klmno789',
'pqrst.@0',
'uvwxyz_/',
].reduce((acc, [...row], iRow) => {
row.forEach((key, iCol) => acc[key] = [ iRow, iCol ]);
return acc;
}, {});
function tvRemote(word) {
let steps = word.length;
let prev = [ 0, 0 ];
for (const n of word) {
const curr = keyboard[n];
steps += Math.abs(prev[0] - curr[0]) + Math.abs(prev[1] - curr[1]);
prev = curr;
}
return steps;
}
Решение через фунцию-валидатор я видел, но мне оно не кажется оптимальным для объектов. По крайней мере в React это намного короче и наляднее.
Возможно во Vue есть аналог?
"react": "^16.4.0",
import React, { Component, PropTypes } from 'react';
Note:React.PropTypes
has moved into a different package since React v15.5. Please use the prop-types library instead.
.close
- наоборот, закрыть.const modal = document.querySelector('.modal');
const close = modal.querySelector('.close');
document.addEventListener('click', function(e) {
if (e.target === modal || e.target === close) {
modal.style.display = 'none';
}
if (e.target.tagName === 'BUTTON') {
modal.style.display = 'block';
}
});
bus.$off('selectedCompanies')
Есть 2 независимы страницы.
('' + m)
или `${m}`
или String(m)
.'[object Object]'
) - об этом вы подумали? Нет, точно надо проверять, что за значение:return this.sortedTokens_VMP.filter(n => Object.values(n).some(m => {
if (m instanceof Object) {
// проверяем объект, возможно, стоит сделать какую-нибудь рекурсивную функцию под это дело
} else if (typeof m === 'number') {
// а вдруг числа надо обрабатывать иначе, чем строки
} else {
// какая-то дефолтная проверка значения
}
}));
const includes = (obj, str) => Object
.values(obj)
.some(n => n instanceof Object
? includes(n, str)
: `${n}`.toLowerCase().includes(str)
);
filteredTokens_VMP() {
const s = this.search.toLowerCase();
return this.sortedTokens_VMP.filter(n => includes(n, s));
},
const getNested = (root, path) => path
.split('.')
.reduce((p, c) => p != null ? p[c] : p, root);
sortedTokens_VMP() {
const reverse = this.sort.reverse ? -1 : 1;
return this.tokens_VMP
.map(n => [ getNested(n, this.sort.key), n ])
.sort(([a], [b]) => reverse * (
a == null ? Infinity :
b == null ? -Infinity :
a < b ? -1 :
a > b ? 1 :
0
))
.map(n => n[1]);
},
вот пример - https://codepen.io/pespantelis/pen/ojwgPB?editors=1010,
но здесь используется версия vue/0.12.16/vue.min.js
let count = null;
while (1) {
count = prompt('Введите количество колонок для таблицы умножения') | 0;
if (count > 0) {
break;
}
alert('Введите корректное число');
}
lat + x != 11
lon + y != 11
я понял, что нет экшена. Вопрос в том, что он есть )
colorComponents: {
r: 0,
g: 0,
b: 0,
},
<div v-for="(v, k) in colorComponents">
{{ k }}
<input v-model="colorComponents[k]" type="range" min="0" max="255">
{{ v }}
</div>
<div :style="style">
computed: {
style() {
return {
'background-color': `rgb(${Object.values(this.colorComponents).join(',')})`,
};
},
},
const itemSelector = '.item';
const activeClass = 'active';
const maxActive = 3;
const onMaxActiveClick = () => alert(`больше ${maxActive} нельзя`);
// делегирование, назначаем обработчик клика один раз для всех элементов
document.addEventListener('click', function(e) {
const item = e.target.closest(itemSelector);
if (item) {
const active = document.querySelectorAll(`${itemSelector}.${activeClass}`);
if (active.length < maxActive || item.classList.contains(activeClass)) {
item.classList.toggle(activeClass);
} else {
onMaxActiveClick();
}
}
});
// или, назначаем обработчик клика каждому элементу индивидуально
let activeCount = 0;
for (const n of document.querySelectorAll(itemSelector)) {
n.addEventListener('click', onClick);
activeCount += n.classList.contains(activeClass);
}
function onClick({ currentTarget: item }) {
if (activeCount < maxActive || item.classList.contains(activeClass)) {
activeCount += item.classList.toggle(activeClass) ? 1 : -1;
} else {
onMaxActiveClick();
}
}
А можно ли как то прокинуть это событие далее(всплытие), что бы можно было его прослушать на любом компоненте-предке, в том числе и на корневом?
В чем ошибка?