全屏组件FullScreenContainer
目录结构
index.vue
autoResize.js
import { debounce, observerDomResize } from "../util/index";
export default {
data() {
return {
dom: "",
width: 0,
height: 0,
debounceInitWHFun: "",
domObserver: "",
};
},
methods: {
async autoResizeMixinInit() {
const {
initWH,
getDebounceInitWHFun,
bindDomResizeCallback,
afterAutoResizeMixinInit,
} = this;
await initWH(false);
getDebounceInitWHFun();
bindDomResizeCallback();
if (typeof afterAutoResizeMixinInit === "function")
afterAutoResizeMixinInit();
},
initWH(resize = true) {
const { $nextTick, $refs, ref, onResize } = this;
return new Promise((resolve) => {
$nextTick(() => {
const dom = (this.dom = $refs[ref]);
this.width = dom.clientWidth;
this.height = dom.clientHeight;
if (typeof onResize === "function" && resize) onResize();
resolve();
});
});
},
getDebounceInitWHFun() {
const { initWH } = this;
this.debounceInitWHFun = debounce(100, initWH);
},
bindDomResizeCallback() {
const { dom, debounceInitWHFun } = this;
this.domObserver = observerDomResize(dom, debounceInitWHFun);
window.addEventListener("resize", debounceInitWHFun);
},
unbindDomResizeCallback() {
let { domObserver, debounceInitWHFun } = this;
domObserver.disconnect();
domObserver.takeRecords();
domObserver = null; // NOSONAR
window.removeEventListener("resize", debounceInitWHFun);
},
},
mounted() {
const { autoResizeMixinInit } = this;
autoResizeMixinInit();
},
onBeforeUnMount() {
const { unbindDomResizeCallback } = this;
unbindDomResizeCallback();
},
};
util/index.js
export function randomExtend(minNum, maxNum) {
if (arguments.length === 1) {
return parseInt(Math.random() * minNum + 1, 10);
} else {
return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
}
}
export function debounce(delay, callback) {
let lastTime;
return function () {
clearTimeout(lastTime);
const [that, args] = [this, arguments];
lastTime = setTimeout(() => {
callback.apply(that, args);
}, delay);
};
}
export function observerDomResize(dom, callback) {
const MutationObserver =
window.MutationObserver ||
window.WebKitMutationObserver ||
window.MozMutationObserver;
const observer = new MutationObserver(callback);
observer.observe(dom, {
attributes: true,
attributeFilter: ["style"],
attributeOldValue: true,
});
return observer;
}
export function getPointDistance(pointOne, pointTwo) {
const minusX = Math.abs(pointOne[0] - pointTwo[0]);
const minusY = Math.abs(pointOne[1] - pointTwo[1]);
return Math.sqrt(minusX * minusX + minusY * minusY);
}