본문 바로가기
vue.js/기술

[vue] v-slot

by 냉면돈가스 2022. 1. 19.

컴포넌트의 디자인을 바로 아래에 있는 컴퍼넌트에 전달해 재활용할 수 있는 기능이다.


부모 컴퍼넌트에 v-slot (#title) 로 정의 후

<template>
  <About ref="about">
    <template #title>
      <div>
        <h1>제목입니다</h1>
      </div>
    </template>
  </About>
</template>

export default {
  name: 'Home',
  components: {
    About
  },
}

자식 컴퍼넌트에 <slot name="title"></slot>를 이용해여 재활용한다

<slot name="title"></slot>

 

about 이라는 자식컴퍼넌트에선 <template #title></template> 로 감싸진 화면을

손쉽게 재활용 가능


동적으로 slot 할당하기

 

 

slotNum 데이터를 이용해 slot id를 동적으로 부여했다.

버튼을 클릭할때마다 slot id가 1,2를 왕복하며 움직인다.

 

//부모 컴퍼넌트

<template>
  <div id="app">
    <HelloWorld :msg="msg" >
      <template v-slot:[slotNum]>
        {{slotNum}}
      </template>
    </HelloWorld>
    <button @click="slotNum = slotNum===1 ? 2 : 1"></button>
  </div>
</template>

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

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  data() {
    return {
      slotNum:1,
      msg:"Welcome to Your Vue.js App"
    }
  },
}
</script>

 

//자식컴퍼넌트

<template>
  <div class="hello">
    <slot name="1">1번쨰 슬롯</slot>
    <p>슬롯바깥</p>
  </div>
</template>

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

 

slotNum이 1일때에는

"슬롯바깥"이 출력되고

slotNum이 2일때에는  "1번째 슬롯"과 "슬롯바깥"이 출력된다.

 

동적으로 슬롯이 연결됨을 확인했음


slot으로 emit과 같은 효과를 받아올 수 있다.

 

v-slot을 이용해 같은 화면을 여러 번 뿌려주나,

데이터는 각각 다르게 바인딩 시키고 싶을 수 있음.

 

그럴때는 자식컴퍼넌트에서

props를 보내듯이 아래예시처럼 작성함

 

//자식 컴퍼넌트

<template>

    <slot name="name" :text="'text입니다'" :number="5"></slot>
    <slot name="name2" :text="'text2입니다'" :number="56"></slot>

</template>

 

그 후, 부모 컴퍼넌트에서는 자유로운 이름으로 데이터를 객체형태로 받아올 수 있고

(아래 예시에서는 "slotEmits")

원하는곳에 데이터바인딩을 통해 표현함

 

 

//부모 컴퍼넌트

<HelloWorld>
    <template #name="slotEmits">
      {{slotEmits.text}}
      {{slotEmits.number}}
    </template>
</HelloWorld>

slotEmits를 받아올 때는 아래와 같은 문법으로도 사용가능함

 

//부모 컴퍼넌트


slot 자식컴퍼넌트에서 각각의 고유한 데이터를 받아와 뿌려주는 기법은

v-for을 이용할 때 사용할 수 있을듯 해서 예시코드를 작성 해봄

 

//부모 컴퍼넌트

 

//자식 컴퍼넌트 

 

 

'vue.js > 기술' 카테고리의 다른 글

[vue] emit을 props처럼 관리하기  (0) 2022.02.24
[vue] provide / inject  (2) 2022.01.19
[vue] props  (0) 2022.01.19
[vue] vue 키 이벤트  (0) 2022.01.19
[vue] watch / computed / watcheffect  (0) 2022.01.19

댓글