๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง 2022.05.09.์›”

by DevIseo 2022. 5. 9.

workshop - Vue CLI

์˜ค๋Š˜์€ Node.js๋ฅผ ์„ค์น˜ํ•˜๊ณ  Vue CLI๋ฅผ ์ด์šฉํ•ด Vue Router์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋กœ๋˜๋ฒˆํ˜ธ ์ถ”์ฒจ๊ธฐ(?)์™€ ์ ์‹ฌ๋ฉ”๋‰ด๋ฅผ ๊ณ ๋ฅด๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ œ๋ฅผ ํ–ˆ๋‹ค. javascript๋งŒ์„ ์ด์šฉํ•ด ์ด ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ์‚ฌ์‹ค ์ข€ ํž˜๋“ค์—ˆ๋Š”๋ฐ, lodash๋ฅผ importํ•ด์„œ ์“ฐ๋‹ˆ ์ˆซ์ž๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ๋„ ํ›จ์”ฌ ์ €๋ฒˆ๋ณด๋‹ค ํŽธํ–ˆ๋‹ค!๋˜ํ•œ ์ ์‹ฌ๋ฉ”๋‰ด ๊ณ ๋ฅด๋Š” ๊ฒƒ๋„ lodash๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ์ฝ”๋“œ๊ฐ€ ํ•œ๊ฒฐ ๊ฐ„๋žตํ•ด์ง„๊ฑฐ ๊ฐ™๋‹ค. ๋˜ํ•œ, Vue CLI๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•˜๋‹ˆ ์ „๋ณด๋‹ค ํ›จ์”ฌ ๊น”๋”ํ•˜๊ณ  ๋น„๋™๊ธฐํ™” ์‹œํ‚ค๋Š” ๊ฒƒ๋„ ์•Œ์•„์„œ ๋˜๋‹ˆ๊นŒ ์ข‹์€๊ฑฐ ๊ฐ™๋‹ค. ์ง€๋‚œ์ฃผ์™€ ๊ทธ์ „ ์ฃผ์—๋Š” javascript์— ์ ์‘ํ•˜๋А๋ผ ํž˜๋“ค์—ˆ์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜๋Š”๊ฑด ์•„์ง ์–ด๋ ค์›Œ๋„ ์žฌ๋ฐŒ๋Š”๊ฑฐ ๊ฐ™๋‹ค.

App.vue

<template>
  <div id="app">
    <nav>
      <router-link :to="{name: 'lunch'}">Lunch</router-link> |
      <router-link :to="{name: 'lotto',params:{ lottoNum:6 } }">Lotto</router-link>
    </nav>
    <router-view/>
  </div>
</template>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;
}

nav a {
  font-weight: bold;
  color: #2c3e50;
}

nav a.router-link-exact-active {
  color: #42b983;
}
</style>

router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import LunchView from '../views/LunchView.vue'
import LottoView from '../views/LottoView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/lunch',
    name: 'lunch',
    component: LunchView
  },
  {
    path: '/lotto/:lottoNum',
    name: 'lotto',
    component:LottoView

  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

 

lodash๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด bash์—์„œ lodash ์„ค์น˜ํ•˜๊ธฐ

npm i lodash

views/LunchView.vue

<template>
  <div>
    <h1>์ ์‹ฌ๋ฉ”๋‰ด</h1>
    <button @click="pickLunch">Pick Lunch</button>
    <p>{{ selectedLunchMenu }}</p>
    <br>
    <hr>
    <h1>๋กœ๋˜๋ฅผ ๋ฝ‘์•„๋ณด์ž</h1>
    <button @click="moveToLotto">Pick Lotto</button>
  </div>
</template>

<script>
import _ from 'lodash'

export default {
  name: 'LunchView',
  data: function(){
    return { selectedLunchMenu:''} 
  },
  methods: {
    moveToLotto() {
      this.$router.push({ name: 'lotto', params:{lottoNum:6}})
    },
    pickLunch() {
      this.selectedLunchMenu= _.sample(['ํ”ผ์ž','์น˜ํ‚จ','์‚ผ๊ฒน์‚ด','๊ฟ”๋ฐ”๋กœ์šฐ','ํƒ„ํƒ„๋ฉด','๋ผ๋ฉ˜','์—ฐ์–ด์ดˆ๋ฐฅ','๋ง‰๊ตญ์ˆ˜'])
    }
  }
}
</script>

<style>

</style>

views/LottoView.vue

<template>
  <div>
    <h1>๋กœ๋˜</h1>
    <button @click="getLuckyNums">Get Lucky Numbers</button>
    <p>{{ selectedLuckyNums }}</p>
  </div>
</template>

<script>
import _ from 'lodash'

export default {
  name:'LottoView',
  data: function() {
    return {
      selectedLuckyNums: [],
    }
  },
  methods: {
    getLuckyNums: function(){
      const numbers = _.range(1,46)
      this.selectedLuckyNums = _.sampleSize(
        numbers,
        this.$route.params.lottoNum,
      )
    }
  }
}
</script>

<style>

</style>

๋Œ“๊ธ€