2021-12-04 13:32:14 +08:00
|
|
|
|
import { nextTick } from 'vue';
|
|
|
|
|
import type { App } from 'vue';
|
2021-12-12 21:27:33 +08:00
|
|
|
|
import * as svg from '@element-plus/icons-vue';
|
2021-12-04 13:32:14 +08:00
|
|
|
|
import router from '/@/router/index';
|
|
|
|
|
import { store } from '/@/store/index';
|
|
|
|
|
import { i18n } from '/@/i18n/index';
|
|
|
|
|
import { Local } from '/@/utils/storage';
|
|
|
|
|
import SvgIcon from '/@/components/svgIcon/index.vue';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 导出全局注册 element plus svg 图标
|
|
|
|
|
* @param app vue 实例
|
|
|
|
|
* @description 使用:https://element-plus.gitee.io/zh-CN/component/icon.html
|
|
|
|
|
*/
|
|
|
|
|
export function elSvg(app: App) {
|
|
|
|
|
const icons = svg as any;
|
|
|
|
|
for (const i in icons) {
|
|
|
|
|
app.component(`element${icons[i].name}`, icons[i]);
|
|
|
|
|
}
|
|
|
|
|
app.component('SvgIcon', SvgIcon);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置浏览器标题国际化
|
|
|
|
|
* @method const title = useTitle(); ==> title()
|
|
|
|
|
*/
|
|
|
|
|
export function useTitle() {
|
2021-12-12 21:27:33 +08:00
|
|
|
|
nextTick(() => {
|
|
|
|
|
let webTitle = '';
|
|
|
|
|
let globalTitle: string = store.state.themeConfig.themeConfig.globalTitle;
|
|
|
|
|
router.currentRoute.value.path === '/login'
|
|
|
|
|
? (webTitle = router.currentRoute.value.meta.title as any)
|
|
|
|
|
: (webTitle = i18n.global.t(router.currentRoute.value.meta.title as any));
|
|
|
|
|
document.title = `${webTitle} - ${globalTitle}` || globalTitle;
|
|
|
|
|
});
|
2021-12-04 13:32:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 图片懒加载
|
|
|
|
|
* @param el dom 目标元素
|
|
|
|
|
* @param arr 列表数据
|
|
|
|
|
* @description data-xxx 属性用于存储页面或应用程序的私有自定义数据
|
|
|
|
|
*/
|
|
|
|
|
export const lazyImg = (el: any, arr: any) => {
|
|
|
|
|
const io = new IntersectionObserver((res) => {
|
|
|
|
|
res.forEach((v: any) => {
|
|
|
|
|
if (v.isIntersecting) {
|
|
|
|
|
const { img, key } = v.target.dataset;
|
|
|
|
|
v.target.src = img;
|
|
|
|
|
v.target.onload = () => {
|
|
|
|
|
io.unobserve(v.target);
|
|
|
|
|
arr[key]['loading'] = false;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
document.querySelectorAll(el).forEach((img) => io.observe(img));
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 全局组件大小
|
|
|
|
|
* @returns 返回 `window.localStorage` 中读取的缓存值 `globalComponentSize`
|
|
|
|
|
*/
|
|
|
|
|
export function globalComponentSize() {
|
|
|
|
|
return Local.get('themeConfig')?.globalComponentSize;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对象深克隆
|
|
|
|
|
* @param obj 源对象
|
|
|
|
|
* @returns 克隆后的对象
|
|
|
|
|
*/
|
|
|
|
|
export function deepClone(obj: any) {
|
|
|
|
|
let newObj: any;
|
|
|
|
|
try {
|
|
|
|
|
newObj = obj.push ? [] : {};
|
|
|
|
|
} catch (error) {
|
|
|
|
|
newObj = {};
|
|
|
|
|
}
|
|
|
|
|
for (let attr in obj) {
|
|
|
|
|
if (typeof obj[attr] === 'object') {
|
|
|
|
|
newObj[attr] = deepClone(obj[attr]);
|
|
|
|
|
} else {
|
|
|
|
|
newObj[attr] = obj[attr];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return newObj;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 统一批量导出
|
|
|
|
|
* @method elSvg 导出全局注册 element plus svg 图标
|
|
|
|
|
* @method useTitle 设置浏览器标题国际化
|
|
|
|
|
* @method lazyImg 图片懒加载
|
|
|
|
|
* @method globalComponentSize element plus 全局组件大小
|
|
|
|
|
* @method deepClone 对象深克隆
|
|
|
|
|
*/
|
|
|
|
|
const other = {
|
|
|
|
|
elSvg: (app: App) => {
|
|
|
|
|
elSvg(app);
|
|
|
|
|
},
|
|
|
|
|
useTitle: () => {
|
|
|
|
|
useTitle();
|
|
|
|
|
},
|
|
|
|
|
lazyImg: (el: any, arr: any) => {
|
|
|
|
|
lazyImg(el, arr);
|
|
|
|
|
},
|
|
|
|
|
globalComponentSize: () => {
|
|
|
|
|
globalComponentSize();
|
|
|
|
|
},
|
|
|
|
|
deepClone: (obj: any) => {
|
|
|
|
|
deepClone(obj);
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 统一批量导出
|
|
|
|
|
export default other;
|