공부/Vue.js

Vue.js 초기 세팅법

도리암 2022. 3. 20. 20:21

시작하기

vue.js는 cdn만 가지고도 프로젝트 시작 가능.
프로젝트를 관리하려면 npm으로 설치해서 사용하는 것이 용이.

cdn이나 npm으로 Vue.js를 설치하면 전역객체인 Vue를 사용할 수 있다.

<script src="https://unpkg.com/vue@next"></script>
<div id="app">
  <h1> {{ message }} </h1>
</div>
Vue.createApp({
  data() {        // data: function() { }를 줄여서 사용한다.
    return {
      message: 'Hello Vue!'
    }
  }
}).mount('#app')

Vue CLI, Vetur

터미널을 통해 vue.js 프로젝트를 만들 수 있다.
그러기 위해선 vue CLI 기능을 설치해야 한다.

npm install -g @vue/cli

참조) Vue CLI

다음의 명령어들을 입력하면 vs code로 프로젝트 폴더를 열 수 있다.

vue create 폴더명
cd 폴더명           // 해당 폴더로 이동
code . -r

vue는 내부적으로 webpack 번들러를 사용한다.

main.js

import { createApp } from 'Vue'
import App from './App.vue'

createApp(App).mount('#app')

createApp 앞에는 원래 Vue.라는 객체가 붙어야 하나 import를 통해 createApp을 가져오므로 생략된다.

App.vue

.vue 파일의 코드를 하이라이팅 하기 위해서는 확장 프로그램인 Vetur 를 사용한다.
vue 파일(Single File Component. SFC)은 다음의 구조로 구성된다.

  • template
  • script
  • style

선언적 렌더링과 입력 핸들링 (반응성)

App.vue

<template>
  <h1 @click="increase">
    {{ count }}
  </h1>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increase() {
      this.count += 1
    }
  }
}
</script>

<style>
h1 {
  font-size: 50px;
  color: royalblue;
}
</style>

화면에는 count의 내용이 출력되며 그것을 출력할 때마다
increase() 함수가 실행되어 count의 값이 증가한다.
count가 갱신되면 화면의 내용도 갱신된다( 반응성 )

데이터를 정의하고 그것을 갱신하는 이벤트 핸들러.

조건문과 반복문

디렉티브(Directive) : v- 으로 시작하는 속성들.
반복문의 경우 배열데이터가 필요하다.

App.vue

<template>
  <h1 @click="increase">
    {{ count }}
  </h1>
  <div v-if="count > 4">
    4보다 큽니다!
  </div>
  <ul>
    <li
      v-for="fruits in fruits"
      :key="fruit">
      {{ fruit }}
    </li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
      fruits: ['Apple', 'Banana', 'Cherry']
    }
  },
  methods: {
    increase() {
      this.count += 1
    }
  }
}
</script>

<style lang="scss">
h1 {
  font-size: 50px;
  color: royalblue;
}
ul {
  li {
    font-size: 40px;
  }
}
</style>

컴포넌트 연결하기

Fruit.vue

<template>
  <li>{{ name }}</li>
</template>

<script>
export default {
  props: {
    name: {
      type: String,
      default: ''
    }
  }
}
</script>

<style scoped lang="scss">
<!-- scoped는 해당 컴포넌트에만 유효범위를 설정한다. -->
  h1 {
    color: red !important;
  }
</style>

App.vue

<template>
  <h1 @click="increase">
    {{ count }}
  </h1>
  <div v-if="count > 4">
    4보다 큽니다!
  </div>
  <ul>
    <hello
      v-for="fruits in fruits"
      :key="fruit"
      :name="fruit">
      {{ fruit }}
    </hello>
  </ul>
</template>

<script>
import Fruit from './components/Fruit' //.vue 생략 가능

export default {
  components: {
    hello: Fruit
    // Fruit: Fruit로 바꿀 수 있다.
    // 속성 이름과 데이터 이름이 같은 경우 : 뒤쪽을 생략할 수 있다.
  },
  data() {
    return {
      count: 0,
      fruits: ['Apple', 'Banana', 'Cherry']
    }
  },
  methods: {
    increase() {
      this.count += 1
    }
  }
}
</script>

<style lang="scss">
h1 {
  font-size: 50px;
  color: royalblue;
}
ul {
  li {
    font-size: 40px;
  }
}
</style>