hooks.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { isString, isEmpty } from "@pureadmin/utils";
  2. import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
  3. import {
  4. useRouter,
  5. useRoute,
  6. type LocationQueryRaw,
  7. type RouteParamsRaw
  8. } from "vue-router";
  9. export function useDetail() {
  10. const route = useRoute();
  11. const router = useRouter();
  12. const getParameter = isEmpty(route.params) ? route.query : route.params;
  13. function toDetail(
  14. parameter: LocationQueryRaw | RouteParamsRaw,
  15. model: "query" | "params"
  16. ) {
  17. // ⚠️ 这里要特别注意下,因为vue-router在解析路由参数的时候会自动转化成字符串类型,比如在使用useRoute().route.query或useRoute().route.params时,得到的参数都是字符串类型
  18. // 所以在传参的时候,如果参数是数字类型,就需要在此处 toString() 一下,保证传参跟路由参数类型一致都是字符串,这是必不可少的环节!!!
  19. Object.keys(parameter).forEach(param => {
  20. if (!isString(parameter[param])) {
  21. parameter[param] = parameter[param].toString();
  22. }
  23. });
  24. if (model === "query") {
  25. // 保存信息到标签页
  26. useMultiTagsStoreHook().handleTags("push", {
  27. path: `/tabs/query-detail`,
  28. name: "TabQueryDetail",
  29. query: parameter,
  30. meta: {
  31. title: {
  32. zh: `No.${parameter.id} - 详情信息`,
  33. en: `No.${parameter.id} - DetailInfo`
  34. },
  35. // 如果使用的是非国际化精简版title可以像下面这么写
  36. // title: `No.${index} - 详情信息`,
  37. // 最大打开标签数
  38. dynamicLevel: 3
  39. }
  40. });
  41. // 路由跳转
  42. router.push({ name: "TabQueryDetail", query: parameter });
  43. } else if (model === "params") {
  44. useMultiTagsStoreHook().handleTags("push", {
  45. path: `/tabs/params-detail/:id`,
  46. name: "TabParamsDetail",
  47. params: parameter,
  48. meta: {
  49. title: {
  50. zh: `No.${parameter.id} - 详情信息`,
  51. en: `No.${parameter.id} - DetailInfo`
  52. }
  53. // 如果使用的是非国际化精简版title可以像下面这么写
  54. // title: `No.${index} - 详情信息`,
  55. }
  56. });
  57. router.push({ name: "TabParamsDetail", params: parameter });
  58. }
  59. }
  60. // 用于页面刷新,重新获取浏览器地址栏参数并保存到标签页
  61. const initToDetail = (model: "query" | "params") => {
  62. if (getParameter) toDetail(getParameter, model);
  63. };
  64. return { toDetail, initToDetail, getParameter, router };
  65. }