From cb63cd54f45a3e50d7d152de6e36761f63107562 Mon Sep 17 00:00:00 2001 From: Efremov Alexey Date: Mon, 29 Nov 2021 13:47:23 +0300 Subject: [PATCH] feat: add support hash router --- index.d.ts | 4 +++- index.js | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/index.d.ts b/index.d.ts index abfb8b9..1bef559 100644 --- a/index.d.ts +++ b/index.d.ts @@ -94,9 +94,11 @@ export interface Router * ``` * * @param routes URL patterns. + * @param options (Optional) { hash?: boolean } */ export function createRouter( - routes: Routes + routes: Routes, + options?: { hash?: boolean } ): Router /** diff --git a/index.js b/index.js index ed5c8fe..e1e5186 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,13 @@ import { atom, onMount } from 'nanostores' -export function createRouter(routes) { +export function createRouter(routes, options) { let router = atom() + let isHashRouter = options && options.hash; + + let getPathname = isHashRouter + ? () => location.hash.replace(/^#\/?/, '') + : () => location.pathname + router.routes = Object.keys(routes).map(name => { let value = routes[name] if (typeof value === 'string') { @@ -75,20 +81,21 @@ export function createRouter(routes) { } let popstate = () => { - let page = parse(location.pathname) + let page = parse(getPathname()) if (page !== false) set(page) } if (typeof window !== 'undefined' && typeof location !== 'undefined') { onMount(router, () => { - let page = parse(location.pathname) + let page = parse(getPathname()) if (page !== false) set(page) document.body.addEventListener('click', click) - window.addEventListener('popstate', popstate) + let eventName = isHashRouter ? 'hashchange' : 'popstate' + window.addEventListener(eventName, popstate) return () => { prev = undefined document.body.removeEventListener('click', click) - window.removeEventListener('popstate', popstate) + window.removeEventListener(eventName, popstate) } }) } else { @@ -99,10 +106,11 @@ export function createRouter(routes) { let page = parse(path) if (page !== false) { if (typeof history !== 'undefined') { + let pageFix = isHashRouter ? '#' + path : path if (redirect) { - history.replaceState(null, null, path) + history.replaceState(null, null, pageFix) } else { - history.pushState(null, null, path) + history.pushState(null, null, pageFix) } } set(page)