본문 바로가기

Dev/[Vue.js]

[Vue.js] Vue.js 시작하기 (Hello World)

반응형

 

Vuejs 실습할 때 아래 사이트에서 실습해보면 된다.

 

 

jsbin.com/gonasotehe/edit?html,js,output

 

 

JS Bin

Sample of the bin:

jsbin.com

 

 

 

 

1. HelloWorld 예제

 

html

<body>
<div id="app">
<h1>Hello, {{ name }}</h1>
</div>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>

 

 

javaScript

// 새로운 뷰를 정의합니다
var app = new Vue({
  el: '#app', // 어떤 엘리먼트에 적용을 할 지 정합니다
  // data 는 해당 뷰에서 사용할 정보를 지닙니다
  data: {
    name: 'Vue'
  }
});

 

 

 

2. Vue Directive 

(뷰 지시문, 엘리먼트에게 지시하는 문장)

 

1) v-text (one way binding)

1.에서 해봤던 {{  }} 를 사용하는 대신에 v-text라는 디렉터리를 사용한다.

데이터->뷰의 형태로 바인딩이 되어있어서 데이터의 값이 변하면 뷰가 업데이트된다.

 

html

<div id="app">
<h1>Hello, <span v-text="name"></span></h1>
</div>

 

 

2) v-html

html을 렌더링해야 할 때 사용한다.

 

html

<div id="app"> 
	<h1>Hello, <span v-html="name"></span></h1> 
</div>

 

javascript

var app = new Vue({
	el: '#app', 
    data: { 
    name: '<i>Vue</i>' 
    } 
});

 

 

 

3) v-show

엘리먼트가 보여질지 말지를 true/false 값으로 지정하는 지시문.

 

html

<div id="app"> 
	<h1>Hello, <span v-show="visible" v-html="name"></span></h1> 
</div>

 

javascript

var app = new Vue({ 
	el: '#app', 
    data: {
    	name: '<i>Vue</i>', 
        visible: true 
    } 
});

 

 

4) v-if / v-else / v-else-if

 

html

<div id="app">
	<h1 v-if="value > 5">value가 5보다 큽니다</h1>
	<h1 v-else>value가 5보다 작아요</h1>
</div>

 

javascript

var app = new Vue({
  el: '#app',
  data: {
    value: 0
  }
});

 

5) v-bind

html엘리먼트의 '속성' 의 값을 Vue 엘리먼트의 데이터로 설정하고 싶을 때 사용

 

html

<div id="app">
<h1>Hello, {{ name }}</h1>
<img :src="flag ? vuelogo : anglogo"/>
</div>

 

javascript

var app = new Vue({
  el: '#app',
  data: {
    name: 'Vue',
    flag: true,
    vuelogo: 'https://vuejs.org/images/logo.png',
    anglogo: 'https://angular.io/assets/images/logos/angular/angular.svg'
  }
});

 

6) v-for

반복문

html

<div id="app">
  <h2>오늘 할 일</h2>
  <ul>
    <li v-for="todo in todos">{{ todo.text }}</li>
  </ul>
</div>

javascript

var app = new Vue({
  el: '#app',
  data: {
    todos: [
      { text: 'Vue.js 튜토리얼 작성하기' },
      { text: 'Webpack2 알아보기' },
      { text: '사이드 프로젝트 짂행하기' }
    ]
  }
});

index값을 받아올 수도 있다.

<div id="app">
<h2>오늘 할 일</h2>
<ul>
<li v-for="(todo, index) in todos"> {{index}} {{ todo.text }}</li>
</ul>
</div>

 

 

7) v-model(two-way-model)

뷰 ⇄ 데이터 형태로 바인딩하여 데이터가 양방향으로 흐르게 해주는 것

html

<div id="app">
  <h1>Hello, {{ name }}</h1>
  <h3><input type="checkbox" v-model="flag"/>Logo 이미지</h3>
  <img :src="flag ? vuelogo : anglogo"/>
</div>

 

javascript

var app = new Vue({
  el: '#app',
  data: {
    name: 'Vue',
    flag: true,
    vuelogo: 'https://vuejs.org/images/logo.png',
    anglogo: 'https://angular.io/assets/images/logos/angular/angular.svg'
  }
});

 

 

 

 

 

프로젝트 만들어서 실습해보기

 

VSCode켜고, 폴더 하나 생성한다.

 

이후 terminal실행 하고 Power shell을 cmd.exe로 바꿔준다.

 

이후 vue 프로젝트를 하나 만들어준다.

 

이 CMD 창에 아래와 같이 입력

 

vue create vue-todo

하면 이제 설치를 시작한다. 설치 시 Vue와 다른 프레임워크를 어떻게 조합해서 사용할건지 선택한다.

나는 그냥 default 설정으로 했다.

 

 

 

프로젝트 생성 완료

 

 

 

터미널에서 npm run serve를 입력하면, package.json파일에 있는 아래 내용이 실행되는것이다.

이게 프로그램 배포하는것

 

이후 컨트롤+저 링크를 클릭하면, 브라우저로 기본 화면이 열린다.

 

 

F12를 눌러 개발자도구로 들어가면 아래와 같이 Vue 탭이 생기고 여기서 엘리먼트들을 확인할 수 있다.

 

 

 

Vue의 구조는 아래와 같음

index.html에는 div태그 하나밖에 없다.

이 div태그의 Id는 app이다. 이 app에다가 뭘 넣어주는 것이 App.vue이다.

그런데 이 App.vue로 연결시켜주는 main.js파일이 있다.

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

 

 

main.js로 가보면 app.vue파일이 import되어 있는것을 볼 수 있고, Vue 객체가 만들어져 있다.여기서 이제 App.vue로 연결된다.

 

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

 

 

이 app.vue로 가보면, css도 정의되어 잇고, name이 app이라는 것을 Export시켜주고 있다.

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

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

그럼 component의 HelloWorld.vue파일로 가보면 이제 실제 구현부가 드러난다.

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <p>
      For a guide and recipes on how to configure / customize this project,<br>
      check out the
      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
    </p>
    <h3>Installed CLI Plugins</h3>
    <ul>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
    </ul>
    <h3>Essential Links</h3>
    <ul>
      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
    </ul>
    <h3>Ecosystem</h3>
    <ul>
      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
    </ul>
  </div>
</template>

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

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

 

 

이렇게 분리해서 개발. 그리고 .vue파일은 구조가 아래와 같다.

여기서 Style에 scoped 옵션이 들어가게되면 이 컴포넌트에서만 CSS를 적용하겠다는 뜻이다.

 

<template>

</template>

 

<script>

</script>

 

<!-- Add "scoped" attribute to limit CSS to this component only -->

<style scoped>

</style>

 

반응형