vant-fork
Version:
Lightweight Mobile UI Components built on Vue
202 lines (172 loc) • 5.09 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _manager = _interopRequireDefault(require("./manager"));
var _context = _interopRequireDefault(require("./context"));
var _scroll = _interopRequireDefault(require("../../utils/scroll"));
var _event = require("../../utils/event");
var _touch = _interopRequireDefault(require("../touch"));
var _default = {
mixins: [_touch.default],
props: {
// whether to show popup
value: Boolean,
// whether to show overlay
overlay: Boolean,
// overlay custom style
overlayStyle: Object,
// overlay custom class name
overlayClass: String,
// whether to close popup when click overlay
closeOnClickOverlay: Boolean,
// z-index
zIndex: [String, Number],
// return the mount node for popup
getContainer: [String, Function],
// prevent body scroll
lockScroll: {
type: Boolean,
default: true
},
// whether to lazy render
lazyRender: {
type: Boolean,
default: true
}
},
data: function data() {
return {
inited: this.value
};
},
computed: {
shouldRender: function shouldRender() {
return this.inited || !this.lazyRender;
}
},
watch: {
value: function value(val) {
this.inited = this.inited || this.value;
this[val ? 'open' : 'close']();
},
getContainer: function getContainer() {
this.move();
},
overlay: function overlay() {
this.renderOverlay();
}
},
created: function created() {
this._popupId = 'popup-' + _context.default.plusKey('id');
},
mounted: function mounted() {
if (this.getContainer) {
this.move();
}
if (this.value) {
this.open();
}
},
activated: function activated() {
/* istanbul ignore next */
if (this.value) {
this.open();
}
},
beforeDestroy: function beforeDestroy() {
this.close();
if (this.getContainer) {
this.$parent.$el.appendChild(this.$el);
}
},
deactivated: function deactivated() {
/* istanbul ignore next */
this.close();
},
methods: {
open: function open() {
/* istanbul ignore next */
if (this.$isServer || this.opened) {
return;
} // 如果属性中传入了`zIndex`,则覆盖`context`中对应的`zIndex`
if (this.zIndex !== undefined) {
_context.default.zIndex = this.zIndex;
}
this.opened = true;
this.renderOverlay();
if (this.lockScroll) {
(0, _event.on)(document, 'touchstart', this.touchStart);
(0, _event.on)(document, 'touchmove', this.onTouchMove);
if (!_context.default.lockCount) {
document.body.classList.add('van-overflow-hidden');
}
_context.default.lockCount++;
}
},
close: function close() {
if (!this.opened) {
return;
}
if (this.lockScroll) {
_context.default.lockCount--;
(0, _event.off)(document, 'touchstart', this.touchStart);
(0, _event.off)(document, 'touchmove', this.onTouchMove);
if (!_context.default.lockCount) {
document.body.classList.remove('van-overflow-hidden');
}
}
this.opened = false;
_manager.default.close(this._popupId);
this.$emit('input', false);
},
move: function move() {
var container;
var getContainer = this.getContainer;
if (getContainer) {
container = typeof getContainer === 'string' ? document.querySelector(getContainer) : getContainer();
} else if (this.$parent) {
container = this.$parent.$el;
}
if (container) {
container.appendChild(this.$el);
}
},
onTouchMove: function onTouchMove(e) {
this.touchMove(e);
var direction = this.deltaY > 0 ? '10' : '01';
var el = _scroll.default.getScrollEventTarget(e.target, this.$el);
var scrollHeight = el.scrollHeight,
offsetHeight = el.offsetHeight,
scrollTop = el.scrollTop;
var status = '11';
/* istanbul ignore next */
if (scrollTop === 0) {
status = offsetHeight >= scrollHeight ? '00' : '01';
} else if (scrollTop + offsetHeight >= scrollHeight) {
status = '10';
}
/* istanbul ignore next */
if (status !== '11' && this.direction === 'vertical' && !(parseInt(status, 2) & parseInt(direction, 2))) {
e.preventDefault();
e.stopPropagation();
}
},
renderOverlay: function renderOverlay() {
var _this = this;
if (this.overlay) {
_manager.default.open(this, {
zIndex: _context.default.plusKey('zIndex'),
className: this.overlayClass,
customStyle: this.overlayStyle
});
} else {
_manager.default.close(this._popupId);
}
this.$nextTick(function () {
_this.$el.style.zIndex = _context.default.plusKey('zIndex');
});
}
}
};
exports.default = _default;