@lytjs/router 4.0.5 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +253 -0
- package/package.json +3 -3
package/README.md
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# @lytjs/router
|
|
2
|
+
|
|
3
|
+
Lyt.js 官方路由 - 提供 History / Hash 模式、导航守卫、动态路由等能力。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @lytjs/router
|
|
9
|
+
|
|
10
|
+
# 或使用 pnpm
|
|
11
|
+
pnpm add @lytjs/router
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 特性
|
|
15
|
+
|
|
16
|
+
- 🚀 History / Hash 双模式
|
|
17
|
+
- 🔄 完整的导航守卫
|
|
18
|
+
- 📦 动态路由匹配
|
|
19
|
+
- 🎯 嵌套路由
|
|
20
|
+
- 📋 命名路由和命名视图
|
|
21
|
+
- 🔌 零运行时依赖
|
|
22
|
+
|
|
23
|
+
## 快速开始
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
import { createRouter, createWebHistory } from '@lytjs/router';
|
|
27
|
+
import { createApp } from '@lytjs/core';
|
|
28
|
+
import Home from './views/Home.vue';
|
|
29
|
+
import About from './views/About.vue';
|
|
30
|
+
|
|
31
|
+
// 1. 定义路由
|
|
32
|
+
const routes = [
|
|
33
|
+
{ path: '/', component: Home },
|
|
34
|
+
{ path: '/about', component: About }
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
// 2. 创建路由实例
|
|
38
|
+
const router = createRouter({
|
|
39
|
+
history: createWebHistory(),
|
|
40
|
+
routes
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// 3. 创建应用并使用路由
|
|
44
|
+
const app = createApp(App);
|
|
45
|
+
app.use(router);
|
|
46
|
+
app.mount('#app');
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## API 参考
|
|
50
|
+
|
|
51
|
+
### 路由创建
|
|
52
|
+
|
|
53
|
+
| API | 说明 |
|
|
54
|
+
|------|------|
|
|
55
|
+
| `createRouter(options)` | 创建路由实例 |
|
|
56
|
+
| `createWebHistory(base)` | HTML5 History 模式 |
|
|
57
|
+
| `createWebHashHistory(base)` | Hash 模式 |
|
|
58
|
+
| `createMemoryHistory(base)` | 内存模式(测试用) |
|
|
59
|
+
|
|
60
|
+
### 组件
|
|
61
|
+
|
|
62
|
+
| 组件 | 说明 |
|
|
63
|
+
|------|------|
|
|
64
|
+
| `<router-view>` | 路由视图出口 |
|
|
65
|
+
| `<router-link>` | 路由导航链接 |
|
|
66
|
+
|
|
67
|
+
### 组合式 API
|
|
68
|
+
|
|
69
|
+
| API | 说明 |
|
|
70
|
+
|------|------|
|
|
71
|
+
| `useRouter()` | 获取路由实例 |
|
|
72
|
+
| `useRoute()` | 获取当前路由信息 |
|
|
73
|
+
| `useLink(props)` | 创建导航链接 |
|
|
74
|
+
|
|
75
|
+
## 路由配置
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
const routes = [
|
|
79
|
+
{
|
|
80
|
+
path: '/',
|
|
81
|
+
name: 'home',
|
|
82
|
+
component: Home,
|
|
83
|
+
meta: { title: '首页' }
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
path: '/user/:id',
|
|
87
|
+
name: 'user',
|
|
88
|
+
component: User,
|
|
89
|
+
props: true
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
path: '/parent',
|
|
93
|
+
component: Parent,
|
|
94
|
+
children: [
|
|
95
|
+
{
|
|
96
|
+
path: 'child',
|
|
97
|
+
component: Child
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
];
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 导航守卫
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// 全局前置守卫
|
|
108
|
+
router.beforeEach((to, from) => {
|
|
109
|
+
if (!isAuthenticated && to.path !== '/login') {
|
|
110
|
+
return '/login';
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// 全局解析守卫
|
|
115
|
+
router.beforeResolve(async (to) => {
|
|
116
|
+
// 在导航被确认之前、所有组件内守卫和异步路由组件被解析之后调用
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// 全局后置钩子
|
|
120
|
+
router.afterEach((to, from) => {
|
|
121
|
+
document.title = to.meta.title;
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## 组件内守卫
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
import { onBeforeRouteLeave, onBeforeRouteUpdate } from '@lytjs/router';
|
|
129
|
+
|
|
130
|
+
onBeforeRouteLeave((to, from) => {
|
|
131
|
+
const answer = window.confirm('确定要离开吗?');
|
|
132
|
+
if (!answer) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
onBeforeRouteUpdate((to, from) => {
|
|
138
|
+
// 在当前路由改变,但是该组件被复用时调用
|
|
139
|
+
console.log('路由更新了');
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 路由元信息
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
const routes = [
|
|
147
|
+
{
|
|
148
|
+
path: '/admin',
|
|
149
|
+
component: Admin,
|
|
150
|
+
meta: { requiresAuth: true }
|
|
151
|
+
}
|
|
152
|
+
];
|
|
153
|
+
|
|
154
|
+
router.beforeEach((to, from) => {
|
|
155
|
+
if (to.meta.requiresAuth && !isAuthenticated()) {
|
|
156
|
+
return {
|
|
157
|
+
path: '/login',
|
|
158
|
+
query: { redirect: to.fullPath }
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 示例
|
|
165
|
+
|
|
166
|
+
### 编程式导航
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
import { useRouter } from '@lytjs/router';
|
|
170
|
+
|
|
171
|
+
const router = useRouter();
|
|
172
|
+
|
|
173
|
+
// 字符串路径
|
|
174
|
+
router.push('/users');
|
|
175
|
+
|
|
176
|
+
// 带路径的对象
|
|
177
|
+
router.push({ path: '/users' });
|
|
178
|
+
|
|
179
|
+
// 命名的路由
|
|
180
|
+
router.push({ name: 'user', params: { id: '123' } });
|
|
181
|
+
|
|
182
|
+
// 带查询参数,变成 /register?plan=private
|
|
183
|
+
router.push({ path: '/register', query: { plan: 'private' } });
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 获取路由信息
|
|
187
|
+
|
|
188
|
+
```javascript
|
|
189
|
+
import { useRoute } from '@lytjs/router';
|
|
190
|
+
|
|
191
|
+
const route = useRoute();
|
|
192
|
+
|
|
193
|
+
console.log(route.path); // 当前路径
|
|
194
|
+
console.log(route.params); // 动态参数
|
|
195
|
+
console.log(route.query); // 查询参数
|
|
196
|
+
console.log(route.meta); // 元信息
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 嵌套路由
|
|
200
|
+
|
|
201
|
+
```javascript
|
|
202
|
+
const routes = [
|
|
203
|
+
{
|
|
204
|
+
path: '/user/:id',
|
|
205
|
+
component: User,
|
|
206
|
+
children: [
|
|
207
|
+
{
|
|
208
|
+
// 当 /user/:id/profile 匹配成功
|
|
209
|
+
// UserProfile 会被渲染在 User 的 <router-view> 中
|
|
210
|
+
path: 'profile',
|
|
211
|
+
component: UserProfile
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
// 当 /user/:id/posts 匹配成功
|
|
215
|
+
// UserPosts 会被渲染在 User 的 <router-view> 中
|
|
216
|
+
path: 'posts',
|
|
217
|
+
component: UserPosts
|
|
218
|
+
}
|
|
219
|
+
]
|
|
220
|
+
}
|
|
221
|
+
];
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 重定向和别名
|
|
225
|
+
|
|
226
|
+
```javascript
|
|
227
|
+
const routes = [
|
|
228
|
+
// 重定向
|
|
229
|
+
{ path: '/home', redirect: '/' },
|
|
230
|
+
{ path: '/home', redirect: { name: 'homepage' } },
|
|
231
|
+
|
|
232
|
+
// 别名
|
|
233
|
+
{ path: '/', component: Home, alias: '/home' }
|
|
234
|
+
];
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## 性能
|
|
238
|
+
|
|
239
|
+
- 体积小,零运行时依赖
|
|
240
|
+
- 按需加载路由
|
|
241
|
+
- 高效的路径匹配算法
|
|
242
|
+
|
|
243
|
+
## 兼容性
|
|
244
|
+
|
|
245
|
+
- Node.js >= 18.0.0
|
|
246
|
+
- Chrome 64+
|
|
247
|
+
- Firefox 63+
|
|
248
|
+
- Safari 12+
|
|
249
|
+
- Edge 79+
|
|
250
|
+
|
|
251
|
+
## License
|
|
252
|
+
|
|
253
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lytjs/router",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.2.0",
|
|
4
4
|
"description": "Lyt.js 内置路由 - History/Hash 模式、导航守卫、动态路由",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"hash"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@lytjs/common": "^4.0
|
|
42
|
-
"@lytjs/reactivity": "^4.0
|
|
41
|
+
"@lytjs/common": "^4.2.0",
|
|
42
|
+
"@lytjs/reactivity": "^4.2.0"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=18.0.0"
|