vuecssuiant-designantdreactantantd-vueenterprisefrontendui-designvue-antdvue-antd-uivue3vuecomponent
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.8 KiB
68 lines
1.8 KiB
import { defineComponent, nextTick, Transition } from 'vue'; |
|
import LoadingOutlined from '@ant-design/icons-vue/LoadingOutlined'; |
|
const getCollapsedWidth = (node: HTMLSpanElement) => { |
|
if (node) { |
|
node.style.width = '0px'; |
|
node.style.opacity = '0'; |
|
node.style.transform = 'scale(0)'; |
|
} |
|
}; |
|
const getRealWidth = (node: HTMLSpanElement) => { |
|
nextTick(() => { |
|
if (node) { |
|
node.style.width = `${node.scrollWidth}px`; |
|
node.style.opacity = '1'; |
|
node.style.transform = 'scale(1)'; |
|
} |
|
}); |
|
}; |
|
const resetStyle = (node: HTMLSpanElement) => { |
|
if (node && node.style) { |
|
node.style.width = null; |
|
node.style.opacity = null; |
|
node.style.transform = null; |
|
} |
|
}; |
|
export default defineComponent({ |
|
compatConfig: { MODE: 3 }, |
|
name: 'LoadingIcon', |
|
props: { |
|
prefixCls: String, |
|
loading: [Boolean, Object], |
|
existIcon: Boolean, |
|
}, |
|
setup(props) { |
|
return () => { |
|
const { existIcon, prefixCls, loading } = props; |
|
if (existIcon) { |
|
return ( |
|
<span class={`${prefixCls}-loading-icon`}> |
|
<LoadingOutlined /> |
|
</span> |
|
); |
|
} |
|
const visible = !!loading; |
|
return ( |
|
<Transition |
|
name={`${prefixCls}-loading-icon-motion`} |
|
onBeforeEnter={getCollapsedWidth} |
|
onEnter={getRealWidth} |
|
onAfterEnter={resetStyle} |
|
onBeforeLeave={getRealWidth} |
|
onLeave={(node: HTMLSpanElement) => { |
|
setTimeout(() => { |
|
getCollapsedWidth(node); |
|
}); |
|
}} |
|
onAfterLeave={resetStyle} |
|
> |
|
{visible ? ( |
|
<span class={`${prefixCls}-loading-icon`}> |
|
<LoadingOutlined /> |
|
</span> |
|
) : null} |
|
</Transition> |
|
); |
|
}; |
|
}, |
|
});
|
|
|