Syw.Frontend

๐Ÿงฉ Vue 2๋กœ ๋ฐฐ์šฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ดˆ

2๋‹จ๊ณ„. ๋„ฅ์ŠคํŠธ๊ณต๋ฌด์› ๋ฉ”์ธ Vue + Express๋กœ ๋กœ ํด๋ก ํ•˜๊ธฐ

2-6-๊ณผ์ œ. on ์ž๋™์ „ํ™˜

๐Ÿ” Vue ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€์  ์„ค๋ช…

Hook ์„ค๋ช…
mounted() ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ๋งˆ์šดํŠธ(๋ Œ๋”๋ง) ๋œ ์งํ›„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ DOM์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํƒ€์ด๋จธ ์„ค์ • ๋“ฑ ์ดˆ๊ธฐ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
beforeDestroy() ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ํƒ€์ด๋จธ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ๊ตฌ๋… ๋“ฑ์„ ์ •๋ฆฌ(ํ•ด์ œ)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ ํ•ด์ฃผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… RightQuickMenu.vue (.tag-btn ์ž๋™ ์ „ํ™˜)

<template>
  <div class="right-quick-menu">
    <div class="quick-card play-card">
      <img
        src="https://img.megagong.net/m/2025/0715_playground/bnr_right_gong1.png"
        alt="์ด๋ฒคํŠธ ์ด๋ฏธ์ง€"
      />
    </div>

    <div class="quick-card coupon-card">
      <p class="badge">30% ํ• ์ธ<br />์ฟ ํฐ ์ฆ์ •</p>
      <p class="main-text">
        e-๊ต์žฌ<br /><span class="blue">์ฒซ ๊ตฌ๋งค ์ด๋ฒคํŠธ</span>
      </p>
      <button class="detail-btn">์ž์„ธํžˆ ๋ณด๊ธฐ</button>
    </div>

    <div class="quick-card nextpass-card">
      <p class="small">๋ชจ๋“  ์ˆ˜ํ—˜์ƒ์„ ์œ„ํ•œ</p>
      <p class="blue-bold">๊ณต๋ฌด์› ๋„ฅ์ŠคํŠธํŒจ์Šค<br />๋งž์ถค ํ• ์ธ ํ˜œํƒ</p>
      <button
        class="tag-btn"
        :class="{ on: activeTag === 0 }"
      >
        ์ „ยทํ˜„์ง ๊ณต๋ฌด์›
      </button>
      <button
        class="tag-btn"
        :class="{ on: activeTag === 1 }"
      >
        ํฌ๋ง ์ธ๊ธฐ๊ฐ€<br />(์ €์†Œ๋“/์ฐจ์ƒ์œ„)
      </button>
    </div>
  </div>
</template>

<script>
export default {
  name: "RightQuickMenu",
  data() {
    return {
      activeTag: 0, // ํ˜„์žฌ on ์ด ์ ์šฉ๋œ tag ๋ฒ„ํŠผ ์ธ๋ฑ์Šค
      intervalId: null, // setInterval ID ์ €์žฅ์šฉ
    };
  },
  mounted() {
    // โœ… ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ์™„์ „ํžˆ ๋งˆ์šดํŠธ๋œ ํ›„ ์‹คํ–‰
    // 3์ดˆ๋งˆ๋‹ค activeTag๋ฅผ 0 โ†” 1๋กœ ๋ณ€๊ฒฝ (toggle)
    this.intervalId = setInterval(() => {
      this.activeTag = (this.activeTag + 1) % 2;
    }, 3000);
  },
  beforeDestroy() {
    // โœ… ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ง์ „์— ์‹คํ–‰
    // ํƒ€์ด๋จธ ์ œ๊ฑฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€
    clearInterval(this.intervalId);
  },
};
</script>

โœ… ๊ฒฐ๊ณผ ์š”์•ฝ

  • mounted() โ†’ ์ž๋™ ๋ฐ˜๋ณต ํƒ€์ด๋จธ ์‹œ์ž‘ (3์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฒ„ํŠผ ๋ฒˆ๊ฐˆ์•„ ํ•˜์ด๋ผ์ดํŠธ)
  • beforeDestroy() โ†’ ํƒ€์ด๋จธ ์ •๋ฆฌ (๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ๋ฐฉ์ง€ ๋ฐ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ)

GitHub - heroyooi/vue2-megagong at ch6_resolve

๐Ÿ’ฌ ๋Œ“๊ธ€

    โ€ป ๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.