PageAction.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { EventBus } from "@/common/EventBus";
  2. import { onBeforeUnmount, onMounted, type App } from "vue";
  3. import { useRoute, useRouter, type LocationQueryRaw } from "vue-router";
  4. /**
  5. * 说明:页面导航相关函数封装。
  6. */
  7. type OnPageBackCb = (data: Record<string, unknown>) => void
  8. const EventBusName = 'pageActionListenOnPageBack';
  9. export function useOnPageBack() {
  10. const route = useRoute();
  11. const cbs : OnPageBackCb[] = []
  12. function onPageBack(cb: OnPageBackCb) {
  13. cbs.push(cb)
  14. }
  15. onMounted(() => {
  16. EventBus.on(EventBusName, (e) => {
  17. if (e.name === route.name) {
  18. cbs.forEach((cb) => {
  19. cb(e.data);
  20. })
  21. }
  22. });
  23. });
  24. onBeforeUnmount(() => {
  25. EventBus.off(EventBusName);
  26. });
  27. return {
  28. onPageBack,
  29. }
  30. }
  31. export function usePageAction() {
  32. const router = useRouter();
  33. /**
  34. * 页面跳转: 后退至上一个页面。
  35. */
  36. function back() {
  37. router.back();
  38. }
  39. /**
  40. * 页面跳转: 后退并返回数据至上一个页面的 onPageBack 方法。
  41. * @param data 要返回的数据
  42. */
  43. function backReturnData(data: Record<string, unknown>) {
  44. callPrevOnPageBack('' + router.options.history.state.back, data);
  45. router.back();
  46. }
  47. /**
  48. * 页面跳转: 跳转到指定页面
  49. * @param url 页面路径
  50. * @param data 要传递的数据
  51. */
  52. function navTo(url: string, data: Record<string, unknown> = {}) {
  53. const data2 : LocationQueryRaw = {}
  54. for (const key in data) {
  55. if (Object.prototype.hasOwnProperty.call(data, key))
  56. data2[key] = data[key] as string;
  57. }
  58. router.push({
  59. path: url,
  60. query: data2,
  61. });
  62. }
  63. /**
  64. * 页面数据传递: 调用上一个页面的 onPageBack 方法
  65. * @param name 方法名
  66. * @param data 要传递的数据
  67. */
  68. function callPrevOnPageBack(name: string, data: Record<string, unknown>) {
  69. EventBus.emit(EventBusName, {
  70. name,
  71. data,
  72. })
  73. }
  74. /**
  75. * 页面跳转: 调用上一个页面的 onPageBack 方法并返回至上一个页面
  76. * @param name 方法名
  77. * @param data 要传递的数据
  78. */
  79. function backAndCallOnPageBack(name: string, data: Record<string, unknown>) {
  80. router.back();
  81. callPrevOnPageBack(name, data);
  82. }
  83. return {
  84. back,
  85. backReturnData,
  86. backAndCallOnPageBack,
  87. navTo,
  88. callPrevOnPageBack,
  89. }
  90. }