tableValues(element);
element.children
/element.childNodes
.document.querySelector('form').childNodes
children
вместо childNodes
. Ну и погуглите, в чём между ними разница.if (element.nodeType == 1 && element.nodeName == 'INPUT' || element.nodeName == 'SELECT') {
nodeType
лишняя. Кроме того, вам не помешает разобраться с приоритетом выполнения операторов - nodeType
вы тут проверяете только для input'а.let result = [];
const getValues = el =>
el instanceof Element
? [ 'INPUT', 'SELECT' ].includes(el.tagName)
? [ el.value ]
: [...el.children].flatMap(getValues)
: [];
// или
const getValues = el =>
[ 'INPUT', 'SELECT' ].includes(el?.tagName)
? [ el.value ]
: [].flatMap.call(el.children ?? [], getValues);
const values = getValues(document.querySelector('form'));
const values = Array.from(document.querySelector('form').elements, n => n.value);
const getFromDOMNodes = (node, test, getVal) =>
node instanceof Node
? Array.prototype.reduce.call(
node.childNodes,
(acc, n) => (acc.push(...getFromDOMNodes(n, test, getVal)), acc),
test(node) ? [ getVal(node) ] : []
)
: [];
// или
function getFromDOMNodes(root, test, getVal) {
const tw = document.createTreeWalker(root);
const result = [];
for (let n = null; n = tw.nextNode(); test(n) && result.push(getVal(n))) ;
return result;
}
const values = getFromDOMNodes(
document.querySelector('form'),
node => [ 'INPUT', 'SELECT' ].includes(node.nodeName),
node => node.value
);
<div className={classes.bar1}></div>
bar1
есть, это хорошо. А почему нет bar
? Плохо....Object.fromEntries(Array.from({ length: 12 }, (_, i) => [
`bar${i + 1}`,
{
transform: `rotate(${i * 30}deg) translate(0, -130%)`,
animationDelay: `${i * 0.1 - 1.2}s`,
},
])),
<div className={`${classes.loader} js--loader`}>
{Array.from(
{ length: 12 },
(_, i) => <div className={`${classes.bar} ${classes[`bar${i + 1}`]}`}></div>
)}
</div>
data
по значениям свойства type
- нет, никак? А компонент аккордеона отдельный сделать - тоже никак? Предлагаю всё-таки подумать в эту сторону. Ну а пока - говнокод:opened = {}
get currentTabItems() {
return this.data.filter(n => n.type === this.tabs[this.activeTab].toLowerCase());
}
<app-navbar [tabs]="tabs" [(activeTab)]="activeTab"></app-navbar>
<app-faq
*ngFor="let item of currentTabItems;"
[item]="item"
[opened]="opened[item.type] === item"
(toggle)="opened[item.type] = $event ? item : null"
></app-faq>
@Input() opened;
@Output() toggle = new EventEmitter();
<div class="faq__box" [class.isOpen]="opened" (click)="toggle.emit(!opened)">
проблема в том, что один из маркеров уезжает на реку Нева
iconImageOffset
- она поможет исправить ситуацию. from collections import Counter
count = Counter(s)
sorted_count = sorted(count.items(), key=lambda n: n[1], reverse=True)
for n in sorted_count[:3]:
print(f'"{n[0]}" - {n[1]}')
data: () => ({
value: 1,
step: 0.25,
}),
methods: {
updateValue(up) {
const { value, step } = this;
const rounded = Math[up ? 'floor' : 'ceil'](value / step) * step;
this.value = rounded + step * (up ? 1 : -1);
},
},
<input v-model.number="value">
<button @click="updateValue(0)">-</button>
<button @click="updateValue(1)">+</button>
Возникает проблема, что нужно нажать 2 раза на подсказку, чтобы она исчезла.
const onChange = ({ target: { value } }) => {
setVal(value);
setPrintVariables(value.length > 1
? arrayVariables.filter(n => n.includes(value))
: []
);
};
<input value={val} onChange={onChange} />
.
здесь должны быть $
:'&:checked + .todo-item__span::before'
'&:checked + .todo-item__span::after'
'content': '',
'content': '""',
'todo-item--checked': { 'border': '2px solid #2196f3', ' box-shadow': '0 0 10px 3px #2196f3', },
'todo-item--checked .todo-item__description': { 'color': '#6495EDFF', },
'todo-item--checked': {
'border': '2px solid #2196f3',
'box-shadow': '0 0 10px 3px #2196f3',
'& $todo-item__description': {
'color': '#6495EDFF',
},
},
<div className={` ${classes['todo-item__description']} ${classes['todo-item--checked .todo-item__description']} `}>
<div className={classes['todo-item__description']}>
Consistent useEffect timing: React now always synchronously flushes effect functions if the update was triggered during a discrete user input event such as a click or a keydown event.
document
, дальше событие клика по кнопке продолжило всплывать и попало в только что установленный обработчик.При добавлении задержки, данная проблема уходит
document.addEventListener('click', handleOutsideClick, true);
return () => document.removeEventListener('click', handleOutsideClick, true);
const components = [
[ 'Day', Components1 ],
[ 'Week', Components2 ],
[ 'Month', Components3 ],
[ 'Year', Components4 ],
];
const [ active, setActive ] = useState(-1);
const Component = components[active]?.[1];
const onClick = e => setActive(+e.target.dataset.index);
{components.map((n, i) => <button data-index={i} onClick={onClick}>{n[0]}</button>)}
{Component && <Component />}
watch(values, (newValues, oldValues) => {
const addedValue = newValues.find(n => !oldValues.includes(n));
if (addedValue) {
const findAncestorValues = (arr, val, values = []) =>
(Array.isArray(arr) ? arr : []).reduce((found, n) => {
if (!found) {
values.push(n.value);
found = n.value === val ? [...values] : findAncestorValues(n.children, val, values);
values.pop();
}
return found;
}, null);
values.value = [...new Set([ ...values.value, ...findAncestorValues(data, addedValue) ])];
}
});
watch
необходимо слушать у el-tree-select
событие обновления массива выбранных значений. При этом, чтобы иметь доступ к предыдущей версии этого массива, надо будет немного поработать руками. Как-то так:const oldValues = ref([]);
function onUpdate() {
const addedValue = values.value.find(n => !oldValues.value.includes(n));
if (addedValue) {
// тут всё по-прежнему
}
oldValues.value = values.value;
}
<el-tree-select
@update:modelValue="onUpdate"
...
ключ уже есть
undefined
- это не ключ. Откуда берётся undefined
? Из-за отсутствия свойства id
, значение которого должно быть ключом. Как оно пропадает? Да вот так:return { ...emojis, count: emoji.count + 1 }
...emojis
должно быть ...emoji
.const values = {
RUS: [ 'раз значение', 'два значение', 'три' ],
US: [ '...', '...', '...' ],
// ...
};
const items = document.querySelectorAll('li');
const buttons = document.querySelectorAll('button');
buttons.forEach(n => n.addEventListener('click', onClick));
function onClick({ target: { innerText: key } }) {
items.forEach(function(n, i) {
n.innerText = this[i] ?? `ЗНАЧЕНИЕ #${i} ДЛЯ ${key} НЕ ЗАДАНО`;
}, values[key] ?? []);
}
from itertools import product
head = list(map(str, range(1, 10)))
center = [ '2023' ]
tail = list(map(str, range(1, 10)))
numbers = [ int(''.join(n)) for n in product(head, center, tail) ]