Files
yudao-dev/src/utils/navigationReturnState.js

170 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 驾驶舱导航状态管理
* 核心逻辑:
* - 菜单进入:清空导航栈
* - 页面跳转 push当前页面状态入栈
* - 返回 go(-1):出栈,恢复前一个页面状态
* - 返回按钮:栈长度 > 0 时显示
*/
const STACK_KEY = 'cockpit_nav_stack';
const STATE_PREFIX = 'cockpit_nav_state_';
/**
* 获取导航栈
* @returns {Array<{ path: string, state: object }>}
*/
export function getNavStack() {
try {
const raw = sessionStorage.getItem(STACK_KEY);
if (!raw) return [];
return JSON.parse(raw);
} catch (e) {
return [];
}
}
/**
* 获取导航栈长度
* @returns {number}
*/
export function getNavStackLength() {
return getNavStack().length;
}
/**
* 页面跳转时调用:将当前页面状态入栈
* @param {string} fromPath - 来源页面路径
* @param {object} state - 来源页面的业务状态(如 dateData
*/
export function pushNavigation(fromPath, state = {}) {
if (!fromPath) return;
try {
const stack = getNavStack();
stack.push({
path: fromPath,
state,
timestamp: Date.now()
});
sessionStorage.setItem(STACK_KEY, JSON.stringify(stack));
console.log('[navigation] push', fromPath, 'stack length:', stack.length);
} catch (e) {
console.warn('[navigation] push failed', e);
}
}
/**
* 返回时调用:出栈,返回前一个页面信息
* @returns {{ path: string, state: object } | null}
*/
export function popNavigation() {
try {
const stack = getNavStack();
if (stack.length === 0) return null;
const prev = stack.pop();
sessionStorage.setItem(STACK_KEY, JSON.stringify(stack));
console.log('[navigation] pop', prev.path, 'stack length:', stack.length);
return prev;
} catch (e) {
console.warn('[navigation] pop failed', e);
return null;
}
}
/**
* 清空导航栈和所有页面状态
*/
export function clearNavigation() {
try {
// 清空栈
sessionStorage.removeItem(STACK_KEY);
// 清空所有页面状态
Object.keys(sessionStorage)
.filter(k => k.startsWith(STATE_PREFIX))
.forEach(k => sessionStorage.removeItem(k));
console.log('[navigation] cleared');
// 通知所有监听器
window.dispatchEvent(new Event('navigation-cleared'));
} catch (e) {
console.warn('[navigation] clear failed', e);
}
}
/**
* 获取指定页面的状态
* @param {string} path - 页面路径
* @returns {object | null}
*/
export function getNavigationState(path) {
if (!path) return null;
try {
const key = STATE_PREFIX + path;
const raw = sessionStorage.getItem(key);
if (!raw) return null;
return JSON.parse(raw);
} catch (e) {
return null;
}
}
/**
* 消费(读取并删除)指定页面的状态
* @param {string} path - 页面路径
* @returns {object | null}
*/
export function consumeNavigationState(path) {
if (!path) return null;
try {
const key = STATE_PREFIX + path;
const raw = sessionStorage.getItem(key);
if (!raw) return null;
sessionStorage.removeItem(key);
return JSON.parse(raw);
} catch (e) {
try {
sessionStorage.removeItem(STATE_PREFIX + path);
} catch (e2) { /* ignore */ }
return null;
}
}
/**
* 保存指定页面的状态
* @param {string} path - 页面路径
* @param {object} state - 业务状态
*/
export function saveNavigationState(path, state) {
if (!path) return;
try {
const key = STATE_PREFIX + path;
sessionStorage.setItem(key, JSON.stringify(state));
} catch (e) {
console.warn('[navigation] save state failed', e);
}
}
// ============ 兼容旧 API后续可逐步移除===========
/**
* @deprecated 使用 pushNavigation 代替
*/
export function saveNavigationReturnState(scope, state) {
console.warn('[navigation] saveNavigationReturnState 已废弃,请使用 pushNavigation + saveNavigationState');
}
/**
* @deprecated 使用 consumeNavigationState 代替
*/
export function consumeNavigationReturnState(scope) {
console.warn('[navigation] consumeNavigationReturnState 已废弃,请使用 popNavigation + consumeNavigationState');
return null;
}
/**
* @deprecated
*/
export function getNavScope(moduleName) {
console.warn('[navigation] getNavScope 已废弃,请直接使用路径作为 key');
return `nav:${moduleName}`;
}