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前端网发表,如需转载,请注明页面地址。
code前端网



发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。