utils.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { unref } from 'vue'
  2. import { isObject } from '@/utils/is'
  3. // dynamic use hook props
  4. export const getDynamicProps = <T, U>(props: T): Partial<U> => {
  5. const ret: Recordable = {}
  6. Object.keys(props).map((key) => {
  7. ret[key] = unref((props as Recordable)[key])
  8. })
  9. return ret as Partial<U>
  10. }
  11. export const openWindow = (
  12. url: string,
  13. opt?: {
  14. target?: '_self' | '_blank' | string
  15. noopener?: boolean
  16. noreferrer?: boolean
  17. }
  18. ) => {
  19. const { target = '__blank', noopener = true, noreferrer = true } = opt || {}
  20. const feature: string[] = []
  21. noopener && feature.push('noopener=yes')
  22. noreferrer && feature.push('noreferrer=yes')
  23. window.open(url, target, feature.join(','))
  24. }
  25. /**
  26. * Add the object as a parameter to the URL
  27. * @param baseUrl url
  28. * @param obj
  29. * @returns {string}
  30. * eg:
  31. * let obj = {a: '3', b: '4'}
  32. * setObjToUrlParams('www.baidu.com', obj)
  33. * ==>www.baidu.com?a=3&b=4
  34. */
  35. export const setObjToUrlParams = (baseUrl: string, obj: any): string => {
  36. let parameters = ''
  37. for (const key in obj) {
  38. parameters += key + '=' + encodeURIComponent(obj[key]) + '&'
  39. }
  40. parameters = parameters.replace(/&$/, '')
  41. return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters
  42. }
  43. /**
  44. * @description: Set ui mount node
  45. */
  46. export const getPopupContainer = (node?: HTMLElement): HTMLElement => {
  47. return (node?.parentNode as HTMLElement) ?? document.body
  48. }
  49. export function deepMerge<T = any>(src: any = {}, target: any = {}): T {
  50. let key: string
  51. for (key in target) {
  52. src[key] = isObject(src[key]) ? deepMerge(src[key], target[key]) : (src[key] = target[key])
  53. }
  54. return src
  55. }