obj() {
return this.items[0];
},<div v-if="obj">
<div v-for="(val, key) in obj">
...
$('.shop-ellement-sidebar').on('click', function(e) {
if ($(e.target).closest('.element-sidebar_content').length) {
return;
}
// дальше проверка наличия класса active и т.д. - без изменений.element-sidebar_content:$('.element-sidebar_content').click(function(e) {
e.stopPropagation();
});
получать данные для корзины - в actions, через Promise.all по id вытаскивая данные для каждого товара?
Исправил синтаксические ошибки.
if или условие лишнее:} else (date.getDay() == 0) {} else (a < 1) {: после ?:this.updateTime.getMonth() > 9 ? : '0'renderItems стоит лишняя фигурная скобка, а после метода createPeriod такой скобки не хватает.input.onchange:this.input.onChange = this.onChange;date или data? Вы бы определились:class dateInput {class dateRange extends dataInput {dateRange отсутствует вызов конструктора базового класса - не хватает super(); перед this.container = ...:constructor() { this.container = document.querySelector('.containerForLastUpdateRecordAndPeriodItems');
period = `${date.toLocaleDateString()} - {date.setHours(168).toLocaleDateString()}`;
period должно быть periods[i].setHours возвращает число, а не объект даты, так вызвать toLocaleDateString не получится.$ перед фигурной скобкой при подстановке второй даты.b = false;element = document.createElement('div')renderItems - не хватает this.:onChange() { renderItems(this.createItems(this.createPeriod(this.inputValue)));
this тут будет вовсе не экземпляром класса - надо привязывать контекст при установке этого метода в качестве обработчика события (this.onChange.bind(this) - это в конструкторе dateInput). А ещё, поскольку метод переопределён, надо не забыть вызвать метод базового класса, иначе не будет установлено значение свойства inputValue:onChange(e) {
super.onChange(e);
this.renderItems(...TypeError при попытке выполнить хотя бы одну итерацию подобного цикла получите обязательно:for (const i = 0; i < n-a; i++) {document.createElement в качестве параметров? Откройте документацию и разберитесь, чтобы такую чушь больше не сочинять:const element = document.createElement('div', {textContent: item});
this:this.container.appendChild(element);forEach, который представлен обычной функцией, то экземпляр класса оказывается недоступен. Или замените обычную функцию на стрелочную, или передайте this в forEach третьим параметром.createPeriod(date) { var newDate = date; newDate.year = newDate.year + 1;
createPeriod(dateStr) {
const start = new Date(dateStr);
const end = new Date(dateStr);
end.setFullYear(end.getFullYear() + 1);
return { start, end };
}const range = Object.create(dateRange.prototype); range.constructor = range.constructor.bind(range); range.constructor();
new конструктор вызывать нельзя.new dateRange;.Подскажите, как еще можно оптимизировать(зарефакторить) данный js код?
const MS_IN_HOUR = 3600000;
const HOURS = 168;for (let i = +period.start; i < +period.end; i += MS_IN_HOUR * HOURS) {
const date = new Date(i);const hours = [ -120, 0, -24, -48, -48, -72, -96 ][date.getDay()];
periods.push([ hours, hours + HOURS ]
.map(n => (date.setHours(n), date.toLocaleDateString()))
.join(' - ')
);[ periods[i + a], periods[i] ] = [ periods[i], periods[i + a] ];updateTime - как-то многовато, достаточно одного, чтобы запомнить значение под коротким именем:const ut = this.updateTime;this.container.insertAdjacentHTML('beforeend',
`<div>Последнее изменение: ${ut.getDate()}.${`${ut.getMonth()}`.padStart(2, 0)}</div>` +
items.map(n => `<div>${n}</div>`).join('')
);
Как Вы думаете, как бы написал опытный реакт-разработчик...Я конечно таковым ни разу не являюсь, но всё-таки скажу пару слов.
проверки через тернарный оператор внутри render?Это окей - conditional rendering.Из метода render массив paths следует убрать. Может быть, его даже стоит сделать параметром компонента.render() { const paths = [
Следует сделать метод. Создавать при каждом вызове render новый обработчик - само по себе не очень здорово, ну и ещё этот код повторяется дважды.onClick={ () => {this.setState({isOpen: !this.state.isOpen})} }
this.props.history.listen(...Если предполагается, что во время работы приложения экземпляр компонента будет создаваться несколько раз, то при удалении экземпляра надо снимать обработчик, иначе вывод в консоль задвоится (затроится, зачетверится,...). Сделать это несложно - listen возвращает функцию, снимающую обработчик, так что:componentWillMount() {
this.unlisten = this.props.history.listen(...
componentWillUnmount() {
this.unlisten();<Link className="next_btn"...<Link className="prev_btn"...isOpen и свойства объектов paths[currPathIndex +/- 1] в качестве параметров.
const className = 'dropdown-trigger';
const key = 'target';
const attr = `data-${key}`;const elems = document.querySelectorAll(`.${className}`);
// или
const elems = document.getElementsByClassName(className);const getAttr = el => el.dataset[key];
// или
const getAttr = el => el.getAttribute(attr);
// или
const getAttr = el => el.attributes[attr].value;const attrs = Array.from(elems, getAttr);
// или
const attrs = Array.prototype.map.call(elems, getAttr);
// или
const attrs = [];
for (const n of elems) {
attrs.push(getAttr(n));
}
// или
const attrs = [];
for (let i = 0; i < elems.length; i++) {
attrs[i] = getAttr(elems[i]);
}
// или
const attrs = (function get(i, n = elems.item(i)) {
return n ? [ getAttr(n), ...get(i + 1) ] : [];
})(0);
Это что-то вроде пагинации.
const currPathIndex = paths.findIndex(n => n.link === location.pathname);
const isPrev = currPathIndex !== 0;
const isNext = currPathIndex !== paths.length - 1;const onClick = e =>
history.push(paths[currPathIndex + +e.target.dataset.step].link);<button disabled={!isPrev} data-step={-1} onClick={onClick}>PREV</button>
<button disabled={!isNext} data-step={+1} onClick={onClick}>NEXT</button>{isPrev && <NavLink to={paths[currPathIndex - 1].link}>PREV</NavLink>}
{isNext && <NavLink to={paths[currPathIndex + 1].link}>NEXT</NavLink>}
почему он может не перерисовывается когда данные поступают?
.length где-то здесь:Object.keys(this.props.landingState) > 0
const className = 'class';
const index = 1;const element = document.querySelector(`.${className}:nth-child(${index + 1})`);const element = document.querySelectorAll('.' + className)[index];
// или
const element = document.getElementsByClassName(className).item(index);
есть пример локализации, но он по структуре элементов не похож на мой пример поэтому у меня не получается им воспользоваться
map.setBounds(map.geoObjects.getBounds())
function f({ a, b, c }) {
console.log(a, b, c);
}
f({ b: 9, c: 5 }); // undefined 9 5function f({ a = 1, b = 2, c = 3 } = {}) {
console.log(a, b, c);
}
f({ a: 100, c: 300 }) // 100 2 300
f({ b: -1 }) // 1 -1 3
f() // 1 2 3
f({ a: 0, b: 0, c: 0 }) // 0 0 0
&:hover + .block .circle-1&:hover ~ .block .circle-1.hover {
...
.text {
...
$hover-colors: red, green, blue;
@for $i from 1 through length($hover-colors) {
&:nth-child(#{$i}):hover ~ .block .circle:nth-child(#{$i}) {
background: nth($hover-colors, $i);
}
}
onMouseDown(e) {
e.preventDefault();
}onMouseDown={this.onMouseDown}
Почему выдает фрагмент слова?
\b, обозначающий границы слов, но он в данном случае неприменим, поскольку у вас тут кириллические символы. Можно представить границу слова как начало строки или пробельный символ или конец строки. Типа так:str.match(/(^|\s)[бвгджзк][аяеэюуёоиы]+[бвгджзк][а-яё]*($|\s)*?/gi).map(n => n.trim())