press-ui
Version:
简单、易用的跨端组件库,兼容 Vue2 和 Vue3,同时支持 uni-app和普通 Vue 项目
98 lines (78 loc) • 2.27 kB
JavaScript
import { selectComponent } from '../functional-component';
import { parseOptions } from './component-handler';
import { setData, vmSet } from './set-data';
function getContext() {
const pages = getCurrentPages();
return pages[pages.length - 1];
}
export function getMPComponentHandler({
defaultOptions,
name = 'press-toast',
defaultKey = 'message',
}) {
let queue = [];
let currentOptions = { ...defaultOptions };
let defaultOptionsMap = {};
function CompHandler(toastOptions) {
let options = parseOptions(toastOptions, defaultKey);
options = {
...currentOptions,
...defaultOptionsMap[options.type || currentOptions.type],
...options,
};
CompHandler.getOptions = () => options;
const context = options.context || getContext();
const dialog = selectComponent(context, options.selector);
if (!dialog) {
console.warn(`未找到 ${name} 节点,请确认 selector 及 context 是否正确`);
return;
}
delete options.context;
delete options.selector;
// 设置clear
dialog.clear = () => {
setData(dialog, { show: false });
if (options.onClose) {
options.onClose();
}
};
// 为了让h5和小程序的函数调用一样
dialog.set = (...args) => {
vmSet(dialog, ...args);
};
queue.push(dialog);
// 开始展示
setData(dialog, options);
clearTimeout(dialog.timer);
if (options.duration != null && options.duration > 0) {
dialog.timer = setTimeout(() => {
dialog.clear();
queue = queue.filter(item => item !== dialog);
}, options.duration);
}
return dialog;
}
CompHandler.clear = () => {
queue.forEach((dialog) => {
dialog.clear();
});
queue = [];
};
CompHandler.setDefaultOptions = (type, options) => {
if (typeof type === 'string') {
defaultOptionsMap[type] = options;
} else {
Object.assign(currentOptions, type);
}
};
CompHandler.resetDefaultOptions = (type) => {
if (typeof type === 'string') {
defaultOptionsMap[type] = null;
} else {
currentOptions = { ...defaultOptions };
defaultOptionsMap = {};
}
};
CompHandler.install = () => {};
return CompHandler;
}