slot


https://ryuzuka.github.io/VUE/tutorial/11_slot.html


  • slot

컨텐츠 배포 - 자식 컴포넌트의 지정된 <slot> 위치에 부모 컴포넌트의 컨텐츠가 삽입된다.

 - 부모 컴포넌트가 비어있고 <slot> 내부에 컨텐츠가 존재하면 <slot> 자체의 컨텐츠가 렌더링 된다. - 대체 컨텐츠

 - 하위 컴포넌트 템플릿에 최소한 하나의 <slot> 콘텐츠가 포함되어 있지 않으면 부모 콘텐츠가 삭제된다.

 - 상위 템플릿의 모든 내용은 상위 범위로 컴파일된다. 하위 템플릿의 모든 내용은 하위 범위에서 컴파일된다.

<div id="app">
<post>
컨텐츠 배포 - 컴포넌트의 마크업 확장
</post>
</div>
<script>
Vue.component( 'post', {
template: `
<div>
<p>
<slot></slot>
</p>
</div>
`
});

new Vue({
el: '#app'
});
</script>


  • 이름을 가지는 slot

자식 컴포넌트에 <slot name="..."> 속성을 지정하고 부모 컴포넌트의 마크업에 slot="..." 속성을 지정하면 해당하는 <slot> 위치에 렌더링 된다.
<div id="app">
<post>
<h3 slot="title">{{ title }}</h3>
<p slot="contents">{{ contents }}</p>
</post>
</div>
<script>
Vue.component( 'post', {
template: `
<div>
<slot name="title"></slot>
<slot name="contents"></slot>
</div>
`
});

new Vue({
el: '#app',
data: {
title: '이름을 가지는 slot',
contents: '일치하는 name 속성값을 가진 slot위치로 렌더링 된다.'
}
});
</script>

  • 범위를 가지는 slot

범위를 가지고 있는 <slot v-for="..."> 의 경우 <template scope="..."> 통해 처리할 수 있다.

<div id="app">
<scope-component>
<template scope="fruits">
<li>{{ fruits.fruitName }}: {{ fruits.price }}</li>
</template>
</scope-component>
</div>
<script>
Vue.component( 'scope-component', {
template: `
<div>
<ul>
<slot v-for="item in fruits" :fruit-name="item.name" :price="item.price"></slot>
</ul>
</div>
`,
data: function () {
return {
fruits: [
{
name: 'Apple',
price: 1500
},
{
name: 'Banana',
price: 900
}
]
};
}
});

new Vue({
el: '#app',
});
</script>


'Vue' 카테고리의 다른 글

믹스인  (0) 2019.02.09
동적 컴포넌트 ( is, keep-alive )  (0) 2019.02.08
event bus  (0) 2019.02.08
사용자 정의 이벤트  (0) 2019.02.06
props  (0) 2019.02.05