index.ts 3.0 KB

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