From 943798f53c8f9894bc21735de470bb97d0150221 Mon Sep 17 00:00:00 2001 From: mrkbear Date: Sun, 23 Jan 2022 20:34:52 +0800 Subject: [PATCH] (#36) Add popuplayer. --- miniprogram/modular/PopupLayer.scss | 0 miniprogram/modular/PopupLayer.ts | 130 +++++++++++++++++++++++++++ miniprogram/pages/Account/Account.ts | 5 +- 3 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 miniprogram/modular/PopupLayer.scss create mode 100644 miniprogram/modular/PopupLayer.ts diff --git a/miniprogram/modular/PopupLayer.scss b/miniprogram/modular/PopupLayer.scss new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/modular/PopupLayer.ts b/miniprogram/modular/PopupLayer.ts new file mode 100644 index 0000000..dfb37c5 --- /dev/null +++ b/miniprogram/modular/PopupLayer.ts @@ -0,0 +1,130 @@ +import { Modular, Manager } from "../core/Module"; + +/** + * 显示层 + */ +class DisplayLayer { + + /** + * Layer 使用的 key + */ + public key: string = ""; + + /** + * 使用的动画类型 + */ + public animateTime: number = 300; + + /** + * 蒙版是否显示 + */ + public isDisplay: boolean = false; + + /** + * 蒙版是否显示 + */ + public isShow: boolean = false; + + /** + * 消失动画计时器 + */ + public disappearTimer?: number; +} + +/** + * 弹出层事件 + */ +type IPopupLayerEvent = { + + /** + * 点击蒙版时 + */ + clickMask: void + + /** + * 显示层 + */ + show: L; + + /** + * 隐藏层 + */ + hide: L; + + /** + * 层状态改变 + */ + change: Readonly; +} + +/** + * 弹出层 + */ +class PopupLayer< + L extends string, + M extends Manager = Manager +> extends Modular> { + + /** + * 层列表 + */ + private layers: Map = new Map(); + + public onLoad(): void { + this.on("show", this.handleShowLayer); + this.on("hide", this.handleHideLayer); + } + + /** + * 获取显示层 + */ + private getDisplayLayer(e: K): DisplayLayer { + let displayLayer = this.layers.get(e); + if (!displayLayer) { + displayLayer = new DisplayLayer(); + displayLayer.key = e; + this.layers.set(e, displayLayer); + } + return displayLayer; + } + + /** + * 响应显示层事件 + */ + private handleShowLayer = (e: K) => { + let displayLayer = this.getDisplayLayer(e); + + // 取消消失定时 + displayLayer.disappearTimer && + clearTimeout(displayLayer.disappearTimer); + + this.setData({ + [`${ e }$isShow`]: true, + [`${ e }$isDisplay`]: true + }); + + this.emit("change", displayLayer); + }; + + /** + * 响应隐藏层事件 + */ + private handleHideLayer = (e: K) => { + let displayLayer = this.getDisplayLayer(e); + + this.setData({ + [`${ e }$isShow`]: false + }); + + displayLayer.disappearTimer = setTimeout(() => { + this.setData({ + [`${ e }$isDisplay`]: false + }); + }, displayLayer.animateTime); + + this.emit("change", displayLayer); + } +} + +export { PopupLayer }; +export default PopupLayer; \ No newline at end of file diff --git a/miniprogram/pages/Account/Account.ts b/miniprogram/pages/Account/Account.ts index 3751888..df02ab1 100644 --- a/miniprogram/pages/Account/Account.ts +++ b/miniprogram/pages/Account/Account.ts @@ -2,7 +2,7 @@ import { Manager } from "../../core/Module"; import { UserCard } from "./UserCard"; import { MainFunction } from "./MainFunction"; import { FunctionList } from "./FunctionList"; -import { Mask } from "../../modular/Mask/Mask"; +import { PopupLayer } from "../../modular/PopupLayer"; (async () => { @@ -10,7 +10,8 @@ import { Mask } from "../../modular/Mask/Mask"; const { manager, query } = await Manager.PageAsync(); // 添加蒙版 Modular - // const mask = manager.addModule(Mask, "mask"); + const popupLayer: PopupLayer<"a" | "b"> = manager.addModule(PopupLayer, "mask") as any; + popupLayer.emit("show", "a"); // 添加 UserCard Modular manager.addModule(UserCard, "userCard");