이안의 평일코딩

[Vue] props 대신 slot을 써보자 본문

Front-end/Vue

[Vue] props 대신 slot을 써보자

이안92 2021. 5. 14. 18:28
반응형

 slot으로 부모 -> 자식 데이터 전송법

 

FilterBox.vue (자식)
<div :class="filter + ' filter-item'" :style="`background-image:url(${image})`">
<slot></slot>
</div>

1. 자식 컴포넌트에서 데이터를 받아오고 싶은 곳에 을 넣는다. (출력될 위치)

 

Container.vue (부모)
<FilterBox :filter="filter" :image="image" v-for="filter in filters" :key="filter">
  <span>{{filter}}</span>
</FilterBox>

2. <컴포넌트></컴포넌트> 태그사이에 데이터를 넣는다.

 

 slot 여러개 사용하기

 

name 속성을 주면 된다. (복잡하니 그냥 props 쓰자)

 

FilterBox.vue (자식)
<div>
  <slot name="a"></slot>
  <slot name="b"></slot>
</div>

1. <slot name="작명"></slot>

 

Container.vue (부모)
<FilterBox>
  <template v-slot:a> 데이터1 </template>
  <template v-slot:b> 데이터2 </template>
</FilterBox>

 

2. <template v-slot:작명>보낼거</template>

 

 

 slot props

 

slot 사용할 때 부모가 자식데이터 필요한 경우.

 

FilterBox.vue (자식)
<template>
  <div>
   <slot :msg="msg"></slot>
  </div>
</template>

<script>
export default {
  name : 'filterbox',
  data(){
    return{
      msg : 'hello'
    }
  },
}
</script>

1. <slot :자식데이터="자식데이터">

 

Container.vue (부모)
<FilterBox>
  <template v-slot:default="작명"> <span>{{작명.msg}}</span> </template>
</FilterBox>

2. 부모는 <template v-slot="작명">{{작명.자식데이터}}</template>

 

 

 slot의 한계

 

slot은 HTML에만 가능하고 속성안에는 쓸 수 없다. <div 안에서 <slot></slot>속성으로 못씀>

즉, 간단히 전송하고 싶거나 태그로 담아서 데이터를 전송하고 싶을 때 사용하자.

반응형
Comments