๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒต Vue.js

[Vue.js] ๋ฒ„ํŠผ ๋งŒ๋“ค๊ณ , ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ…์ŠคํŠธ ๋‚˜ํƒ€๋‚ด๊ธฐ.

by ._.sori 2025. 7. 27.

 

 

์ฐธ๊ณ ๋กœ Vue.js์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์•„๋ฌด๊ฑฐ๋‚˜ ๋ง‰ ํ•ด๋ณด๋Š” ์ค‘์ด๊ณ  ์˜ณ์€ ์ •๋ณด์ธ์ง€ ์ €๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค!

 

 

 

๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ณ 
๊ทธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด
ํ…์ŠคํŠธ๊ฐ€ ๋‚˜์˜ค๋„๋ก
๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

1. ์‹คํ–‰ ํ™”๋ฉด

 

 

 

 


 

 

 

 

2. HelloView.vue 

MainView.vue์— ์žˆ๋Š” Hello,Vue!! ํ…์ŠคํŠธ ์ถœ๋ ฅ ๋ถ€๋ถ„ ์ฝ”๋“œ๋ฅผ HelloView.vue๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค. ๋งŒ์•ฝ ์ƒˆ๋กญ๊ฒŒ ํ™”๋ฉด์„ ๋งŒ๋“ ๋‹ค๋ฉด ๋ฉ”์ธํ™”๋ฉด ์ฐฝ ํ•˜๋‚˜์™€ ํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•œ ์ฐฝ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. 

<script>
export default {
  name: 'HelloVue',
  props: {
    showHello: {
      type: Boolean,
      required: true,
    }
  }
}
</script>



<template>

  <div class="hello-vue">
    <h1> HelloVue!! </h1>
  </div>

</template>



<style scoped>

.hello-vue {
  position: fixed;
  top: 50%;
  left: 80%;
  transform: translate(-50%, -50%);
  background: white;
  color: olivedrab;
  font-family: "Cafe24Meongi-B-v1.0";
}

</style>

 

๋‚˜๋จธ์ง€๋Š” ๊ฑฐ์˜ ๋˜‘๊ฐ™์€๋ฐ, ํ…์ŠคํŠธ ์œ„์น˜๋งŒ left: 80%๋กœ ์˜ฎ๊ฒจ์คฌ๊ณ  <script>์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋๋‹ค. <script> ์ฝ”๋“œ๋งŒ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

export default {
  name: 'HelloVue',
  props: {
    showHello: {
      type: Boolean,
      required: true,
    }
  }
}
export๋Š” ์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ผ๋•Œ ์“ด๋‹ค. import๋Š” ๋ฐ›์•„์˜ฌ๋•Œ ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ export์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์ด๋‹ค. default๋Š” ๊ฐœ์ฒด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ถ™์ธ๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ์ฒด ์ „์ฒด๋ฅผ HelloVue๋ผ๊ณ  ๋“ฑ๋กํ•˜์—ฌ ๋‚ด๋ณด๋‚ด๋‹ˆ๊นŒ default๋ฅผ ๋ถ™์˜€๋‹ค.

props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ˆ˜๋‹จ์ด๋‹ค. ์ด ์ฝ”๋“œ์—์„œ๋Š” <script setpu>์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ <script>๋กœ ์„ค์ •ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ props ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ props๋ฅผ ์„ ์–ธํ•œ๋‹ค.

showHello๋Š” ์ „๋‹ฌ๋ฐ›๋Š” prop์˜ ์ด๋ฆ„์ด๋‹ค. ์ด ์ฝ”๋“œ์—์„œ Hello,vue๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ณด์ด๊ณ  ๋ˆ„๋ฅด๊ธฐ ์ „์—๋Š” ์•ˆ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— type์„ Boolean์œผ๋กœ ์„ค์ •ํ•˜์—ฌ showHello๋Š” true์™€ false ๊ฐ’๋งŒ ๋ฐ›๋„๋ก ํ–ˆ๋‹ค. (true ๊ฐ’์ด ์˜ค๋ฉด ๋ณด์ด๋„๋ก ํ•˜๊ณ , false ๊ฐ’์ด ์˜ค๋ฉด ์•ˆ ๋ณด์ด๋„๋ก ํ•  ๊ฑฐ๋‹ˆ๊นŒ)  required๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ ๋ถ€๋ชจ vue๊ฐ€ ๋ฐ˜๋“œ์‹œ showHello์˜ prop์„ ๋ฐ›์•„์•ผ ์ •์ƒ ์ž‘๋™ํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ MainView์— ๊ฐ€์„œ prop์„ ๋ฐ›์€ ์ฝ”๋“œ๋ฅผ ์—†์•ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋™์ž‘์— ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค!! ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ Boolean์€ ์˜ˆ์™ธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. Boolean ํƒ€์ž…์„ ์ œ์™ธํ•œ ํƒ€์ž…์€ prop์„ ๋ฐ›์•„์•ผ ๋™์ž‘ํ•œ๋‹ค. 

 

 

