@tobyas/vue-page-stack
Version:
Routing and navigation for your Vue SPA. Vue 单页应用导航管理器
77 lines (67 loc) • 2.28 kB
JavaScript
import { VuePageStack, getIndexByKey, getStack, clearStackToCurrent, clearStackToFirst, back, push, replace, getPreventNavigation, setPreventNavigation } from './components/VuePageStack';
import mixin from './mixin';
import history from './history';
import config from './config/config';
function hasKey(query, keyName) {
return !!query[keyName];
}
function getKey(src) {
return src.replace(/[xy]/g, function(c) {
let r = (Math.random() * 16) | 0;
let v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
const VuePageStackPlugin = {};
VuePageStackPlugin.install = function(Vue, { router, name = config.componentName, keyName = config.keyName }) {
if (!router) {
throw Error('\n vue-router is necessary. \n\n');
}
Vue.component(name, VuePageStack(keyName));
Vue.prototype.$pageStack = {
getStack,
clearStackToCurrent,
clearStackToFirst,
back,
push,
replace
};
mixin(router);
function beforeEach(to, from, next) {
window.console.log('[VuePageStack] preventNavigation', getPreventNavigation())
if(getPreventNavigation()) {
window.console.log('[VuePageStack] preventNavigation')
setPreventNavigation(false);
return;
}
// if (to.query[keyName] && from.query[keyName] && to.query[keyName] == from.query[keyName]) {
// window.console.log('[VuePageStack] navigated to same route')
// next();
// return;
// }
if (!hasKey(to.query, keyName)) {
to.query[keyName] = getKey('xxxxxxxx');
let replace = history.action === config.replaceName || !hasKey(from.query, keyName);
next({
hash: to.hash,
path: to.path,
name: to.name,
params: to.params,
query: to.query,
meta: to.meta,
replace: replace
});
} else {
let index = getIndexByKey(to.query[keyName]);
if (index === -1) {
to.params[keyName + '-dir'] = config.forwardName;
} else {
to.params[keyName + '-dir'] = config.backName;
}
next({ params: to.params });
}
}
// ensure it's the first beforeEach hook
router.beforeHooks.unshift(beforeEach);
};
export default VuePageStackPlugin;