Skip to content

Commit 65e14f0

Browse files
committed
fix(BModal): fixed lazy rendering
1 parent f8b83dc commit 65e14f0

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

packages/bootstrap-vue-3/src/components/BModal.vue

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,15 @@
2323
@keyup.esc="onEsc"
2424
>
2525
<div class="modal-dialog" :class="modalDialogClasses">
26-
<div class="modal-content" :class="contentClass">
26+
<div
27+
v-if="
28+
!lazyBoolean ||
29+
(lazyBoolean && lazyLoadCompleted) ||
30+
(lazyBoolean && modelValueBoolean === true)
31+
"
32+
class="modal-content"
33+
:class="contentClass"
34+
>
2735
<div v-if="!hideHeaderBoolean" class="modal-header" :class="headerClasses">
2836
<slot name="header">
2937
<component
@@ -99,7 +107,7 @@
99107

100108
<script setup lang="ts">
101109
// import type {BModalEmits, BModalProps} from '../types/components'
102-
import {computed, ref, toRef, useSlots, watch} from 'vue'
110+
import {computed, nextTick, ref, toRef, useSlots, watch} from 'vue'
103111
import {useBooleanish, useId} from '../composables'
104112
import type {Booleanish, ClassValue, ColorVariant, InputSize} from '../types'
105113
import {isEmptySlot} from '../utils'
@@ -210,12 +218,10 @@ const emit = defineEmits<BModalEmits>()
210218
211219
const slots = useSlots()
212220
213-
const isActive = ref(false)
214-
215221
const computedId = useId(toRef(props, 'id'), 'modal')
216222
217223
const busyBoolean = useBooleanish(toRef(props, 'busy'))
218-
// const lazyBoolean = useBooleanish(toRef(props, 'lazy'))
224+
const lazyBoolean = useBooleanish(toRef(props, 'lazy'))
219225
const cancelDisabledBoolean = useBooleanish(toRef(props, 'cancelDisabled'))
220226
const centeredBoolean = useBooleanish(toRef(props, 'centered'))
221227
const hideBackdropBoolean = useBooleanish(toRef(props, 'hideBackdrop'))
@@ -233,7 +239,9 @@ const scrollableBoolean = useBooleanish(toRef(props, 'scrollable'))
233239
const titleSrOnlyBoolean = useBooleanish(toRef(props, 'titleSrOnly'))
234240
const staticBoolean = useBooleanish(toRef(props, 'static'))
235241
242+
const isActive = ref(false)
236243
const element = ref<HTMLElement | null>(null)
244+
const lazyLoadCompleted = ref(false)
237245
238246
const modalClasses = computed(() => [
239247
props.modalClass,
@@ -303,18 +311,24 @@ const onBeforeEnter = () => emit('show')
303311
const onAfterEnter = () => {
304312
isActive.value = true
305313
emit('shown')
314+
if (lazyBoolean.value === true) lazyLoadCompleted.value = true
306315
}
307316
const onBeforeLeave = () => emit('hide')
308317
const onLeave = () => {
309318
isActive.value = false
310319
}
311-
const onAfterLeave = () => emit('hidden')
320+
const onAfterLeave = () => {
321+
emit('hidden')
322+
if (lazyBoolean.value === true) lazyLoadCompleted.value = false
323+
}
312324
313325
watch(
314326
() => modelValueBoolean.value,
315327
(newValue) => {
316-
if (newValue === true && !noFocusBoolean.value && element.value !== null) {
317-
element.value.focus()
328+
if (newValue === true && !noFocusBoolean.value) {
329+
nextTick(() => {
330+
if (element.value !== null) element.value.focus()
331+
})
318332
}
319333
}
320334
)

0 commit comments

Comments
 (0)