onKeyDown = e => {
if (e.key === 'Tab') {
e.preventDefault();
const
input = e.target,
str = input.value,
currPos = input.selectionStart,
wordEnd = str.slice(currPos).search(/[^\w]/);
let pos = str.slice(currPos + wordEnd).search(/[^\s]/);
if (pos) {
pos += currPos + wordEnd;
}
if (pos === currPos) {
pos = 0;
}
input.setSelectionRange(pos, pos);
}
}<input value={this.state.str} onKeyDown={this.onKeyDown} />
<div
*ngFor="let user of users"
[class]="active === user ? 'active' : ''"
(click)="active = user"
>
watch срабатывает тогда когда мне не надо
вотчер возвращает оба одинаковых значения
const random = arr => arr[Math.random() * arr.length | 0];// одно значение
const randomName = random(arr_names);
// или сразу несколько
const randomNames = Array.from(
{ length: 5 },
random.bind(null, arr_names)
);
// работать можно не только с массивами, но и,
// например, со строками, NodeList или HTMLCollection
const randomChar = random('abcdefg');
const randomSpan = random(document.querySelectorAll('span'));
const randomImage = random(document.images);
$('#text-column').prop('scrollHeight')
// или
$('#text-column').get(0).scrollHeight
// или
$('#text-column')[0].scrollHeight
const containerSelector = '.va-city-list';
const key = 'city';
const attr = `data-${key}`;
const attrSelector = `[${attr}]`;
const itemSelector = `${containerSelector} ${attrSelector}`;const getVal = el => $(el).data(key);
// или
const getVal = el => $(el).attr(attr);
// или
const getVal = el => el.dataset[key];
// или
const getVal = el => el.getAttribute(attr);
// или
const getVal = el => el.attributes[attr].value;$(itemSelector).click(e => console.log(getVal(e.currentTarget)));
// или
document.querySelectorAll(itemSelector).forEach(function(n) {
n.addEventListener('click', this);
}, e => console.log(getVal(e.currentTarget)));$(containerSelector).on('click', attrSelector, function() {
console.log(getVal(this));
});
// или
document.querySelector(containerSelector).addEventListener('click', e => {
const el = e.target.closest(itemSelector);
if (el) {
console.log(getVal(el));
}
});
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.PropTypeshas moved into a different package since React v15.5. Please use the prop-types library instead.
.modal.opened {
display: block;
}const modal = document.querySelector('.modal');
const close = modal.querySelector('.close');
const toggleModal = state => modal.classList.toggle('opened', state);
const buttonSelector = 'button';document.addEventListener('click', ({ target: t }) => {
if (t === modal || t === close) {
toggleModal(false);
} else if (t.matches(buttonSelector)) {
toggleModal(true);
}
});[ modal, close ].forEach(function(n) {
n.addEventListener('click', this);
}, e => e.target === e.currentTarget && toggleModal(false));
document.querySelectorAll(buttonSelector).forEach(function(n) {
n.addEventListener('click', this);
}, toggleModal.bind(null, true));
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