diff --git a/devui/fullscreen/src/fullscreen.tsx b/devui/fullscreen/src/fullscreen.tsx index d71c606c019f6083d9777119dc4babde2ded25d9..99495bf5d60d31ce005dd725264aedb56d28a756 100644 --- a/devui/fullscreen/src/fullscreen.tsx +++ b/devui/fullscreen/src/fullscreen.tsx @@ -1,6 +1,6 @@ import './fullscreen.scss' -import { +import { defineComponent, useSlots, renderSlot, @@ -18,8 +18,7 @@ export default defineComponent({ let currentTarget = ref(null) const isFullscreen = ref(false) const slotElement = ref(null) - const doc = document - + const onFullScreenChange = () => { if (currentTarget.value) { const targetElement: HTMLElement = currentTarget @@ -32,11 +31,11 @@ export default defineComponent({ exitNormalFullscreen(targetElement) } // F11退出全屏时,需要将全屏状态传出去 - isFullscreen.value = !!(doc.fullscreenElement) + isFullscreen.value = !!(document.fullscreenElement) ctx.emit('fullscreenLaunch', isFullscreen.value) } } - + // 页面全屏 const launchNormalFullscreen = (targetElement: HTMLElement) => { targetElement.classList.add('fullscreen') @@ -50,7 +49,7 @@ export default defineComponent({ targetElement.classList.remove('fullscreen') targetElement.style.zIndex = null } - + // 事件监听 const handleFullscreen = async () => { // const targetElement = document.querySelector('[fullscreen-target]') @@ -124,15 +123,15 @@ export default defineComponent({ removeFullScreenStyle() exitNormalFullscreen(targetElement) } else { - if (doc.fullscreenElement) { exitImmersiveFullScreen(doc) } + if (document.fullscreenElement) { exitImmersiveFullScreen(document) } } isFullscreen.value = false ctx.emit('fullscreenLaunch', isFullscreen.value) } } } - - onMounted (() => { + + onMounted(() => { const btnLaunch = slotElement.value.querySelector('[fullscreen-launch]') if (btnLaunch) { btnLaunch.addEventListener('click', handleFullscreen) } document.addEventListener('fullscreenchange', onFullScreenChange) @@ -144,7 +143,7 @@ export default defineComponent({ const defaultSlot = renderSlot(useSlots(), 'default') // if (defaultSlot.children.length === 0) throw new Error('未发现全屏元素') return ( -
{ defaultSlot }
+
{defaultSlot}
) } } diff --git a/devui/splitter/src/splitter-bar.tsx b/devui/splitter/src/splitter-bar.tsx index abdc62109994f901935f8a79bccc04acdd20a004..949640cc016fb7acee67fb82e12cc375da5b82e4 100644 --- a/devui/splitter/src/splitter-bar.tsx +++ b/devui/splitter/src/splitter-bar.tsx @@ -25,31 +25,22 @@ export default defineComponent({ wrapperClass: `devui-splitter-bar devui-splitter-bar-${props.orientation}`, }) const domRef = ref() + onMounted(() => { + watch([() => props.splitBarSize, domRef], ([curSplitBarSize, ele]) => { + if (!(ele instanceof HTMLElement)) { + return; + } + setStyle(ele, { flexBasis: curSplitBarSize }) + }, { immediate: true }) - watch( - () => props.splitBarSize, - (curSplitBarSize) => { - nextTick(() => { - const ele = domRef?.value - setStyle(ele, { flexBasis: curSplitBarSize }) - }) - }, - { immediate: true } - ) - - watch( - () => store.state.panes, - () => { + watch([() => store.state.panes, domRef], ([panes, ele]) => { if (!store.isStaticBar(props.index)) { state.wrapperClass += ' resizable' } else { - nextTick(() => { - setStyle(domRef.value, { flexBasis: props.disabledBarSize }) - }) + setStyle(ele, { flexBasis: props.disabledBarSize }) } - }, - { deep: true } - ) + }, { deep: true }) + }) // 指令输入值 const coordinate = { pageX: 0, pageY: 0, originalX: 0, originalY: 0 } diff --git a/devui/splitter/src/splitter-pane.tsx b/devui/splitter/src/splitter-pane.tsx index c588a5188d8f1bdf22ca39a46cc235de91c3c01b..b6f17388181b6fd359f72abdb19134f60091b862 100644 --- a/devui/splitter/src/splitter-pane.tsx +++ b/devui/splitter/src/splitter-pane.tsx @@ -21,38 +21,6 @@ export default defineComponent({ const store: SplitterStore = inject('splitterStore'); const domRef = ref(); const order = ref(); - watch( - () => order.value, - (order) => { - nextTick(() => { - const ele = domRef.value; - setStyle(ele, { order }); - }); - } - ); - - // pane 初始化大小 - const setSizeStyle = (curSize) => { - const ele = domRef.value; - ele.style.flexBasis = curSize; - const paneFixedClass = 'devui-splitter-pane-fixed'; - if (curSize) { - // 设置 flex-grow 和 flex-shrink - addClass(ele, paneFixedClass); - } else { - removeClass(ele, paneFixedClass); - } - }; - - watch( - () => props.size, - (newSize) => { - nextTick(() => { - setSizeStyle(newSize); - }); - }, - { immediate: true } - ); const orientation = inject('orientation'); let initialSize = ''; // 记录初始化挂载传入的大小 @@ -75,37 +43,49 @@ export default defineComponent({ } }; - const toggleCollapseClass = () => { - const paneHiddenClass = 'devui-splitter-pane-hidden'; - nextTick(() => { - const el = domRef.value; - if (!props.collapsed) { - removeClass(el, paneHiddenClass); - } else { - addClass(el, paneHiddenClass); + + onMounted(() => { + watch([order, domRef], ([order, dom]) => { + if (!(dom instanceof HTMLElement)) { + return; } + setStyle(dom, { order }); + }); - if (props.collapsed && props.shrink) { - removeClass(el, paneHiddenClass); - setStyle(el, { flexBasis: `${props.shrinkWidth}px` }); + watch(() => props.size, (curSize: string) => { + const ele = domRef.value; + ele.style.flexBasis = curSize; + const paneFixedClass = 'devui-splitter-pane-fixed'; + if (curSize) { + // 设置 flex-grow 和 flex-shrink + addClass(ele, paneFixedClass); } else { - setStyle(el, { flexBasis: initialSize }); + removeClass(ele, paneFixedClass); } - }); - }; + }, { immediate: true }); - watch( - () => props.collapsed, - () => { + watch(() => props.collapsed, (collapsed: boolean) => { + const paneHiddenClass = 'devui-splitter-pane-hidden'; nextTick(() => { - toggleCollapseClass(); + const el = domRef.value; + if (!collapsed) { + removeClass(el, paneHiddenClass); + } else { + addClass(el, paneHiddenClass); + } + + if (collapsed && props.shrink) { + removeClass(el, paneHiddenClass); + setStyle(el, { flexBasis: `${props.shrinkWidth}px` }); + } else { + setStyle(el, { flexBasis: initialSize }); + } }); - }, - { immediate: true } - ); + }, { immediate: true }); + }); // 收起时用于改变相邻 pane 的 flex-grow 属性来改变非自适应 pane 的 size - const toggleNearPaneFlexGrow = (collapsed) => { + const toggleNearPaneFlexGrow = (collapsed: boolean) => { nextTick(() => { const flexGrowClass = 'devui-splitter-pane-grow'; if (hasClass(domRef.value, flexGrowClass)) { diff --git a/devui/splitter/src/splitter.tsx b/devui/splitter/src/splitter.tsx index e9afe95fc3cd7c1b306a89a67e2f3e2bc4f0f910..aa524e40fb66c60ba794eb739f3d456356f4a555 100644 --- a/devui/splitter/src/splitter.tsx +++ b/devui/splitter/src/splitter.tsx @@ -1,4 +1,4 @@ -import { defineComponent, reactive, ref, provide, nextTick } from 'vue' +import { defineComponent, reactive, ref, provide, nextTick, onMounted } from 'vue' import { splitterProps, SplitterProps } from './splitter-types' import DSplitterBar from './splitter-bar' import { SplitterStore } from './splitter-store' @@ -25,16 +25,17 @@ export default defineComponent({ provide('orientation', props.orientation) provide('splitterStore', store) - - nextTick(() => { - let containerSize = 0 - if (props.orientation === 'vertical') { - containerSize = domRef.value.clientHeight - } else { - containerSize = domRef.value.clientWidth - } - store.setSplitter({ containerSize }) - }) + onMounted(() => { + nextTick(() => { + let containerSize = 0 + if (props.orientation === 'vertical') { + containerSize = domRef.value.clientHeight + } else { + containerSize = domRef.value.clientWidth + } + store.setSplitter({ containerSize }) + }) + }); return () => { const { splitBarSize, orientation, showCollapseButton } = props