@vueuse/router
Version:
Utilities for vue-router
158 lines (157 loc) • 4.91 kB
JavaScript
(function(exports, _vueuse_shared, vue, vue_router) {
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
//#region useRouteHash/index.ts
let _hash;
/* @__NO_SIDE_EFFECTS__ */
function useRouteHash(defaultValue, { mode = "replace", route = (0, vue_router.useRoute)(), router = (0, vue_router.useRouter)() } = {}) {
_hash = route.hash;
(0, _vueuse_shared.tryOnScopeDispose)(() => {
_hash = void 0;
});
let _trigger;
const proxy = (0, vue.customRef)((track, trigger) => {
_trigger = trigger;
return {
get() {
track();
return _hash || (0, vue.toValue)(defaultValue);
},
set(v) {
if (v === _hash) return;
_hash = v === null ? void 0 : v;
trigger();
(0, vue.nextTick)(() => {
const { params, query } = route;
router[(0, vue.toValue)(mode)]({
params,
query,
hash: _hash
});
});
}
};
});
(0, vue.watch)(() => route.hash, () => {
if (route.hash === _hash) return;
_hash = route.hash;
_trigger();
}, { flush: "sync" });
return proxy;
}
//#endregion
//#region useRouteParams/index.ts
const _queue$1 = /* @__PURE__ */ new WeakMap();
function useRouteParams(name, defaultValue, options = {}) {
const { mode = "replace", route = (0, vue_router.useRoute)(), router = (0, vue_router.useRouter)(), transform } = options;
let transformGet = (value) => value;
let transformSet = (value) => value;
if (typeof transform === "function") transformGet = transform;
else if (transform) {
if (transform.get) transformGet = transform.get;
if (transform.set) transformSet = transform.set;
}
if (!_queue$1.has(router)) _queue$1.set(router, /* @__PURE__ */ new Map());
const _paramsQueue = _queue$1.get(router);
let param = route.params[name];
(0, _vueuse_shared.tryOnScopeDispose)(() => {
param = void 0;
});
let _trigger;
const proxy = (0, vue.customRef)((track, trigger) => {
_trigger = trigger;
return {
get() {
track();
return transformGet(param !== void 0 && param !== "" ? param : (0, vue.toValue)(defaultValue));
},
set(v) {
v = transformSet(v);
if (param === v) return;
param = v === (0, vue.toValue)(defaultValue) || v === null ? void 0 : v;
_paramsQueue.set(name, v === (0, vue.toValue)(defaultValue) || v === null ? void 0 : v);
trigger();
(0, vue.nextTick)(() => {
if (_paramsQueue.size === 0) return;
const newParams = Object.fromEntries(_paramsQueue.entries());
_paramsQueue.clear();
const { params, query, hash } = route;
router[(0, vue.toValue)(mode)]({
params: {
...params,
...newParams
},
query,
hash
});
});
}
};
});
(0, vue.watch)(() => route.params[name], (v) => {
if (param === transformGet(v)) return;
param = v;
_trigger();
}, { flush: "sync" });
return proxy;
}
//#endregion
//#region useRouteQuery/index.ts
const _queue = /* @__PURE__ */ new WeakMap();
function useRouteQuery(name, defaultValue, options = {}) {
const { mode = "replace", route = (0, vue_router.useRoute)(), router = (0, vue_router.useRouter)(), transform } = options;
let transformGet = (value) => value;
let transformSet = (value) => value;
if (typeof transform === "function") transformGet = transform;
else if (transform) {
if (transform.get) transformGet = transform.get;
if (transform.set) transformSet = transform.set;
}
if (!_queue.has(router)) _queue.set(router, /* @__PURE__ */ new Map());
const _queriesQueue = _queue.get(router);
let query = route.query[name];
(0, _vueuse_shared.tryOnScopeDispose)(() => {
query = void 0;
});
let _trigger;
const proxy = (0, vue.customRef)((track, trigger) => {
_trigger = trigger;
return {
get() {
track();
return transformGet(query !== void 0 ? query : (0, vue.toValue)(defaultValue));
},
set(v) {
v = transformSet(v);
if (query === v) return;
query = v === (0, vue.toValue)(defaultValue) ? void 0 : v;
_queriesQueue.set(name, v === (0, vue.toValue)(defaultValue) ? void 0 : v);
trigger();
(0, vue.nextTick)(() => {
if (_queriesQueue.size === 0) return;
const newQueries = Object.fromEntries(_queriesQueue.entries());
_queriesQueue.clear();
const { params, query, hash } = route;
router[(0, vue.toValue)(mode)]({
params,
query: {
...query,
...newQueries
},
hash
});
});
}
};
});
(0, vue.watch)(() => route.query[name], (v) => {
if (query === transformGet(v)) return;
query = v;
_trigger();
}, { flush: "sync" });
return proxy;
}
//#endregion
exports.useRouteHash = useRouteHash;
exports.useRouteParams = useRouteParams;
exports.useRouteQuery = useRouteQuery;
})(this.VueUse = this.VueUse || {}, VueUse, Vue, VueRouter);