Vue2路由配置该从哪入手?常见问题一次讲清
做Vue2项目时,路由配置总让人犯懵?明明跟着教程做,可一到动态路由、嵌套路由就卡壳,传参也总搞混?别慌!这篇把Vue2路由从基础到进阶的常见问题拆碎了讲,不管是刚入门想搭路由骨架,还是项目里要做权限控制、性能优化,看完思路能顺很多~
Vue2里路由到底有啥用?
你肯定遇过这种情况:做单页面应用(SPA)时,URL没变但页面内容切换了,比如从“首页”点到“关于我们”,页面不刷新却能展示新内容,路由就是干这个的!它帮我们管理不同URL路径和页面组件的对应关系,让SPA能像多页面网站一样,通过URL区分“页面”,还能实现前进后退、权限控制这些功能,简单说,路由是SPA的“导航指挥官”,决定用户访问哪个路径时,该渲染哪个组件~
怎么给Vue2项目搭路由基础环境?
想配路由,第一步得把vue-router
装上,打开终端,在项目根目录执行:
npm install vue-router@2.x # Vue2要对应vue-router2版本,高版本适配Vue3
装完后,按以下步骤配置:
- 创建路由配置文件:在
src
下新建router.js
(或router/index.js
),用来写路由规则。 - 引入并注册VueRouter:
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) // 全局注册插件,让所有组件能用到路由功能
- 定义路由规则:用
routes
数组存每个路径对应的组件,比如有Home.vue
和About.vue
:import Home from './components/Home.vue' import About from './components/About.vue'
const routes = [ { path: '/', // 访问根路径时 component: Home // 渲染Home组件 }, { path: '/about', component: About } ]
**创建路由实例并导出**:
```js
const router = new VueRouter({ routes })
export default router
- 挂载到Vue根实例:打开
main.js
,引入路由并挂到new Vue()
里:import Vue from 'vue' import App from './App.vue' import router from './router.js' // 引入路由配置
new Vue({ router, // 注入路由实例,让整个项目能访问路由 render: h => h(App) }).$mount('#app')
这样基础路由环境就搭好啦!接下来要在页面里用路由组件~
### 三、静态路由配置后怎么在页面用?
路由配好后,得用两个“核心组件”:`<router-link>`和`<router-view>`。
- **`<router-link>`**:负责生成导航链接,代替传统的`<a>`标签,比如在`App.vue`里做导航:
```html
<router-link to="/">首页</router-link>
<router-link to="/about">关于我们</router-link>
点击时,URL会变化,页面也会切换;它还会给激活的链接加router-link-active
类,方便做样式(也能通过active-class
自定义类名)。
<router-view>
:是“组件占位符”,路由匹配到哪个组件,就把组件渲染到这个位置,比如App.vue
的模板:<template> <div id="app"> <!-- 导航 --> <router-link to="/">首页</router-link> <router-link to="/about">关于我们</router-link> <!-- 组件渲染的位置 --> <router-view></router-view> </div> </template>
访问时,
Home.vue
会渲染到<router-view>
;访问/about
时,换成About.vue
~
动态路由参数咋玩?
实际项目里,经常需要“动态路径”,比如用户详情页,每个用户的URL是/user/1
、/user/2
,这里的1
、2
是用户ID,这种场景得用动态路由参数。
配置方法:在routes
里给path
加:参数名
。
const routes = [ { path: '/user/:id', // :id是动态参数,名字自定义 component: User } ]
然后在User.vue
组件里,用this.$route.params.id
拿参数:
export default { created() { console.log(this.$route.params.id) // 访问/user/123时,打印123 } }
注意:如果多个路由复用同一个组件(比如不同用户详情都用User.vue
),组件默认不会重新渲染,这时候得用watch
监听$route
变化,或者用beforeRouteUpdate
导航守卫处理数据更新~
项目里常用的嵌套路由咋配置?
很多项目有“层级结构”,首页”下面还有“推荐”“热门”子页面,这时候得用嵌套路由(children
)。
配置步骤:
- 在父路由的
routes
里加children
数组,存子路由规则。 - 父组件模板里得有
<router-view>
,给子组件留位置。
举个例子:Home.vue
是父组件,下面有Recommend.vue
和Hot.vue
两个子组件。
路由配置(router.js):
import Home from './components/Home.vue' import Recommend from './components/Recommend.vue' import Hot from './components/Hot.vue' const routes = [ { path: '/home', component: Home, children: [ // 子路由数组 { path: 'recommend', // 路径不加/,自动拼接父路径为/home/recommend component: Recommend }, { path: 'hot', component: Hot }, { path: '', // 子路由默认路径,访问/home时渲染Recommend redirect: 'recommend' // 重定向到recommend } ] } ]
父组件Home.vue模板:
<template> <div> <h2>首页</h2> <!-- 子路由导航 --> <router-link to="/home/recommend">推荐</router-link> <router-link to="/home/hot">热门</router-link> <!-- 子组件渲染位置 --> <router-view></router-view> </div> </template>
访问/home
时,会重定向到/home/recommend
,渲染Recommend.vue
;点“热门”则渲染Hot.vue
~ 嵌套路由能很好地管理多层级页面结构,让代码更模块化~
路由传参除了动态参数还有啥方法?
动态路由用params
传参(路径里带参数),但有时不想暴露参数或传更多数据,可用query传参或params配合name传参。
query传参(路径后带?xxx=xxx
)
配置时不用改routes
,直接在<router-link>
或编程式导航里加query
。
用<router-link>
:
<router-link :to="{ path: '/search', query: { keyword: 'Vue' } }">搜索Vue</router-link>
点击后URL变成/search?keyword=Vue
,在Search.vue
里用this.$route.query.keyword
获取。
编程式导航(按钮点击跳转):
this.$router.push({ path: '/search', query: { keyword: 'Vue' } })
params传参(配合name
,参数不在URL显示)
这种方式需给路由配name
,跳转时用name
而非path
(path
和params
一起用会被忽略)。
路由配置加name
:
{ path: '/user', name: 'User', // 给路由起名 component: User }
跳转时传params
:
<router-link :to="{ name: 'User', params: { id: 123, name: '小明' } }">用户页</router-link>
或编程式导航:
this.$router.push({ name: 'User', params: { id: 123, name: '小明' } })
在User.vue
里用this.$route.params.id
和this.$route.params.name
获取。
注意:用params
传参时,页面刷新参数会丢失(参数没存在URL里),若需刷新保留参数,优先用query
或动态路由参数~
路由导航守卫怎么用?
导航守卫是路由跳转时的“钩子函数”,能在跳转前、后做逻辑(如权限判断、加载动画、数据预取),常见的有全局守卫、路由独享守卫、组件内守卫。
全局守卫(控制所有路由跳转)
最常用的是router.beforeEach
,在router.js
里配置:
router.beforeEach((to, from, next) => { // to: 目标路由;from: 来源路由;next: 必须调用,决定是否跳转 if (to.path === '/login') { next() // 直接放行 } else { // 假设判断是否登录(存了token) const isLogin = localStorage.getItem('token') if (isLogin) next() else next('/login') // 未登录跳转到登录页 } })
所有路由跳转前都会触发该逻辑,适合做全局权限控制~
路由独享守卫(只控制单个路由)
在routes
里给某个路由加beforeEnter
:
{ path: '/order', component: Order, beforeEnter: (to, from, next) => { // 逻辑仅对/order生效 if (checkPermission()) next() // 自定义权限检查 else next('/403') // 无权限跳转到403页面 } }
组件内守卫(组件里控制自身路由)
在组件(如Order.vue
)里写:
beforeRouteEnter
:进入组件前触发(组件实例未创建,this
为undefined
,需通过next
回调拿实例)。beforeRouteUpdate
:路由参数变化时触发(如动态路由/user/:id
,id
变但组件复用)。beforeRouteLeave
:离开组件时触发(如提醒“表单未保存,确定离开?”)。
举个beforeRouteEnter
的例子:
export default { beforeRouteEnter(to, from, next) { // 这里this是undefined,因为组件未创建 next(vm => { // vm是组件实例,进入后执行 vm.fetchData() // 调用组件方法获取数据 }) }, methods: { fetchData() { ... } } }
导航守卫灵活度高,项目里做权限、埋点、数据加载都离不开它~
路由懒加载咋配置能优化性能?
项目大了,所有组件打包到一个JS文件里,首屏加载会很慢。路由懒加载能把每个路由组件分成单独JS文件,访问时再加载,减少首屏压力。
配置方法:把import 组件 from '路径'
改成动态import(() => import('路径')
)。
原来的静态导入:
import Home from './components/Home.vue'
改成懒加载:
const Home = () => import('./components/Home.vue')
然后在routes
里正常用:
const routes = [ { path: '/', component: Home } ]
打包后,Home
组件会被单独分成一个chunk,只有访问时才加载这个JS文件,多个路由时,每个组件都会被拆分,大幅减少首屏加载时间~
路由出错页面咋处理?
用户输错URL或访问不存在的路径,得引导到404页面,配置方法是在routes
最后加通配符路由(path: '*'
)——路由匹配从上到下,所以404路由要放最后!
步骤:
- 新建
NotFound.vue
组件,写404提示。 - 路由配置里加:
import NotFound from './components/NotFound.vue'
const routes = [ // 其他路由... { path: '*', // 匹配所有未定义的路径 component: NotFound } ]
这样用户访问任意不存在的路径,都会渲染`NotFound.vue`~
### 十、路由模式hash和history有啥区别?
VueRouter默认是`hash`模式,URL带`#`(如`http://xxx/#/home`);也能改成`history`模式,URL更干净(如`http://xxx/home`)。
#### 1. hash模式
- 原理:利用URL的`hash`(`#`后部分)变化触发路由跳转,`hash`变化不向服务器发请求,SPA能感知变化。
- 优点:兼容性好,老浏览器也支持;部署简单,无需后端配置。
- 缺点:URL带`#`,不够美观。
#### 2. history模式
- 原理:利用HTML5的`history API`(`pushState`、`replaceState`)改变URL,实现无刷新跳转。
- 优点:URL更像传统网站,无`#`,美观。
- 缺点:需后端配合!直接访问`http://xxx/home`时,服务器若没配置会返回404,部署时,得让服务器把所有路由请求重定向到`index.html`(前端路由接管)。
配置`history`模式也简单,创建VueRouter实例时加`mode: 'history'`:
```js
const router = new VueRouter({
mode: 'history',
routes
})
用history
模式时,部署到服务器要和后端沟通,配置重定向规则,否则会白屏或404~
看完这些,是不是觉得Vue2路由配置的脉络清晰多了?从基础环境搭建,到动态路由、嵌套路由,再到传参、守卫、性能优化,每个环节都是项目里高频用到的,实际开发时,把这些知识点结合起来,比如用导航守卫做权限,用懒加载优化性能,用嵌套路由管理页面结构,路由这块就稳了~要是还有细节没搞懂,评论区随时喊我,咱们再拆解!
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。