์๊ฐ์ด ์ง๋ ํ, ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋ง ํ๋ ๊ณผ์ ์์ ์์ ์ด์ ์ ๋ํด ์ฐพ์๋ณด๊ธฐ ์ํด TIL ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค์์ต๋๋ค!
์ค๋์ Vanilla JavaScript๋ก ์น ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋ ์ค ๋ง์ฐ์ค ๋ค์ด(mousedown) ์ด๋ฒคํธ์ ๋ง์ฐ์ค ์ (mouseup) ์ด๋ฒคํธ, ๊ทธ๋ฆฌ๊ณ ํด๋ฆญ(click) ์ด๋ฒคํธ ๊ฐ์ ์ถฉ๋์ด ๋ฐ์ํด, ๊ฐ ์ด๋ฒคํธ์ ๋์์ด ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋ ์ ์๋๋ก ์กฐ์ ํ ๋ด์ฉ์ ๊ฐ๋จํ ๊ธฐ๋กํ๋ คํฉ๋๋ค.
๋ฌธ์ ์ํฉ: ๋ ๊ฒฝ์ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ง
์ฌ์ฉ์๊ฐ ์ํ ๋ฒํผ์ ํด๋ฆญํ์ ๋, ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํ์ต๋๋ค:
- ์์ก์ด ๋ถ์กฑํ ๊ฒฝ์ฐ
- ์์ก์ด ์ถฉ๋ถํ ๊ฒฝ์ฐ
- ๋ง์ฐ์ค ๋ค์ด/์ ์ด๋ฒคํธ์ ํด๋ฆญ ์ด๋ฒคํธ์ ์ํธ์์ฉ
์ด๋ฌํ ์ํฉ์์ ๋ง์ฐ์ค ์ ์ด๋ฒคํธ์ ๋์์ ๊ฐ๋ ค์ ธ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋์ํ์ง ์๋ ์ํฉ์ด ๋ฐ์ํ์ด์.
ํด๊ฒฐ ๋ฐฉ๋ฒ: ์กฐ๊ฑด๋ถ ์ด๋ฒคํธ ๋ฑ๋ก
๋จผ์ ๊ธฐ์กด ์ฝ๋์ ๋๋ค.
setEvent() {
const { onSelect, onMouseDown, onMouseUp } = this.props;
if (onSelect) {
this.addEvent('click', '.product-button', (e) => {
const button = e.target.closest('.product-button');
if (!button) return;
const productId = Number(button.dataset.id);
onSelect(productId);
});
}
if (onMouseDown) {
this.addEvent('mousedown', '.product-button', onMouseDown);
}
if (onMouseUp) {
this.addEvent('mouseup', '.product-button', onMouseUp);
}
}
๋ณ๊ฒฝ๋ ์ฝ๋์ ๋๋ค.
setEvent() {
const { onSelect, onMouseDown, onMouseUp, product } = this.props;
// ๊ฐ๊ฒฉ์ด ๋ถ์กฑํ ๋๋ง mousedown/mouseup ์ด๋ฒคํธ ๋ฑ๋ก
if (onMouseDown && this.state.balance < product.price) {
this.addEvent('mousedown', '.product-button', () => {
onMouseDown(product);
});
this.addEvent('mouseup', '.product-button', () => {
onMouseUp();
});
} else {
// ๊ฐ๊ฒฉ์ด ์ถฉ๋ถํ๊ฑฐ๋ ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด click ์ด๋ฒคํธ๋ง ๋ฑ๋ก
this.addEvent('click', '.product-button', (e) => {
const button = e.target.closest('.product-button');
if (!button) return;
const productId = Number(button.dataset.id);
onSelect(productId);
});
}
}
ํต์ฌ ์ ๊ทผ ๋ฐฉ์
- ์กฐ๊ฑด๋ถ ์ด๋ฒคํธ ๋ฑ๋ก: ํ์ฌ ์ํ์ ๋ฐ๋ผ ์ ์ ํ ์ด๋ฒคํธ๋ฅผ ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉํฉ๋๋ค.
- ์ด๋ฒคํธ ์์: closest() ๋ฉ์๋๋ฅผ ํ์ฉํด ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. (๊ธ์๋ ์์ง๋ง component.js์์ ์ฒ๋ฆฌ)
- ์ํ ๊ธฐ๋ฐ ๋ก์ง: balance์ product.price๋ฅผ ๋น๊ตํ์ฌ ์ด๋ฒคํธ ํ๋ฆ์ ์ ์ดํฉ๋๋ค.