Study/Vue

Vue.js 시작하기 11. 싱글컴포넌트 사용하여 개발 시작하기

going.yoon 2022. 1. 22. 17:02

App.vue 파일을 활용해서 한번 화면에 데이터를 뿌려보도록 하자.

기존에 html 소스 안에서 뷰 인스턴스를 생성했던 방법과는 아주 조금 다르다.

 

코드를 통해 알아보자

 

<template>
  <div> <!--#1. 최상위 div 태그 선언 후 그 안에 header 등의 컴포넌트들을 선언해줘야 한다.-->
    {{str}}
  </div>
</template>

<script>

/* #2. 기존에 html 파일에서 인스턴스를 생성한 방법 */
// new Vue(){  
//   data : {
//     str: 'hi'
//   }
// }

/* #3. 싱글파일 컴포넌트에서 생성하려 했더니 에러 나는 방법 */
// export default {
//   data : {
//     str : 'hi'
//   }
// }


/* #4. 싱글파일 컴포넌트에서 data를 선언하는 방법 */
export default {
  data : function() {
    return {
      str : 'hi'
    }
  }
}
</script>

<style>

</style>

#1. 싱글 파일 컴포넌트에서 html 을 선언할 때는, 가장 상위에 div 태그를 하나 선언하고 ,

그 안에 header던, body던 생성을 해줘야 한다.

 

#2. 기존에 html 파일에서 뷰 인스턴스 객체를 선언하고 주입해주었던 방식

 

#3. 싱글파일 컴포넌트에서는 이런식으로 변수를 선언해주면 안되고 #4. 방식으로 선언을 해주어야 한다.

 

  그 이유는, 여러 객체들의 재사용성을 높이기 위함으로 변수를 함수형으로 선언하고 , 해당 값을 리턴해주는 형태로 사용한다.

 

 

 

 

 

 

#싱글파일 컴포넌트 체계에서 컴포넌트 등록하기

컴포넌트를 등록하기 위해서는 조건이 있다.

 

    1. 컴포넌트 파일명은 파스칼케이스로 ex. AppHeader.vue

    2. 컴포넌트 파일명은 두 단어 이상의 조합으로 한다( html 표준 태그와 구별되기 위해서 )

 

 

우선 헤더로 쓰일 컴포넌트 파일을 하나 작성해준다. 파일명은 AppHeader.vue

//AppHeader.vue 

<template>
  <header>
      <h1>Header</h1>
  </header>
</template>

<script>
export default {

}
</script>

<style>

</style>

 

 

그리고 이 파일을 헤더로 사용하기 위해서 App.vue 파일에서 import 후 변수로 받아와서 template영역에 태그로 구현해준다.

코드로 알아보자.

 

//App.vue 파일

<template>
  <div> 
    <app-header></app-header> // #3. app-header 태그를 호출함으로써 div 영역 최상위에 AppHeader 내용을 보여준다.
  </div>
</template>

<script>

//#1. AppHeader.vue를 임포트하고 그 이름을 AppHeader라 하겠다.
import AppHeader from './components/AppHeader.vue'

export default {
  data : function() {
    return {
      str : 'hi'
    }
  } ,

//#2. AppHeader를 뷰의 컴포넌트에 주입해준다. 그 이름은 app-header라 하겠다.
  components : {
    'app-header' : AppHeader
  }
}
</script>
<style>
</style>

 

 

#싱글파일 컴포넌트 체계에서 Props 속성 사용하기

현재 컴포넌트의 구조는 

-Root

  -App

    -AppHeader 

 

로 되어있기 때문에 App에서 AppHeader로 데이터를 보내주기 위해서는 props 속성을 사용해야 한다. app-header 태그에 v-bind:props 속성으로 AppHeader의 props 변수와 App의 보내주고자 하는 변수를 맵핑해주면 된다.

 

코드를 통해 알아보자

 

//App.vue 파일

<template>
  <div> 
    <!-- #2. str 값을 Header에 넘겨주기 위해 app-header 태그에서 -->
    <!-- v-bind:"하위컴포넌트의 인자" : "상위컴포넌트에서 넘길 데이터 를 호출한다. -->
    <app-header v-bind:propsdata="str"></app-header>
    
  </div>
</template>

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

export default {
  data : function() {
    return {
      str : '프롭스 내려간다.' // #1. App to AppHeader로 전달할 변수
    }
  } ,
  components : {
    'app-header' : AppHeader
  }
}
</script>
<style>
</style>

 

상위 컴포넌트에서 데이터를 받아오는 AppHeader에서는, 변수를 받아올 props속성만 선언을 해주면 된다.

 

// AppHeader.vue
<template>
  <header>
      <h1>{{propsdata}}</h1>
  </header>
</template>

<script>
export default {
    // #1. props 속성으로 선언한 propsdata라는 이름의 배열 
    props: ['propsdata']
}
</script>
<style>
</style>

 

 

#싱글파일 컴포넌트 체계에서 event 사용하기

이벤트를 사용하기 위해서는, AppHeader에서 $emit을 통해 함수명을 App으로 넘겨준다.

App.vue에서는 app-header 태그 내에서 v-on으로 받아온 함수에 대한 콜백처리를 해준다.

 

//AppHeader.vue

<template>
  <header>
      <h1>{{propsdata}}</h1>
      <button v-on:click="sendEvent">send</button>
      <!-- #1. 버튼을 클릭하면 sendEvent라는 이름의 함수를 호출한다.-->
  </header>
</template>

<script>
export default {
    props: ['propsdata'],
    methods : {
        sendEvent : function () {
        // #2. sendEvent는 상위 컴포넌트에 renew라는 데이터를 넘겨준다.
            this.$emit('renew');
        }
    }
}
</script>
<style>
</style>

 

//App.vue

<template>
  <div> 
  <!-- #. AppHeader 로 보내는 props 속성은 v-bind로,
  		  AppHeader에서 받아온 event 속성은 v-on으로 처리.
  -->
    <app-header v-bind:propsdata="str"
      v-on:renew="renewStr"
    ></app-header>
  </div>
</template>

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

export default {
  data : function() {
    return {
      str : '프롭스 내려간다.'
    }
  } ,
  components : {
    'app-header' : AppHeader
  },
  methods : {
    renewStr : function () {
      // #4. 이벤트를 받아왔을 때 처리할 renewStr 함수 
      this.str = '이벤트 받았따.';
    }
  }
}
</script>
<style>
</style>

 

해당 포스팅은 인프런의 Vue.js 시작하기 - Age of Vue.js 학습 후 정리한 내용임을 알려드립니다.