const summ = {
element: document.getElementById("summ"),
clones: [],
getValue() {
return this.element.textContent;
},
renderClones(selector) {
if (this.clones.length > 0) {
this.clones.forEach((clone) => {
selector.append(clone);
});
}
},
createClone() {
const clone = document.createElement("div");
clone.classList.add(".new-clone");
clone.textContent = this.getValue();
this.clones.push(clone);
this.renderClones(document.body);
},
update(value) {
this.element.textContent = value;
if (this.clones.length > 0) {
this.clones.forEach((clone) => {
clone.textContent = value;
});
}
}
};
summ.createClone();
summ.createClone();
summ.element.addEventListener("click", () => {
summ.update(3000);
});
<div class="advantages_item">
<img src="img/Услуги.jpg" alt="" />
<h2>У нас вы можете:</h2>
<p>Lorem ipsum dolor sit amet.</p>
</div>
<div class="advantages_item">
<img src="img/Услуги.jpg" alt="" />
<h2>У нас вы можете:</h2>
<p>Lorem ipsum dolor sit amet.</p>
</div>
<div class="advantages_item">
<img src="img/Услуги.jpg" alt="" />
<h2>У нас вы можете:</h2>
<p>Lorem ipsum dolor sit amet.</p>
</div>
В Firestore у вас должны храниться посты, желательно, чтобы у постов было поле likes: [...userId]
, чтобы пользователь не мог лайкать пост бесконечно.
likes
есть id
пользователя, то блокируете кнопку лайка.like
action - если запрос на лайк резолвнулся успехом, обновляете state постов локально./auth
должен резолвиться редиректом. К примеру - когда пользователь уже авторизован. Далее вам нужно создать компонент обертку типа:const PublicRoute = ({component: Component, isLogin, ...rest}) => {
return (
<Route {...rest} render={props => (
isLogin ?
<Redirect to="нужный урл" />
: <Component {...props} />
)} />
);
};
<BrowserRouter>
<Switch>
<PublicRoute component={SignIn} isLogin={...} path="/auth" exact />
</Switch>
</BrowserRouter>
componentDidUpdate
в котором вы будете сравнивать:...
componentDidUpdate(prevProps) {
if (prevProps.match.params.userId !== this.props.match.params.userId) {
// шлете запрос с новым userId = nextProps.match.params.userId
}
}
querySelectorAll
возвращает NodeList всеx найденный нод по селктору. В вашем случае в документе есть 2 ноды попадающие под искомый селектор - input
.[0]
и записываете метод onclick
для 1-ого элемента. Тем самым игнорируя 2-ой элемент(2-ой инпут).onclick
.const inputList = document.querySelectorAll("input");
inputList.forEach(input => {
input.onclick = function() {
if ((input.checked == true) && (input.value == "1")) {
document.body.style.backgroundColor = "#00ff00";
} else if ((input.checked == true) && (input.value == "2")) {
document.body.style.backgroundColor = "#ccff00";
} else {
document.body.style.backgroundColor = "#03f3f3";
}
};
})
Ведь services этот блок, который может повторятся и на других страницах сайта, и при этом, будет выглядеть по другому
services
и вы хотите его использовать на главной и на любой другой странице, тогда именование это блока на главной будет такое - class="main__services services"
где по селектору main__services
вы описываете расположение элементов внутри блока services
для главной страницы. Теперь для другой страницы можно сделать тоже самое class="another-page__services services"
catalog-item
по типу<div
class="catalog-item"
data-name="Коробка бурая + бурое дно"
data-size="230*170*90мм"
data-price="120"
data-number="1"
>
...
</div>
catalog-item
:const catalogItems = document.querySelectorAll('.catalog-item');
const basketList = document.querySelector('.basket__list');
catalogItems.forEach((catalogItem) => {
catalogItem.addEventListener("click", (e) => {
if (e.target.classList.contains("catalog-item_basket") {
const {name, size, price, number} = catalogItem.dataset;
const basketItem = document.createElement('div');
basketItem.innerHTML = `
<div class="basket__item">
<img src="img/boxes/image6.jpeg" alt="box" class="basket__item-image">
<div class="basket__item_wrapper">
<div class="basket__item-name">${name}</div>
<div class="basket__item-size">${size}</div>
<div class="basket__item-price">${price}</div>
<div class="basket__item-number">${number}</div>
</div>
</div>
`;
basketList.append(basketItem);
}
})
})