๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/Vue

Pass Props

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 11. 12.

Pass Props

Data in components

Data in components ๊ฐœ์š”

โœ” ์™„์ „ํžˆ ๋™์ผํ•œ data๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ Component์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•?!
โœ” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ฒŒ ์„ค์ •!
โœ” ๋ฐ์ดํ„ฐ ํ๋ฆ„ ํŒŒ์•… ์šฉ์ด
โœ” ์œ ์ง€ ๋ณด์ˆ˜ ์šฉ์ด

pass props & emit event

โœ” ๋ถ€๋ชจ -> ์ž์‹์œผ๋กœ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • pass props

โœ” ์ž์‹ -> ๋ถ€๋ชจ๋กœ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • emit event

Pass Props

๊ฐœ์š”

โœ” ์š”์†Œ์˜ ์†์„ฑ(property)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
โœ” props๋Š” ๋ถ€๋ชจ(์ƒ์œ„) ์ปดํฌ๋„ŒํŠธ์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ํŠน์„ฑ
โœ” ์ž์‹(ํ•˜์œ„) ์ปดํฌ๋„ŒํŠธ๋Š” porps ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์‹ ํ•˜๋Š” props๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ

props in HelloWorld

<!-- HelloWorld.vue -->

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    ...
  </div>
</template>
<!-- HelloWorld.vue -->

<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String,
  },
};
</script>

โœ” Vue CLI๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋งŒ๋“ค์–ด์ฃผ๋˜ App.vue์˜ HelloWorld ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด msg๋ผ๋Š” property ์ž‘์„ฑ๋˜์–ด ์žˆ์Œ

โœ” App.vue์˜ <HelloWorld/>์š”์†Œ์— msg="~"๋ผ๋Š” porperty๋ฅผ ์„ค์ •ํ•˜์˜€๊ณ , ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ HelloWorld๋Š” ์ž์‹ ์—๊ฒŒ ๋ถ€์—ฌ๋œ msg property๋ฅผ template์—์„œ {{ msg }} ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ

Pass Props

โœ” ์œ„์™€ ๊ฐ™์€ ๋ถ€๋ชจ => ์ž์‹์œผ๋กœ์˜ data ์ „๋‹ฌ ๋ฐฉ์‹
โœ” ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ static props๋ผ๊ณ  ๋ช…์‹œ
โœ” ์š”์†Œ์— ์†์„ฑ์„ ์ž‘์„ฑํ•˜๋“ฏ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์—ฌ, prop-data-name="value"์˜ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ

  • ์ด๋•Œ ์†์„ฑ์˜ ํ‚ค ๊ฐ’์€ kebab-case๋ฅผ ์‚ฌ์šฉ
<!-- HelloWorld.vue -->

<script>
export default {
  name: "HelloWorld",
  props: {
    msg: String,
  },
};
</script>

โœ” Props ๋ช…์‹œ: ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ์ชฝ, ์ฆ‰ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ props์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑ์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
โœ” ์ „๋‹ฌ ๋ฐ›์€ props๋ฅผ type๊ณผ ํ•จ๊ป˜ ๋ช…์‹œ
โœ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌธ์„œํ™”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ž˜๋ชป๋œ ํƒ€์ž…์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ˜์†”์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ƒ„

MyComponent to MyComponentItem

<!-- MyComponent.vue -->

<template>
  <div class="border">
    <h1>This is my Component</h1>
    <!-- ๋ฐ์ดํ„ฐ ๋ณด๋‚ด์ฃผ๊ธฐ -->
    <MyComponentItem static-props="Data from MyComponent" />
  </div>
</template>
<!-- MyComponentItem.vue -->

<template>
  <div>
    <h3>Child Component of MyComponent</h3>
    <p>{{ staticProps }}</p>
  </div>
</template>

<script>
export default {
  name: "MyComponentItem",
  props: {
    staticProps: String,
  },
};
</script>

Pass Props convention

โœ” ๋ถ€๋ชจ์—์„œ ๋„˜๊ฒจ์ฃผ๋Š” props(HTML)

  • kebab-case

โœ” ์ž์‹์—์„œ ๋ฐ›๋Š” props

  • camelCase

Dynamic Props

โœ” ๋ณ€์ˆ˜๋ฅผ props๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
โœ” v-bind directive๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ
โœ” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋˜ํ•œ ์—…๋ฐ์ดํŠธ ๋จ

Dynamic Props ์‹ค์Šต

<!-- MyComponent.vue -->

<template>
  <div class="border">
    <h1>This is my Component</h1>
    <MyComponentItem
      static-props="Data from MyComponent"
      <!-- ๋™์  ๋ฐ์ดํ„ฐ -->
      :dynamic-props="dynamicProps"
    />
  </div>
</template>

<script>
export default {
  ...
  data: function () {
    return {
      dynamicProps: "It's in data",
    };
  },
};
</script>
<!-- MyComponentItem.vue -->

<template>
  <div>
    <h3>Child Component of MyComponent</h3>
    <p>{{ staticProps }}</p>
    <p>{{ dynamicProps }}</p>
  </div>
</template>

<script>
export default {
  name: "MyComponentItem",
  props: {
    staticProps: String,
    dynamicProps: String,
  },
};
</script>

์ปดํฌ๋„ŒํŠธ์˜ data ํ•จ์ˆ˜

โœ” ๊ฐ vue ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ™์€ data ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ์ƒˆ๋กœ์šด data ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜(return)ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค!

Dynamic Props ์ฃผ์˜์‚ฌํ•ญ

โœ” :dynamic-props="dynamicProps"๋Š” ์•ž์˜ key๊ฐ’ (dynamic-props)์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ๋’ค์˜ " "์•ˆ์— ์˜ค๋Š” ๋ฐ์ดํ„ฐ(dynamicProps)๋ฅผ ์ „๋‹ฌํ•˜๊ฒ ๋‹ค๋Š” ๋œป

โœ” v-bind๋กœ ๋ฌถ์—ฌ์žˆ๋Š” " "์•ˆ์˜ ๊ตฌ๋ฌธ์€ javascript ๊ตฌ๋ฌธ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
โœ” dynamicProps๋ผ๊ณ  ํ•˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ data๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ!!

<!-- 1: static: ๋ฌธ์ž์—ด '1' ์ „๋‹ฌ -->
<SomeComponent num-props="1" />

<!-- 2: static: ์ˆซ์ž '1' ์ „๋‹ฌ -->
<SomeComponent :num-props="1" />

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„

โœ” ๋ชจ๋“  props๋Š” ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ, ์ฆ‰ ์•„๋ž˜๋กœ ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ํ˜•์„ฑ
โœ” ๋ถ€๋ชจ ์†์„ฑ์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฉด ์ž์‹์œผ๋กœ ํ๋ฅด์ง€๋งŒ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์€ ์•„๋‹ˆ๋‹ค!

  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ชจ๋“  props๊ฐ€ ์ตœ์‹  ๊ฐ’์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์นจ๋จ

โœ” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์•ฑ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค๊ฒŒ ํ•˜๋Š” ๊ฒƒ ๋ฐฉ์ง€!

'โญ Personal_Study > Vue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vuex  (0) 2022.11.14
Emit Event  (0) 2022.11.13
Vue Component  (0) 2022.11.11
SFC (Single File Component)  (0) 2022.11.11
Vue_CLI  (0) 2022.11.09

๋Œ“๊ธ€