Vue.js (์ถœ์ฒ˜: https://ko.vuejs.org/guide/components/props)

· ๋ชจ๋“  prop์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ, required: true๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
· Boolean์ด ์•„๋‹Œ ์„ ํƒ์  prop์ด ์—†์œผ๋ฉด ๊ฐ’์€ undefined๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
· Boolean prop์ด ์—†์œผ๋ฉด false๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด default๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  ์˜ˆ: default: undefined๋กœ ์„ค์ •ํ•˜๋ฉด Boolean์ด ์•„๋‹Œ prop์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
· default ๊ฐ’์ด ์ง€์ •๋œ ๊ฒฝ์šฐ, prop ๊ฐ’์ด undefined๋กœ ํ•ด์„๋˜๋ฉด(์ฆ‰, prop์ด ์—†๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ undefined๊ฐ€ ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ) ํ•ด๋‹น ๊ฐ’์ด
  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 


 

 

 

 

3. MainView.vue์— ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

<template>
  <div class="main-view">
    <button class="btn" @click="btnHello" style="cursor: pointer"> Click </button>
  </div>
</template>
main-view ์•ˆ์— ๋ฒ„ํŠผ์„ ๋งŒ๋“ ๋‹ค. <button>์œผ๋กœ ์‰ฝ๊ฒŒ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. @click์€ ํด๋ฆญ์‹œ ์–ด๋–ค ๋™์ž‘์„ ์ผ์–ด๋‚˜๋„๋ก ๋งŒ๋“ค๊ฑฐ๋ผ, ๊ทธ ๋™์ž‘์ด ์ผ์–ด๋‚  ์ด๋ฆ„์„ btnHello๋ผ๊ณ  ์ •์˜ํ–ˆ๋‹ค. cursor: pointer์€ ๋ฒ„ํŠผ์— ์ปค์„œ๋ฅผ ๋Œ€๋ฉด ํด๋ฆญํ•˜๋Š” ๋ชจ์–‘์œผ๋กœ ๋ฐ”๋€Œ๋„๋ก ์Šคํƒ€์ผ์„ ์ง€์ •ํ–ˆ๋‹ค.

 

.btn {
  position: absolute;
  width: 80px;
  height: 50px;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 20px;
  color: white;
  background-color: black;
}
position: absolute๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ์ฐพ์•„์„œ ๊ทธ ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์น˜๋ฅผ ์žก๋Š”๋‹ค. main-view์˜ position์€ relative๊ณ , width: 100vw์™€ height:100vh๋ฅผ ์คฌ๋‹ค. ์ฃผ๋กœ ๋ถ€๋ชจ-์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•  ๋•Œ, ๋ถ€๋ชจ๋Š” relative๋กœ ์žก๊ณ  ๊ทธ ๋ถ€๋ชจ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์œ„์น˜๋ฅผ ์žก๋Š” ์ž์‹ ์š”์†Œ๋ฅผ absolute๋ฅผ ์ค€๋‹ค. ๋ฌผ๋ก  ๊ผญ ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ relative์ผ ํ•„์š”๋Š” ์—†๋‹ค. ๋‹ค๋งŒ relative๊ฐ€ ๋ ˆ์ด์•„์›ƒ ํ๋ฆ„์˜ ์˜ํ–ฅ์„ ๋”ฑํžˆ ๋ฐ›์ง€ ์•Š์œผ๋ฉด์„œ ๊ธฐ์ค€๋งŒ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์ง๊ด€์ ์ด๋ผ์„œ ๊ทธ๋ ‡๊ฒŒ ๋ฐฐ์น˜๋ฅผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

width์™€ height๋กœ ๋ฒ„ํŠผ์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•˜๊ณ , top๊ณผ left, transform์œผ๋กœ ๋ฒ„ํŠผ์ด ์ •์ค‘์•™์— ์˜ค๋„๋ก ๋ฐฐ์น˜ํ–ˆ๋‹ค. 

 

 

 

 


 

 

 

 

4. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ…์ŠคํŠธ ๋‚˜ํƒ€๋‚ด๊ธฐ

  • import ํ•˜๊ธฐ

<script>

import HelloVue from "@/components/HelloVue.vue";

export default {
  name: "MainView",
  components: {HelloView},
}

</script>

 

 

 

์•„๊นŒ HelloView์—์„œ export ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ทธ๊ฑธ MainView์—์„œ import๋กœ ๋ฐ›์•„๋ณด๊ฒ ๋‹ค. from์— ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ค€๋‹ค. ์œ„ ์‚ฌ์ง„์„ ๋ณด๋ฉด components ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•˜์œ„์— HelloVue.vue๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ "@/components/HelloVue.vue"์ด๋ ‡๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ–ˆ๋‹ค. components๋Š” ๊ฐ€์ ธ์˜จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ์— ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

  • template HelloView ์„ค์ •ํ•˜๊ธฐ
<template>
  <div class="main-view">
    <button class="btn" @click="btnHello" style="cursor: pointer"> Click </button>
    <HelloView v-if="showHello" :show-hello="showHello"/>
  </div>
</template>
v-if๋Š” ๋ธ”๋ก์„ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋””๋ ‰ํ‹ฐ๋ธŒ์˜ ํ‘œํ˜„์‹์ด ์ฐธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ๋ธ”๋ก์ด ๋ Œ๋”๋ง ๋œ๋‹ค๊ณ  ์ ํ˜€์žˆ๋‹ค. ์ด ์‚ฌ์‹ค์„ ์ž˜ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์ž.

:show-hello:"showHello"๋Š” HelloView์—์„œ Props์— ๋„ฃ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ˆ˜๋‹จ์ด๋ผ๊ณ  ์„ค๋ช…ํ–ˆ์—ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด true ๊ฐ’์ด ์ž์‹ HelloView์— ์ „๋‹ฌ๋˜๋Š”๋ฐ, ์‚ฌ์‹ค ์ด ์ฝ”๋“œ์—์„œ ๊ผญ ํ•„์š”ํ•œ ์กด์žฌ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.  ํ˜„์žฌ ์ฝ”๋“œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ true์ธ์ง€ false์ธ์ง€๋กœ ๋™์ž‘์ด ํ–‰ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •์ด ๋œ๋‹ค. ๊ฐ’์„ ์ž์‹์—๊ฒŒ ๋ณด๋‚ด์ฃผ๊ณ , ๊ทธ ๊ฐ’์„ ํ†ตํ•ด ์ž์‹ ๋‚ด๋ถ€์— ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋‹ˆ ๊ตณ์ด ์•ˆ ์จ๋„ ๋˜๋Š” ๋ถ€๋ถ„์ด๊ธด ํ•˜๋‚˜ ํ›„์— ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ๋†”๋‘๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

 

 

 

  • script์— ๋™์ž‘ ๊ด€๋ จ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ
export default {
  name: "MainView",
  components: {HelloView},
  data() {
    return {
      showHello: false,
    };
  },
  methods: {
    btnHello() {
      this.showHello = true;
    }
  },
}

</script>
data( )๋Š” ์ƒํƒœ๋ฅผ ์ •์˜ํ•œ๋‹ค. showHello์˜ ์ƒํƒœ๋Š” false๋กœ MainView ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋„๋ก ํ–ˆ๋‹ค.  methods๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. this.showHello๋กœ false๋กœ ํ‘œ์‹œ๋œ showHello๊ฐ€ true๋กœ ๋ฐ”๋€Œ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ this.๋Š” Vue์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ data( )์— ์ •์˜ํ•œ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

 

 


 

 

์•„๋ž˜์— ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ธ”๋กœ๊ทธ์—” ์ œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•œ ๋‚ด์šฉ๊นŒ์ง€๋งŒ ์ ๋Š”๊ฑฐ๋ผ
์ถœ์ฒ˜์— ๋“ค์–ด๊ฐ€์‹œ๋ฉด ๋” ๋งŽ์€ ๋‚ด์šฉ์ด ์žˆ์–ด ๊ณต๋ถ€ํ•˜์‹œ๋Š”๋ฐ ๋„์›€๋˜์‹ค๊ฒ๋‹ˆ๋‹ค.

 

๐Ÿชฝ

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”

 

 


 

 

- ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ดˆ

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org

 

 

 

- props

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org

 

 

 

- v-if

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org