diff --git a/src-next/mixins/popup/index.js b/src-next/mixins/popup/index.js
index 436eb909d..b626fbbe8 100644
--- a/src-next/mixins/popup/index.js
+++ b/src-next/mixins/popup/index.js
@@ -8,7 +8,6 @@ import { getScroller } from '../../utils/dom/scroll';
// Mixins
import { TouchMixin } from '../touch';
-import { PortalMixin } from '../portal';
import { CloseOnPopstateMixin } from '../close-on-popstate';
export const popupMixinProps = {
@@ -20,6 +19,8 @@ export const popupMixinProps = {
overlayStyle: Object,
// overlay custom class name
overlayClass: String,
+ // teleport
+ getContainer: [String, Function],
// whether to close popup when click overlay
closeOnClickOverlay: Boolean,
// z-index
@@ -41,7 +42,6 @@ export function PopupMixin(options = {}) {
mixins: [
TouchMixin,
CloseOnPopstateMixin,
- PortalMixin({}),
],
props: popupMixinProps,
diff --git a/src-next/mixins/portal.js b/src-next/mixins/portal.js
deleted file mode 100644
index 3ed88ef2d..000000000
--- a/src-next/mixins/portal.js
+++ /dev/null
@@ -1,47 +0,0 @@
-function getElement(selector) {
- if (typeof selector === 'string') {
- return document.querySelector(selector);
- }
-
- return selector();
-}
-
-export function PortalMixin({ ref, afterPortal }) {
- return {
- props: {
- getContainer: [String, Function],
- },
-
- watch: {
- getContainer: 'portal',
- },
-
- mounted() {
- if (this.getContainer) {
- this.portal();
- }
- },
-
- methods: {
- portal() {
- const { getContainer } = this;
- const el = ref ? this.$refs[ref] : this.$el;
-
- let container;
- if (getContainer) {
- container = getElement(getContainer);
- } else if (this.$parent) {
- container = this.$parent.$el;
- }
-
- if (container && container !== el.parentNode) {
- container.appendChild(el);
- }
-
- if (afterPortal) {
- afterPortal.call(this);
- }
- },
- },
- };
-}
diff --git a/src-next/popup/index.js b/src-next/popup/index.js
index 23b900006..df2dfe120 100644
--- a/src-next/popup/index.js
+++ b/src-next/popup/index.js
@@ -1,5 +1,5 @@
-import { Transition } from 'vue';
-import { createNamespace, isDef } from '../utils';
+import { Teleport, Transition } from 'vue';
+import { createNamespace, isDef, isFunction } from '../utils';
import { PopupMixin } from '../mixins/popup';
import Icon from '../icon';
import Overlay from '../overlay';
@@ -48,25 +48,28 @@ export default createComponent({
this.onClosed = createEmitter('closed');
},
- render() {
- const { round, position, duration } = this;
- const isCenter = position === 'center';
+ methods: {
+ genOverlay() {
+ if (this.overlay) {
+ return ;
+ }
+ },
- const transitionName =
- this.transition ||
- (isCenter ? 'van-fade' : `van-popup-slide-${position}`);
+ genPopup() {
+ const { round, position, duration } = this;
+ const isCenter = position === 'center';
- const style = {};
- if (isDef(duration)) {
- const key = isCenter ? 'animationDuration' : 'transitionDuration';
- style[key] = `${duration}s`;
- }
+ const transitionName =
+ this.transition ||
+ (isCenter ? 'van-fade' : `van-popup-slide-${position}`);
- return (
- <>
- {this.overlay && (
-
- )}
+ const style = {};
+ if (isDef(duration)) {
+ const key = isCenter ? 'animationDuration' : 'transitionDuration';
+ style[key] = `${duration}s`;
+ }
+
+ return (
) : null}
+ );
+ },
+ },
+
+ render() {
+ const { getContainer } = this;
+ if (getContainer) {
+ const to = isFunction(getContainer) ? getContainer() : getContainer;
+ return (
+
+ {this.genOverlay()}
+ {this.genPopup()}
+
+ );
+ }
+
+ return (
+ <>
+ {this.genOverlay()}
+ {this.genPopup()}
>
);
},