useStationScope.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { onMounted, onUnmounted } from "vue";
  2. import { emitter } from "@/utils/mitt";
  3. //Session 读取(与顶栏站点切换器写入格式一致:sessionStorage + JSON)
  4. const getCurrentStationId = () => {
  5. const value = sessionStorage.getItem("currentStationId");
  6. if (!value) return null;
  7. try {
  8. return JSON.parse(value);
  9. } catch {
  10. return null;
  11. }
  12. };
  13. /**
  14. * 站点范围组合式函数:页面站点筛选与全局"当前站点"联动
  15. * 1. 页面初始化时,若站点筛选为空则默认选中全局当前站点(onMounted 中先于页面自身加载执行)
  16. * 2. 全局站点切换时(顶栏站点选择器),联动更新页面筛选并刷新列表
  17. *
  18. * @param formQuery 页面查询条件对象(需包含 stationId 字段)
  19. * @param loadData 页面数据加载方法,切换站点时以 refresh=true 重新加载
  20. * @param options.follow 是否响应全局站点切换,默认 true
  21. */
  22. export const useStationScope = (
  23. formQuery: any,
  24. loadData?: (refresh?: boolean) => void,
  25. options?: { follow?: boolean }
  26. ) => {
  27. const follow = options?.follow !== false;
  28. const onStationChange = (stationId: any) => {
  29. if (!follow || !stationId) return;
  30. //站点未变化时不重复加载
  31. if (formQuery.stationId === stationId) return;
  32. formQuery.stationId = stationId;
  33. if (loadData) loadData(true);
  34. };
  35. onMounted(() => {
  36. //初始化:站点筛选为空时默认选中全局当前站点
  37. if (!formQuery.stationId) {
  38. const currentStationId = getCurrentStationId();
  39. if (currentStationId) {
  40. formQuery.stationId = currentStationId;
  41. }
  42. }
  43. emitter.on("stationChangeRefresh", onStationChange);
  44. });
  45. onUnmounted(() => {
  46. emitter.off("stationChangeRefresh", onStationChange);
  47. });
  48. };