๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/Vue.js

[Vue.js] ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ๋ธ”๋กœ๊ทธ ๊ธ€๋ชฉ๋ก ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 4. 5.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ๋ฐ์ดํ„ฐ๋ฅผ JavaScript ํŒŒ์ผ์— ์ €์žฅํ•˜์—ฌ export / import ํ•ด์ค€ ๋‹ค์Œ props ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” Component ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก ๋ฐ ๋“ฑ๋กํ•œ ํ›„์— ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ฃผ์—ˆ๋‹ค. 
  • ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์ด ๋ชฉ์ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹จ๋ฉ”๋‰ด๋Š” Bootstrap ์„ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค๊ณ , ์ „์ฒด์ ์œผ๋กœ ์‹ฌํ”Œํ•˜๊ฒŒ ๋””์ž์ธ์„ ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿ’œ ๋ธ”๋กœ๊ทธ ๊ธ€๋ชฉ๋ก ๋ ˆ์ด์•„์›ƒ ๋งŒ๋“ค๊ธฐ

  • ๋ธ”๋กœ๊ทธ ๊ธ€๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” List ๋ผ๋Š” Component ๋ฅผ ๋งŒ๋“ค์–ด์„œ App.vue ์— ๋ณด์—ฌ์ฃผ๊ธฐ๋กœ ์ •ํ–ˆ๋‹ค.
  • ์ด๋Š” props ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋ผ ๋ณต์Šต๋„ ํ• ๊ฒธ ๊ฐ•์˜ ๋“ฃ๊ธฐ ์ „์— ํ˜ผ์ž์„œ ๋จผ์ € ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค.

๐Ÿค List.vue ํŒŒ์ผ ๋งŒ๋“ค์–ด ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

<template>
  <div>
    <h5>๋ธ”๋กœ๊ทธ ๊ธ€ ์ œ๋ชฉ</h5>
    <p>๋ธ”๋กœ๊ทธ ๊ธ€ ๋‚ ์งœ</p>
  </div>
  <div>
    <h5>๋ธ”๋กœ๊ทธ ๊ธ€ ์ œ๋ชฉ</h5>
    <p>๋ธ”๋กœ๊ทธ ๊ธ€ ๋‚ ์งœ</p>
  </div>
  <div>
    <h5>๋ธ”๋กœ๊ทธ ๊ธ€ ์ œ๋ชฉ</h5>
    <p>๋ธ”๋กœ๊ทธ ๊ธ€ ๋‚ ์งœ</p>
  </div>
</template>
<script>
export default {
}
</script>
<style>

</style>
  • ๋จผ์ € List.vue ํŒŒ์ผ์—๋Š” ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ๋‚˜์ค‘์— ๋ธ”๋กœ๊ทธ ๊ธ€ ์ œ๋ชฉ, ๋ธ”๋กœ๊ทธ ๊ธ€ ๋‚ ์งœ ๋ผ๊ณ  ์ ํžŒ ๋ถ€๋ถ„์€ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

๐Ÿค App.vue ํŒŒ์ผ์— List Component ์ถ”๊ฐ€ํ•˜๊ธฐ

<List />
  • ์ด์ œ App.vue ํŒŒ์ผ์˜ <template></template> ์‚ฌ์ด์˜ ์›ํ•˜๋Š” ์œ„์น˜์— ์œ„์™€ ๊ฐ™์ด List Component ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

๐Ÿ’œ ๋ธ”๋กœ๊ทธ ๊ธ€๋ชฉ๋ก ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ

๐Ÿค ๋ธ”๋กœ๊ทธ ๊ธ€๋ชฉ๋ก ๋ฐ์ดํ„ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

