4
4
5
5
## 1.1 比较两种
6
6
1 . 是否需要服务器支持?
7
- - hash不需要,因为` #hash ` 并没有改变url的地址,始终指向同一个地址,可以静态部署
8
- - history需要,url改变了,需要服务器把所有路由都重定向到根页面
7
+ - hash不需要,因为` #hash ` 并没有改变url的地址,始终指向同一个地址,可以静态部署
8
+ - history需要,url改变了,需要服务器把所有路由都重定向到根页面
9
9
2 . 用户访问url或手动刷新时?
10
- - hash:始终返回同一个html,静态地址即可
11
- - history:访问非根目录的路由时,需要后端重定向到根页面,并返回根页面的html
10
+ - hash:始终返回同一个html,静态地址即可
11
+ - history:访问非根目录的路由时,需要后端重定向到根页面,并返回根页面的html
12
12
3 . 用户在页面内进行跳转时?
13
- - 都不会向服务器发起请求,执行内部的js代码
13
+ - 都不会向服务器发起请求,执行内部的js代码
14
14
4 . 跳转的参数
15
- - hash:hash值就是参数,参数携带在url中
16
- - history:参数携带在state中
15
+ - hash:hash值就是参数,参数携带在url中
16
+ - history:参数携带在state中
17
+
18
+ ## 1.2 三种行为对应的事件
19
+ 1 . 页面加载或刷新:触发onload事件
20
+ 2 . 相同url下改变hash:触发hashchange事件
21
+ 3 . history路由切换:无官方事件触发
22
+ 4 . 导航的前进后退:触发onpopstate事件
17
23
18
24
## 现象1:在https://lemonc747.github.io/react-playground/内路由跳转可以正常跳转,但刷新后就github-404页面了?
19
25
因为` github.io ` 上是静态的html,访问根页面时,url指向根页面的地址正确。
25
31
在url中添加` #[hash] ` ,即可改变url的hash值。
26
32
27
33
原理:通过监听全局的` hashChange ` 事件,当url的hash改变时进行判断和匹配
28
-
29
34
![ ] ( ./assets/hash_route.jpeg )
30
35
31
36
``` ts
@@ -46,15 +51,25 @@ window.onhashchange = () => {
46
51
location .hash = " #hash1" ;
47
52
```
48
53
49
- ### hash路由的应用
50
- ### hash注意点
51
- 1 . 改变url的hash值,不会触发页面的重新加载(load事件),会触发hashchange事件
52
-
53
54
# 三 history路由
54
- 在保持url同源的情况下,改变url。
55
-
56
55
![ ] ( ./assets//history_route.jpeg )
57
56
57
+ ## 3.1 history api
58
+ [ reference: MDN-history ] ( https://developer.mozilla.org/en-US/docs/Web/API/History )
59
+
60
+ - forward: 导航前进
61
+ - back: 导航后退
62
+ - go: 导航前进或后退几页
63
+ - pushState: 添加新的历史记录
64
+ - replaceState: 修改当前页的历史记录
65
+ - onpopstate: 导航前进或后退时触发,获取当前历史记录携带的state数据
66
+
67
+ ### pushState
68
+ ``` ts
69
+ (method ) History .pushState (data : any , unused : string , url ?: string | URL | null | undefined ): void
70
+ ```
71
+
72
+
58
73
59
74
# 四 浏览器URL跳转原理
60
75
0 commit comments