해결방안1 : 데이터만 갖는 컨테이너 파일를 만들어서 거기서 모달을 호출하는 방식으로 해결한다.
<template>
<div>
<BaseButtonsText
v-if="userStore.user"
:label="'Create Post'"
:theme="'primary-yellow'"
@click="createModal = !createModal"
/>
<PostCreate
:is-open="createModal"
/>
</div>
</template>
<script>
export default defineComponent({
components: {
BaseButtonsText,
PostCreate
},
setup() {
const handleOnOpenModalPostCreate = () => {
$vfm.toggle('modal-create-post-test', true).then(hook => {
console.log(hook)
})
console.log($vfm.get('modal-create-post-test'))
}
return { createModal, handleOnOpenModalPostCreate }
}
})
</script>
<template>
<div></div>
</template>
<script lang='ts'>
export default defineComponent({
name: 'PostCreate',
props: {
isOpen: {
required: true,
type: Boolean
}
},
setup(props) {
const isOpen = toRefs(props).isOpen
watch(isOpen,(current)=> {
if (current) handleOnCreatePostModal()
})
const handleOnCreatePostModal = () => {
$vfm.show({
component: ModalCommon,
bind: {
name: 'modalCommon',
showCloseBtn: true
},
on: {...},
slots: {
title: '포스트작성',
contents: { component: PostCreateContent },
actions: {
component: BaseButtonsText
}
}
})
}
return{}
}
})
</script>
<template>
<vue-final-modal
v-slot="{ params, close }"
v-bind="$attrs"
classes="modal-container"
content-class="modal-content"
>
<div v-if="slots.title || $attrs.showCloseBtn" class="modal-header">
<h4 v-if="slots.title" class="title">
<slot name="title"></slot>
</h4>
<div v-if="$attrs.showCloseBtn" class="close-wrap" @click="close">
<BaseButtonsIcon
:icon="{ type: 'outline', name: 'close-extend' }"
class="btn-close"
/>
</div>
</div>
<ScrollContainer
v-if="slots.contents"
class="modal-contents modal-scroll-container"
>
<slot name="contents" :params="params"></slot>
</ScrollContainer>
<div v-if="slots.btnCancel || slots.btnConfirm || slots.btnOptional" class="modal-actions">
<slot name="btnCancel" ></slot>
<slot name="btnConfirm" ></slot>
<slot name="btnOptional" ></slot>
</div>
</vue-final-modal>
</template>
<script lang="ts">
import { defineComponent , useSlots } from 'vue'
export default defineComponent({
name: 'ModalCommon',
inheritAttrs: false,
emits: {
confirm: (_evt: any) => true,
cancel: (_evt: any) => true
},
setup() {
const slots = useSlots()
return { slots }
}
})
</script>