util.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // 空对象和数组
  2. export const emptyObj = Object.create(null)
  3. export const emptyArray = []
  4. // 是否定义
  5. export function isDef (v) {
  6. return v !== undefined && v !== null
  7. }
  8. // 防抖
  9. export function debounce (fn, delay = 200) {
  10. let timeout = null
  11. return function () {
  12. let context = this
  13. let args = arguments
  14. clearTimeout(timeout)
  15. timeout = setTimeout(() => {
  16. fn.call(context, args)
  17. }, delay)
  18. }
  19. }
  20. // 队列执行promise
  21. export function promiseQueue (promises, isFinally = true) {
  22. let queue = Promise.resolve()
  23. const type = isFinally ? 'finally' : 'then'
  24. for (let item of promises) {
  25. queue = queue[type](item)
  26. }
  27. return queue
  28. }
  29. // 滚动
  30. export function scrollTo ($el, left = 0, top = 0) {
  31. if ($el.scrollTo) {
  32. $el.scrollTo({
  33. left,
  34. top,
  35. behavior: 'smooth'
  36. })
  37. } else {
  38. $el.scrollLeft = left
  39. $el.scrollTop = top
  40. }
  41. }
  42. /* 组件方法 */
  43. // 获取第一个子组件
  44. export function getFirstComponentChild (children) {
  45. if (Array.isArray(children)) {
  46. for (let i = 0; i < children.length; i++) {
  47. const c = children[i]
  48. if (
  49. isDef(c) &&
  50. (isDef(c.componentOptions) || isAsyncPlaceholder(c))
  51. ) {
  52. return c
  53. }
  54. }
  55. }
  56. }
  57. // 获取缓存key
  58. export function getAliveKey (route = this.$route) {
  59. let aliveKey = (route.meta && route.meta.aliveKey) || this.aliveKey || 'path'
  60. if (typeof aliveKey === 'function') {
  61. return aliveKey.bind(this)(route)
  62. }
  63. return route[aliveKey]
  64. }
  65. /* 路由方法 */
  66. // 是否异步占位
  67. export function isAsyncPlaceholder (node) {
  68. return node.isComment && node.asyncFactory
  69. }
  70. // 获取路由不带hash的路径
  71. export function getPathWithoutHash (route) {
  72. return route.hash
  73. ? route.fullPath.replace(route.hash, '')
  74. : route.fullPath
  75. }
  76. // 是否相似路由
  77. export function isAlikeRoute (route1, route2) {
  78. return getPathWithoutHash(route1) === getPathWithoutHash(route2)
  79. }
  80. // 获取路由页面组件
  81. export function getRouteComponent ({ matched }) {
  82. return matched[matched.length - 1].components.default
  83. }
  84. // 路由是否共用组件
  85. export function isSameComponentRoute (route1, route2) {
  86. return getRouteComponent(route1) === getRouteComponent(route2)
  87. }