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.
30 lines
777 B
30 lines
777 B
3 years ago
|
import PropTypes from './vue-types';
|
||
|
import { defineComponent, nextTick, onBeforeUnmount, onUpdated, Teleport } from 'vue';
|
||
|
|
||
|
export default defineComponent({
|
||
|
name: 'Portal',
|
||
|
inheritAttrs: false,
|
||
|
props: {
|
||
|
getContainer: PropTypes.func.isRequired,
|
||
|
didUpdate: PropTypes.func,
|
||
|
},
|
||
|
setup(props, { slots }) {
|
||
|
// getContainer 不会改变,不用响应式
|
||
|
const container = props.getContainer();
|
||
|
|
||
|
onUpdated(() => {
|
||
|
nextTick(() => {
|
||
|
props.didUpdate?.(props);
|
||
|
});
|
||
|
});
|
||
|
onBeforeUnmount(() => {
|
||
|
if (container && container.parentNode) {
|
||
|
container.parentNode.removeChild(container);
|
||
|
}
|
||
|
});
|
||
|
return () => {
|
||
|
return container ? <Teleport to={container} v-slots={slots}></Teleport> : null;
|
||
|
};
|
||
|
},
|
||
|
});
|