index.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router';
  2. import type { App, Plugin } from 'vue';
  3. import { unref } from 'vue';
  4. import { isObject } from '/@/utils/is';
  5. export const noop = () => {};
  6. /**
  7. * @description: Set ui mount node
  8. */
  9. export function getPopupContainer(node?: HTMLElement): HTMLElement {
  10. return (node?.parentNode as HTMLElement) ?? document.body;
  11. }
  12. /**
  13. * Add the object as a parameter to the URL
  14. * @param baseUrl url
  15. * @param obj
  16. * @returns {string}
  17. * eg:
  18. * let obj = {a: '3', b: '4'}
  19. * setObjToUrlParams('www.baidu.com', obj)
  20. * ==>www.baidu.com?a=3&b=4
  21. */
  22. export function setObjToUrlParams(baseUrl: string, obj: any): string {
  23. let parameters = '';
  24. for (const key in obj) {
  25. parameters += key + '=' + encodeURIComponent(obj[key]) + '&';
  26. }
  27. parameters = parameters.replace(/&$/, '');
  28. return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters;
  29. }
  30. // 深度合并
  31. export function deepMerge<T = any>(src: any = {}, target: any = {}): T {
  32. let key: string;
  33. for (key in target) {
  34. src[key] = isObject(src[key]) ? deepMerge(src[key], target[key]) : (src[key] = target[key]);
  35. }
  36. return src;
  37. }
  38. export function openWindow(
  39. url: string,
  40. opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean },
  41. ) {
  42. const { target = '__blank', noopener = true, noreferrer = true } = opt || {};
  43. const feature: string[] = [];
  44. noopener && feature.push('noopener=yes');
  45. noreferrer && feature.push('noreferrer=yes');
  46. window.open(url, target, feature.join(','));
  47. }
  48. // dynamic use hook props
  49. export function getDynamicProps<T, U>(props: T): Partial<U> {
  50. const ret: Recordable = {};
  51. Object.keys(props).map((key) => {
  52. ret[key] = unref((props as Recordable)[key]);
  53. });
  54. return ret as Partial<U>;
  55. }
  56. export function getRawRoute(route: RouteLocationNormalized): RouteLocationNormalized {
  57. if (!route) return route;
  58. const { matched, ...opt } = route;
  59. return {
  60. ...opt,
  61. matched: (matched
  62. ? matched.map((item) => ({
  63. meta: item.meta,
  64. name: item.name,
  65. path: item.path,
  66. }))
  67. : undefined) as RouteRecordNormalized[],
  68. };
  69. }
  70. export const withInstall = <T>(component: T, alias?: string) => {
  71. const comp = component as any;
  72. comp.install = (app: App) => {
  73. app.component(comp.name || comp.displayName, component);
  74. if (alias) {
  75. app.config.globalProperties[alias] = component;
  76. }
  77. };
  78. return component as T & Plugin;
  79. };