Skip to content

Commit 5081259

Browse files
committed
refactor: refine useModal, useVNode, rename DynamicModal to UseModal
1 parent 449764b commit 5081259

File tree

4 files changed

+49
-43
lines changed

4 files changed

+49
-43
lines changed

packages/vue-final-modal/src/components/DynamicModal.ts renamed to packages/vue-final-modal/src/components/UseModal.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type { Component, PropType } from 'vue'
2-
import { defineComponent, h } from 'vue'
2+
import { defineComponent } from 'vue'
33
import type { UseModalOptions, UseModalOptionsPrivate } from '..'
4-
import { getSlots } from '~/useVNode'
4+
import { createVNode } from '~/useVNode'
55

6-
export const DynamicModal = defineComponent({
7-
name: 'DynamicModal',
6+
export const UseModal = defineComponent({
7+
name: 'UseModal',
88
props: {
99
modal: {
1010
type: Object as PropType<UseModalOptions<Component> & UseModalOptionsPrivate>,
@@ -15,10 +15,9 @@ export const DynamicModal = defineComponent({
1515
function renderDynamicModal(modal: (UseModalOptions<Component> & UseModalOptionsPrivate)) {
1616
if (!modal.component)
1717
return null
18-
19-
return h(
20-
modal.component,
21-
{
18+
return createVNode({
19+
component: modal.component,
20+
attrs: {
2221
'modelValue': modal.modelValue,
2322
'displayDirective': modal?.keepAlive ? 'show' : undefined,
2423
...(typeof modal.attrs === 'object' ? modal.attrs : {}),
@@ -31,8 +30,8 @@ export const DynamicModal = defineComponent({
3130
'on_closed': () => modal?.resolveClosed?.(),
3231
'on_opened': () => modal?.resolveOpened?.(),
3332
},
34-
getSlots(modal.slots || {}),
35-
)
33+
slots: modal.slots,
34+
})
3635
}
3736

3837
return () => renderDynamicModal(props.modal)

packages/vue-final-modal/src/useModal.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Component } from 'vue'
2-
import { h, markRaw, reactive } from 'vue'
2+
import { markRaw, reactive } from 'vue'
33
import { isString, objectEntries } from './utils'
4-
import { DynamicModal } from './components/DynamicModal'
4+
import { UseModal } from './components/UseModal'
55
import { isVNodeOptions, useVNode } from './useVNode'
66
import type { CreateVNodeOptions, UseModalOptions, UseModalOptionsPrivate, UseModalReturnType } from '.'
77
import { VueFinalModal } from '.'
@@ -21,10 +21,11 @@ export function useModal<T extends Component = typeof VueFinalModal>(_options: U
2121
...withMarkRaw<T>(_options),
2222
}) as UseModalOptions<T> & UseModalOptionsPrivate
2323

24-
const vNode = h(DynamicModal, { modal: options, key: id })
25-
26-
const { show, hide } = useVNode(vNode, {
27-
tryOnUnmounted: () => tryRemoveVNode(),
24+
const { show, hide } = useVNode({
25+
component: UseModal,
26+
attrs: { modal: options, key: id },
27+
}, {
28+
onUnmounted: () => tryRemoveVNode(),
2829
})
2930

3031
if (options.modelValue === true)

packages/vue-final-modal/src/useVNode.ts

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,53 @@
11
import type { Component, VNode } from 'vue'
2-
import { h as _h, isVNode } from 'vue'
2+
import { h as _h } from 'vue'
33
import { tryOnUnmounted } from '@vueuse/core'
44
import type { CreateVNodeOptions } from './Modal'
55
import { useSsrVfm, useVfm } from './useVfm'
66
import type { ComponentSlots } from './Component'
77
import { isString, objectEntries } from './utils'
88

99
/**
10-
* Create a dynamic vNode.
10+
* Create a vNode by passing `CreateVNodeOptions<T>` options.
1111
*/
1212
export function createVNode<T extends Component>(options: CreateVNodeOptions<T>) {
13-
const id = Symbol(__DEV__ ? 'createVNode' : '')
14-
const vNode = _h(options.component, { key: id, ...options.attrs }, getSlots(options.slots))
15-
return vNode
13+
return _h(options.component, options.attrs, getSlots(options.slots))
1614
}
1715

1816
/**
19-
* Create a dynamic vNode.
17+
* A type helper for `CreateVNodeOptions<T>`
2018
*/
2119
export function h<T extends Component>(options: CreateVNodeOptions<T>) {
2220
return options
2321
}
2422

25-
async function pushVNode(vNode: VNode) {
26-
const vfm = await useSsrVfm()
27-
vfm.vNodesContainer.push(vNode)
28-
}
23+
export function useVNode<T extends Component>(vNodeOptions: CreateVNodeOptions<T>, options?: {
24+
onUnmounted?: (vNode: VNode) => void
25+
}) {
26+
if (vNodeOptions.attrs) {
27+
const id = Symbol(__DEV__ ? 'createVNode' : '')
28+
Object.assign(vNodeOptions.attrs, { key: id })
29+
}
30+
const vNode = createVNode(vNodeOptions)
31+
tryOnUnmounted(() => {
32+
if (options?.onUnmounted)
33+
options?.onUnmounted(vNode)
34+
else
35+
hide()
36+
})
2937

30-
async function removeVNode(vNode: VNode) {
31-
const vfm = useVfm()
32-
vfm.vNodesContainer.remove(vNode)
33-
}
38+
async function show() {
39+
const vfm = await useSsrVfm()
40+
vfm.vNodesContainer.push(vNode)
41+
}
42+
43+
async function hide() {
44+
const vfm = useVfm()
45+
vfm.vNodesContainer.remove(vNode)
46+
}
3447

35-
export function useVNode(vNode: VNode, options?: {
36-
tryOnUnmounted?: (vNode: VNode) => void
37-
}) {
38-
tryOnUnmounted(() => options?.tryOnUnmounted?.(vNode))
3948
return {
40-
show: () => pushVNode(vNode),
41-
hide: () => removeVNode(vNode),
49+
show,
50+
hide,
4251
}
4352
}
4453

@@ -49,7 +58,7 @@ export function isVNodeOptions<T extends Component>(value: unknown): value is Cr
4958
return false
5059
}
5160

52-
export function getSlots<T extends Component>(slots?: {
61+
function getSlots<T extends Component>(slots?: {
5362
[K in keyof ComponentSlots<T>]?: string | Component | CreateVNodeOptions<Component>
5463
}) {
5564
return objectEntries(slots || {}).reduce<Record<string, () => VNode>>((acc, cur) => {
@@ -59,9 +68,6 @@ export function getSlots<T extends Component>(slots?: {
5968
acc[slotName] = () => _h('div', { innerHTML: slot })
6069
else if (isVNodeOptions(slot))
6170
acc[slotName] = () => _h(slot.component, slot.attrs, slot.slots ? getSlots(slot.slots) : undefined)
62-
else if (isVNode(slot))
63-
// acc[slotName] = () => slot
64-
return acc
6571
else
6672
acc[slotName] = () => _h(slot)
6773
return acc

viteplay/src/components/VueFinalModal/Basic.example.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import { ref } from 'vue'
3-
import { ModalsContainer, VueFinalModal, createVNode, h, useModal, useVNode, useVfm } from 'vue-final-modal'
3+
import { ModalsContainer, VueFinalModal, h, useModal, useVNode, useVfm } from 'vue-final-modal'
44
import DefaultSlot from '../DefaultSlot.vue'
55
import { modal } from './modalsHelpers'
66
import TestModal from './TestModal.vue'
@@ -80,7 +80,7 @@ function clickOutside() {
8080
// show.value = true
8181
// })
8282
83-
const { show: _show } = useVNode(createVNode({
83+
const { show: _show } = useVNode({
8484
component: DefaultSlot,
8585
attrs: {
8686
text: 'createVNode',
@@ -109,7 +109,7 @@ const { show: _show } = useVNode(createVNode({
109109
// },
110110
// }),
111111
// },
112-
}))
112+
})
113113
114114
_show()
115115
</script>

0 commit comments

Comments
 (0)