Vue.js

1. 뷰 코딩 시작

sdafdq 2023. 9. 18. 18:10

src 보면

App.vue랑 또 components 폴더 보면 또 .vue 파일이 있다.

 

이런 vue파일들을 컴포넌트라고 한다.

이런 컴포넌트를 모으는 메인 컴포넌트가 App.vue인 것 같다.

컴포넌트를 개발하여 저 App.vue라는 메인 컴포넌트에 붙이는 형식인 것 같다.

 

또, src보면 main.js 라고 있는데,

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

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

이렇게 되어 있다.

먼저, vue 라이브러리에서 createApp이라는 이름으로 객체로써 import하고, (vue를 createApp이라는 객체로 만들었다고 생각하면 될 듯.)

메인 컴포넌트인 App.vue를 App이라는 이름으로 import 한 다음,

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

vue.mount('#app') 과 같다.

 

mount는 뭔가를 연결시켜주는? 그런거다. 즉, #app이라는 것과 createApp(App).mount(#app) App이라고 명명한 App.vue를 연결시켜준다는 건데,

저 #app이란 것은 어디에 있냐면,

public -> index.html에 가보면

<!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">
    <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>

이렇게 되어 있다.

id="app" 저 곳과 연결하는 거다. 즉, App.vue에 적용한 것을 저 <div id="app"></div> 이 공간과 연결시킨다는 것이다. 

 

 

asset폴더

이거는 resouces폴더라고 할까? 이미지나 그런 거 저장해 놓는 곳.

 

 

 

 

자, 이제 제대로 뷰 템플릿을 살펴보자.

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <HelloWorld msg="Hello vue!!!"/>
</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>

html과 비슷하게 생각해보자.

template가 있다. 저 파트가 우리가 이제 실제로 보여지는 html의 body파트라고 생각하면 된다.

태그도 똑같은데, 조금 다른게 <HelloWorld msg="Hello vue!!!"/> ?  이건 뭘까. 아래 스크립트 란을 보자.

놀랍게도 ./components/ 경로에 있는 HelloWorld.vue라는 컴포넌트를 HelloWorld라는 이름으로 import 했다.

export는 밖으로 나갈 때 정의되어지는 이름 같은데, components에는 자기가 사용한 컴포넌트들 정의해 놓는 것 같다.

왜냐하면 밖에서 이거 불러다 쓰려면 어떤 다른 컴포넌트 썼는지도 알아서 불러와야 하니까.

 

스타일은 그냥 스타일이다.

#app 이렇게 되어 있는데, 아까 App.vue랑 연결되어 있다고 말했다. 즉, 저 스타일은 그 연결한 #app에 쓰려고 한 것이다. 아무래도 메인 컴포넌트 이다 보니, 여기에 정의한 것 같다.

참고로 이따 보겠지만, scope 라는 게 있다.

 

여튼 이런 식 컴포넌트를 script에서 import해서 불러오면, 쓸 수 있는 것 같다.

<HelloWorld msg="Hello vue!!!"/>  템플릿 파트에서 태그로 쓰는 것 같다. msg를 속성으로 값을 줬는데, 한번 HelloWorld.vue를 실제로 들어가 보자.  

 

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>

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

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

</style>

필요 없는 거 많이 지우긴 했다.

한번 보자.

템플릿 파트에서는 그냥 hello클래스의 div에, 거기 안에 h1태그가 있는데 {{msg}}?

아, 스크립트의 변수를 {{변수명}} 이렇게 사용하는 구나.

 

스크립트 파트를 보자.

export 라는 것은 직역으로 내보내다, 라는 뜻인데. 내보낼 때 이름은 HelloWorld, props는 properties의 준 말로, 객체의 필드를 의미한다. 무언가로 내보낼 때도 객체로 내보내는 느낌이다.

여튼, 거기서 속성은 msg: String 타입으로 가지고 있다.

 

다시 App.vue를 보면 

<HelloWorld msg="Hello vue!!!"/>

아, 이게 객체의 필드를 속성이라고도 하는데, 태그의 속성 주듯이 프로퍼티에 이렇게 주는구나.

export라고 하는 것은, 외부와의 소통, 이라기 보다는 더 직접적으로는 외부에서 이걸 어떻게 사용해야 하는지에 대한 정의. 라고 보면 될 듯 하다. ~~~ 이렇게 해서 바깥으로 export 시킨다는 뜻이니까.

 

App.vue에서 호출할 때 

<HelloWorld msg="Hello vue!!!"/>

이렇게 프로퍼티에 값을 줬고.

 

 

HelloWorld.vue에서

msg를 프로퍼티로 받을 수 있고,

 

<h1>{{ msg }}</h1>

이렇게 사용했다.

 

 

호출 순으로 보자면,

#app과 App.vue를 연결한 거니까

<div id="app">

    <App>

        <HelloWorld msg="Hello vue!!!">

        </HelloWorld>

    <App>

</div>

 

이런 느낌이다.

App이 또 템플릿 내부에다가 HelloWorld컴포넌트를 호출했으니까.

 

<style scoped>
</style>

여기서 scoped 라는 것은, 이 컴포넌트에서만 스타일을 적용한다는 뜻이다.

 

 

지금 정리가 두서가 없는데,

뷰 컴포넌트의 기본 구조, 호출방법

이렇게 정리하면 명확하겠다.

'Vue.js' 카테고리의 다른 글

v-bind, data()  (0) 2023.09.20
3. 스크립트 파트  (0) 2023.09.19
2. 뷰 컴포넌트의 기본 구조  (0) 2023.09.19
뷰 설치  (0) 2023.09.18
뷰의 구조  (0) 2023.09.13