1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
| npm init vue#latest npm init vite@latest //该方式创建时没有router选项 npm install vue-router -s
router/index.ts import { createRouter,createWebhistory ,RouteRecordRaw} from 'vue-router' const routes:Array<RouteRecordRaw> = [{ path:'/login', component:Login | () => import('./Login.vue') }] const router = createRouter({ history:createWebhistory(), routes }) export default router
main.ts import router from '..' app.use(router)
app.vue router-view router-link to="/login"
路由模式的变化 vue2 mode => vue3 mode hash => createHashHistory history => createWebHistory abstract => createMemoryHistory
hash模式实现原理是location.hash location.hash = '/login' 监听左右箭头前进和回退 window.addEventListener('hashchange',(e)=>{console.log(e)})//监听前进和回退
history模式不带#,是基于h5的history实现的 监听左右箭头 window.addEventListener('popstate',(e)=>{console.log(e)})
跳转方式 history.pushState({},'','/login')
编程式导航 { path:'', name:'Login', component:'' } router-link to="path" router-link :to="{name:'Login'}" import { useRouter } from 'vue-router' const router = useRouter() @click = () => { router.push('/login') router.push({ path:'/login', }) router.push({ name:'Login', }) }
不保存历史记录 router-link replace :to="{name:'Login'}" //添加replace以后不保存历史记录 @click = () => { router.replace('/login') } 前进和后退 router.go(1) //前进 router.back(1) //后退
路由传参 新的和json2TS差不多的插件=》 json to ts ctrl + shift + alt + s
@click = (obj) => { router.push('/login') router.push({ path:'/login', query:obj //query只能接收对象 }) router.push({ name:'Login', params:{} //地址栏不会显示传参信息,params参数存在内存中,因此刷新页面参数会丢失 }) }
在跳转的页面获取传值 import { useRoute } from 'vue-router' const route = useRoute() route.params route.query
动态路由传参 { path:'/login/:id', name:'Login', component:'' } router.push({ name:'Login', params:{ id:item.id //和路径后动态的参数名要相同 } //地址栏不会显示传参信息,params参数存在内存中,因此刷新页面参数会丢失 }) 嵌套路由 { path:'/home', name:'Home', component:Home, children:[{ path:'/login', //最后的跳转路径 /home/login name:'Login', component:Login, }] }
命名视图 命名视图可以在同一级/同一个组件中展示更多的路由视图,而不是嵌套展示,命名视图可以让一个组件中具有多个路由渲染出口。对于一些固定布局的组件非常有用,类似具名插槽,视图默认名称也是default 一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件 { path:'/home', name:'Home', components:{ default:()=>import(Home), header:()=>import(Header), content:()=>import(Content) } }
使用时 router-view router-view name="header" router-view name="content"
路由重定向,路由别名 重定向方式1:字符串形式 { path:'/home', name:'Home', component:Home, children:[{ path:'/login', //最后的跳转路径 /home/login name:'Login', component:Login, }] },{ path:'/', redirect:"/home", //重定向 }
重定向方式2:对象形式 { path:'/', redirect:{ path:'/home' } }
重定向方式2:回调函数形式 { path:'/', redirect: (to) => { return '/home' return { path:'/home', params:{ name:'hao' //传参 } } } }
路由别名alias { path:'/home', component:Home, alias:['/red','/green','/blue'] // 无论访问哪个路由,都是/home }
导航守卫 全局前置守卫 router.beforeEach((to,next,from)=>{ })
后置守卫 router.afterEach((to,next,from)=>{ })
导航进度条,设置动画 window.requestAnimationFrame() window.cancelAnimationFrame()
路由元信息 { path:'/home', component:Home, meta:{ title:'首页', //页面标题 nedd:true //是否需要权限 } } 使用 守卫中 console.log(to) //to中包含meta
路由过渡动效/copy的小满大佬文章 想要在你的路径组件上使用转场,并对导航进行动画处理,你需要使用 v-slot API: <router-view #default="{route,Component}"> <transition :enter-active-class="`animate__animated ${route.meta.transition}`"> <component :is="Component"></component> </transition> </router-view> 上面的用法会对所有的路由使用相同的过渡。如果你想让每个路由的组件有不同的过渡,你可以将元信息和动态的 name 结合在一起,放在<transition> 上:
declare module 'vue-router'{ interface RouteMeta { title:string, transition:string, } } const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/', component: () => import('@/views/Login.vue'), meta:{ title:"登录页面", transition:"animate__fadeInUp", } }, { path: '/index', component: () => import('@/views/Index.vue'), meta:{ title:"首页!!!", transition:"animate__bounceIn", } } ] })
滚动行为 使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。vue-router 可以自定义路由切换时页面如何滚动。
当创建一个 Router 实例,你可以提供一个 scrollBehavior 方法
const router = createRouter({ history: createWebHistory(), scrollBehavior: (to, from, savePosition) => { 记录上个页面滚动至的位置,返回依旧处于那个位置 if(savePosition){ return savePosition } else { return { top:0 } } 或者 console.log(to, '==============>', savePosition); return new Promise((r) => { //支持异步 setTimeout(() => { r({ top: 10000 }) }, 2000); }) }, scrollBehavior 方法接收 to 和 from 路由对象。第三个参数 savedPosition 当且仅当 popstate 导航 (通过浏览器的 前进/后退 按钮触发) 时才可用。
scrollBehavior 返回滚动位置的对象信息,长这样:
{ left: number, top: number } const router = createRouter({ history: createWebHistory(), scrollBehavior: (to, from, savePosition) => { return { top:200 } }
动态路由
|