type FilterOptions<T> = {
[K in keyof T]?: T[K] extends object ? FilterOptions<T[K]> : T[K];
};
const isOverlaps = <T>(entry: T, options: FilterOptions<T>): boolean => {
const keys = Object.keys(options) as Array<keyof T>;
return keys.every((key) => {
if (typeof options[key] === 'object') {
return isOverlaps(entry[key], options[key]!);
}
return entry[key] === options[key];
});
};
const filterBy = <T>(collection: T[], options: FilterOptions<T>) => {
return collection.filter((entry) => isOverlaps(entry, options));
};
useEffect
без массива значений, за которым надо следить (dependencies), будет срабатывать при каждом рендере. Изменение состояния вызывает новый рендер, который в свою очередь вызывает useEffect
.useEffect(() => {
const intervalId = setInterval(() => {
console.log("ticking");
setNumber((prevCount) => prevCount + 1);
}, 1000);
return () => clearInterval(intervalId);
}, []);
const week = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
week.forEach((day, index) => {
const element = document.createElement('p');
if (index < 5) {
element.textContent = day;
} else {
const wrapper = document.createElement('strong');
wrapper.textContent = day;
element.append(wrapper);
}
document.body.append(element);
});
:class="{ [`header_comp__headline--${hlStyle||hlDefault.style}`]: true, 'first-class': data.slideType == 'brand' }"
:class="[`header_comp__headline--${hlStyle||hlDefault.style}`, data.slideType == 'brand' ? 'first-class' : '']"
:class="[`header_comp__headline--${hlStyle||hlDefault.style}`, { 'first-class': data.slideType == 'brand' }]"
const mapOptions = (options, values) => option.map(({ option }) => {
const usedValues = new Set();
return {
id: option.id,
name: option.name,
slug: option.slug,
values: values.reduce((acc, { id, value }) => {
if (id === option.id && !usedValues.has(value)) {
usedValues.add(value);
acc.push({ id, value });
}
return acc;
}, [])
};
});
console.log(mapOptions(options, option_values));
<select>
надо отдельно обработать значения.function show_input_info(inputSelector, elSelector) {
const input = document.querySelector(inputSelector);
const el = document.querySelector(elSelector);
input.addEventListener('input', () => {
if (input.tagName === 'SELECT') {
el.textContent = [...input.selectedOptions]
.map((option) => option.textContent.trim())
.join(', ');
} else {
el.textContent = input.value.trim();
}
});
}
h2 a {
text-decoration: none;
}
MovieInfo[]
(все равно что Arrray<MovieInfo>
), а получаете один объект.React.useState<MovieInfo | null>(null);
<h1>{currentMovieDetail?.id}</h1>
- if (numberTest && emailTest && adressTest) {
+ if (numberTest() && emailTest() && adressTest()) {