버튼과 셀렉트 리스트가 있는 모달을 컴포넌트로 만드는 과정에서 찾아봤습니다. 버튼을 누르면 모달이 열리는 상황에서 모달의 열림/닫힘 여부를 컴포넌트에서 관리하고 모달의 내용은 slot으로 받아 조금 더 유연하게 만드는게 목적 이였으나, 슬롯 사용자는 제공자의 컨텍스트에 접근할 수 없다보니 어떻게 하면 모달을 닫을 수 있을까 하다 찾아봤습니다.
<div class="carousel">
<div class="slides" ref="slides">
// (1) scope로 이벤트 전달
<slot :next="next" :close="close"></slot>
</div>
<footer>
<!-- Other carousel controls like arrows, indicators etc go here -->
</footer>
</div>
// (2) 전달받은 이벤트 직접 호출
<my-carousel v-slot="scope">
<div class="slide">
<button @click="scope.next">Next</button>
</div>
<div class="slide">
<button @click="scope.close">Close</button>
</div>
</my-carousel>
<my-carousel v-slot="scope">
<div class="slide">
<button @click="$parent.$emit('next')">Next</button>
</div>
<div class="slide">
<button @click="$parent.$emit('close')">Close</button>
</div>
</my-carousel>
export default {
name: 'EventListener'
render() {
return this.$slots.default;
}
}
<div class="carousel">
<event-listener @next="handleNext" @close="handleClose">
<div class="slides" ref="slides">
<slot></slot>
</div>
</event-listener>
<footer>
<!-- other carousel controls like arrows, indicators etc go here -->
</footer>
</div>
<my-carousel>
<div class="slide">
<button @click="$parent.$emit('next')">Next</button>
</div>
</div class="slide">
<button @click="$parent.$emit('close')">Close</button>
</div>
</my-carousel>