чтобы числа повторялись не более двух раз
SELECT *, price * ((100 - discount) / 100) AS discounted
FROM prices
ORDER BY discounted
LIMIT 10
$(document).on({
focus() {
$(this).addClass('active-amount-input');
},
blur() {
$(this).removeClass('active-amount-input');
},
}, '.amount, .amount_1');
$(document).on('focusin focusout', '.amount, .amount_1', e => {
$(e.currentTarget).toggleClass('active-amount-input', e.type === 'focusin');
});
- <main className={active ? 'move-to-left' : ''}>
+ <main>
- <div className="sidebar">
+ <div className={'sidebar ' + (active ? 'move-to-left' : '')}>
- <NavRight onClick={this.toggleActive} buttonClass={!active ? 'active' : ''} navClass="hidden-xs" />
+ <NavRight onClick={this.toggleActive} buttonClass={active ? 'active move-to-left' : ''} navClass="hidden-xs" />
+ body {
+ overflow: hidden;
+ }
.sidebar {
...
- z-index: 1;
- right: 0;
+ z-index: 3;
+ right: -400px;
+ transition: all .7s ease;
Имелось в виду, что контент тоже двигается при смещении sidebar, но не убегает полностью в левый угол, а остается по центрy оставшейся ширины
TS2362 The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum
this.endDate - this.currentDate
+this.endDate - +this.currentDate
const uniqueDocs = docs
.filter((n, i, a) => n === a.find(m => m.date === n.date && m.type === n.type))
.map(({ type, date }) => ({ type, date }));
const uniqueDocs = Object
.entries(docs.reduce((acc, n) => ((acc[n.type] = acc[n.type] || new Set).add(n.date), acc), {}))
.reduce((acc, n) => (acc.push(...Array.from(n[1], m => ({ type: n[0], date: m }))), acc), []);
const unique = (arr, keys) =>
arr.filter((n, i, a) => i === a.findIndex(m => keys.every(k => n[k] === m[k])));
const pick = (obj, keys) =>
keys.reduce((acc, k) => (acc[k] = obj[k], acc), {});
const keys = [ 'type', 'date' ];
const uniqueDocs = unique(docs, keys).map(n => pick(n, keys));
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 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