[
    { 
      title : '์ฒซ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ : ํ—ˆ์œ„๋งค๋ฌผ ์ „๋ฌธ ๋ถ€๋™์‚ฐ ์•ฑ',
      content : 'Vue๋ฅผ ์ด์šฉํ•˜๋ฉด ๋น„๋ˆ„๊ฐ™์ด ๋งค๋ˆํ•œ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค',
      date : 'September 24, 2021',
      number : 0
    },{ 
      title : '๋‘๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ : ์˜ค๋งˆ์นด์„ธ ๋ฐฐ๋‹ฌ ์•ฑ',
      content : '์Œ์‹์ด ์•„๋‹ˆ๋ผ ์…ฐํ”„๋ฅผ ์ง์ ‘ ๋ฐฐ๋‹ฌํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค',
      date : 'October 20, 2020',
      number : 1
    },{ 
      title : '์„ธ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ : ํ˜„ํ”ผ ์•ฑ',
      content : '๊ฑฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํŒŒ์ดํ„ฐ๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ ค์š”! ์„œ๋กœ ์‹ธ์›Œ๋ณด์„ธ์š”',
      date : 'April 24, 2019',
      number : 2
    }
];
  • ์ด์ œ ๊ฐ•์‚ฌ๋‹˜์ด ์ค€๋น„ํ•ด์ฃผ์‹  ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ App.vue ์— ์ €์žฅํ•œ ๋’ค, props ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ List.vue ๋กœ ๋ฐ›์•„์™€ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  JavaScript ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

export default [
    { 
      title : '์ฒซ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ : ํ—ˆ์œ„๋งค๋ฌผ ์ „๋ฌธ ๋ถ€๋™์‚ฐ ์•ฑ',
      content : 'Vue๋ฅผ ์ด์šฉํ•˜๋ฉด ๋น„๋ˆ„๊ฐ™์ด ๋งค๋ˆํ•œ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค',
      date : 'September 24, 2021',
      number : 0
    },{ 
      title : '๋‘๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ : ์˜ค๋งˆ์นด์„ธ ๋ฐฐ๋‹ฌ ์•ฑ',
      content : '์Œ์‹์ด ์•„๋‹ˆ๋ผ ์…ฐํ”„๋ฅผ ์ง์ ‘ ๋ฐฐ๋‹ฌํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค',
      date : 'October 20, 2020',
      number : 1
    },{ 
      title : '์„ธ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ : ํ˜„ํ”ผ ์•ฑ',
      content : '๊ฑฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํŒŒ์ดํ„ฐ๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ ค์š”! ์„œ๋กœ ์‹ธ์›Œ๋ณด์„ธ์š”',
      date : 'April 24, 2019',
      number : 2
    }
];
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์œผ๋ฉด ๊ตณ์ด JavaScript ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, ๋ณดํ†ต์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋‚˜๋Š” src/assets ๊ฒฝ๋กœ์— blog.js ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์™€ ๊ฐ™์ด export ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿค App.vue ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ blog.js ํŒŒ์ผ ๋ถˆ๋Ÿฌ์™€ ๋“ฑ๋กํ•˜๊ธฐ

<script>
import blog from './assets/blog'

export default {
  name: 'App',
  data(){
    return {
      posts : blog,
    }
  },
  components: {
  }
}
</script>
  • App.vue ๋กœ ๋Œ์•„์™€์„œ blog.js ํŒŒ์ผ์„ blog ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ import ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.
  • import ๋ฅผ ํ•˜๊ณ ๋‚˜๋ฉด ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•œ๋ฐ, ์ด๋Š” data ๋ณด๊ด€ํ•จ์—์„œ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
  • ๋‚˜์˜ ๊ฒฝ์šฐ, blog ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ posts ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿค props ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ List.vue ๋กœ ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๊ธฐ

<List :posts="posts" />
  • ๊ธฐ์กด์— ์ž‘์„ฑํ•ด๋‘” <List/> ์— :posts="posts" ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ posts ๋ผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ posts ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ List Component ๋กœ ์ „์†ก๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿค List.vue ๋กœ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ฑ๋กํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ

<template>
<div class="container" id="posts">
  <div class="post" v-for="(post, i) in posts" :key="i">
      <span class="post-title">{{post.title}}</span>
      <span class="post-date">{{post.date}}</span>
  </div>
</div>
</template>

<script>
export default {
    name: 'List',
    data(){
        return {
        }
    },
    props: {
        posts : Array,
    },
}
</script>

 

  • ๋จผ์ €, props ๋กœ ๋ฐ›์•„์˜จ posts ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ <script></script> ๋‚ด์— props: { posts : Array } ๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•ด์ฃผ์—ˆ๋‹ค.
  • ์ด์ œ ๊ทœ์น™์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ”์ค€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ฃผ์—ˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•