UNPKG

vant-fork

Version:

Lightweight Mobile UI Components built on Vue

202 lines (172 loc) 5.09 kB
"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;