From 80a58ac11620fd7caed9184e90b4d737b6a17ce1 Mon Sep 17 00:00:00 2001 From: yutent Date: Mon, 14 Aug 2023 18:44:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90history=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/router-components.js | 2 +- src/router/router-engine.js | 41 ++++++++++++++++++++++++--------- src/utils.js | 13 ----------- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/router/router-components.js b/src/router/router-components.js index 758267b..df63f42 100644 --- a/src/router/router-components.js +++ b/src/router/router-components.js @@ -106,7 +106,7 @@ class RouterLink extends Component { if (type === 'hash') { location.hash = this.#href } else { - window.history.pushState({ path }, null, this.#href) + this.$router.push(this.to) } } diff --git a/src/router/router-engine.js b/src/router/router-engine.js index fb2ac6f..16046c6 100644 --- a/src/router/router-engine.js +++ b/src/router/router-engine.js @@ -11,8 +11,11 @@ import { noop, query2object, object2query } from '../utils.js' const PREFIX_REGEXP = /^(#!|#)[\/]+?/ const RULE_REGEXP = /(\/[^/]*)(:[A-Za-z0-9_]+)(\?)?/g +const MODE_HASH = 'hash' +const MODE_HISTORY = 'history' + class Router { - type = 'hash' + type = MODE_HASH #tables = new Map() #views = new Set() @@ -24,7 +27,7 @@ class Router { #beforeEach - constructor(type = 'hash') { + constructor(type = MODE_HASH) { this.type = type bind(window, 'popstate', this.#hashchange.bind(this)) } @@ -91,8 +94,12 @@ class Router { // 路由检测 #check() { + let isHash = this.type === MODE_HASH let $view = window.__wkitd__.get('ROUTER_VIEW') - let path = location.hash + let hash = location.hash + let path = isHash + ? location.hash + : location.href.replace(location.origin, '').replace(hash, '') let query if (path.includes('?')) { @@ -197,11 +204,12 @@ class Router { // push(obj = { path: '', query: {} }, replace = false) { - let path = '' - if (typeof path === 'string') { + let path = '', + query = '' + if (typeof obj === 'string') { path = obj.trim() } else { - let query = object2query(obj.query || '') + query = object2query(obj.query || '') path = obj.path + (query ? `?${query}` : '') } @@ -210,10 +218,21 @@ class Router { return } - if (replace) { - location.replace(path.replace(/^\//, '#/')) + if (this.type === MODE_HASH) { + if (replace) { + location.replace(path.replace(/^\//, '#/')) + } else { + location.hash = path + } } else { - location.hash = path + if (replace) { + window.history.replaceState({ path }, null, path + query) + } else { + window.history.pushState({ path }, null, path + query) + } + // pushState & replaceState 不会触发popstate事件 + // 要手动触发路由检测 + this.#check() } } @@ -224,9 +243,9 @@ class Router { } export function createWebHashHistory() { - return () => new Router('hash') + return () => new Router() } export function createWebHistory() { - return () => new Router('history') + return () => new Router(MODE_HISTORY) } diff --git a/src/utils.js b/src/utils.js index 0bc829a..f509c90 100644 --- a/src/utils.js +++ b/src/utils.js @@ -17,19 +17,6 @@ export function hideProp(host, name, value) { }) } -// 判定A标签的target属性是否指向自身 -export function targetIsThisWindow(target) { - if ( - !target || - target === window.name || - target === '_self' || - (target === 'top' && window == window.top) - ) { - return true - } - return false -} - /** * query 序列化 */