refactor(DropdownItem): remove portal mixin

This commit is contained in:
chenjiahan 2020-08-21 11:10:58 +08:00
parent 5e5025d1cc
commit 0b208dc04b
2 changed files with 38 additions and 79 deletions

View File

@ -1,9 +1,10 @@
import { Teleport } from 'vue';
// Utils // Utils
import { createNamespace } from '../utils'; import { createNamespace } from '../utils';
import { on, off } from '../utils/dom/event'; import { on, off } from '../utils/dom/event';
// Mixins // Mixins
import { PortalMixin } from '../mixins/portal';
import { ChildrenMixin } from '../mixins/relation'; import { ChildrenMixin } from '../mixins/relation';
// Components // Components
@ -14,11 +15,12 @@ import Popup from '../popup';
const [createComponent, bem] = createNamespace('dropdown-item'); const [createComponent, bem] = createNamespace('dropdown-item');
export default createComponent({ export default createComponent({
mixins: [PortalMixin({ ref: 'wrapper' }), ChildrenMixin('vanDropdownMenu')], mixins: [ChildrenMixin('vanDropdownMenu')],
props: { props: {
title: String, title: String,
disabled: Boolean, disabled: Boolean,
teleport: [String, Object],
modelValue: null, modelValue: null,
titleClass: String, titleClass: String,
options: { options: {
@ -150,8 +152,7 @@ export default createComponent({
style.bottom = `${offset}px`; style.bottom = `${offset}px`;
} }
return ( const Content = (
<div>
<div <div
vShow={this.showWrapper} vShow={this.showWrapper}
ref="wrapper" ref="wrapper"
@ -181,7 +182,12 @@ export default createComponent({
{this.$slots.default?.()} {this.$slots.default?.()}
</Popup> </Popup>
</div> </div>
</div>
); );
if (this.teleport) {
return <Teleport to={this.teleport}>{Content}</Teleport>;
}
return Content;
}, },
}); });

View File

@ -1,47 +0,0 @@
function getElement(teleport) {
if (typeof teleport === 'string') {
return document.querySelector(teleport);
}
return teleport;
}
export function PortalMixin({ ref, afterPortal } = {}) {
return {
props: {
teleport: [String, Object],
},
watch: {
teleport: 'portal',
},
mounted() {
if (this.teleport) {
this.portal();
}
},
methods: {
portal() {
const { teleport } = this;
const el = ref ? this.$refs[ref] : this.$el;
let container;
if (teleport) {
container = getElement(teleport);
} else if (this.$parent) {
container = this.$parent.$el;
}
if (container && container !== el.parentNode) {
container.appendChild(el);
}
if (afterPortal) {
afterPortal.call(this);
}
},
},
};
}