39 lines
855 B
Vue
39 lines
855 B
Vue
import PropTypes from './vue-types';
|
|
import {
|
|
defineComponent,
|
|
nextTick,
|
|
onBeforeUnmount,
|
|
onMounted,
|
|
onUpdated,
|
|
ref,
|
|
Teleport,
|
|
} from 'vue';
|
|
|
|
export default defineComponent({
|
|
name: 'Portal',
|
|
inheritAttrs: false,
|
|
props: {
|
|
getContainer: PropTypes.func.isRequired,
|
|
didUpdate: PropTypes.func,
|
|
},
|
|
setup(props, { slots }) {
|
|
const container = ref();
|
|
onMounted(() => {
|
|
container.value = props.getContainer();
|
|
});
|
|
onUpdated(() => {
|
|
nextTick(() => {
|
|
props.nextTick?.(props);
|
|
});
|
|
});
|
|
onBeforeUnmount(() => {
|
|
if (container.value && container.value.parentNode) {
|
|
container.value.parentNode.removeChild(container.value);
|
|
}
|
|
});
|
|
return () => {
|
|
return container.value ? <Teleport to={container.value}>{slots.default?.()}</Teleport> : null;
|
|
};
|
|
},
|
|
});
|