Code前端首页关于Code前端联系我们

Vue2路由配置该从哪入手?常见问题一次讲清

terry 1天前 阅读数 20 #Vue

做Vue2项目时,路由配置总让人犯懵?明明跟着教程做,可一到动态路由、嵌套路由就卡壳,传参也总搞混?别慌!这篇把Vue2路由从基础到进阶的常见问题拆碎了讲,不管是刚入门想搭路由骨架,还是项目里要做权限控制、性能优化,看完思路能顺很多~

Vue2里路由到底有啥用?

你肯定遇过这种情况:做单页面应用(SPA)时,URL没变但页面内容切换了,比如从“首页”点到“关于我们”,页面不刷新却能展示新内容,路由就是干这个的!它帮我们管理不同URL路径和页面组件的对应关系,让SPA能像多页面网站一样,通过URL区分“页面”,还能实现前进后退、权限控制这些功能,简单说,路由是SPA的“导航指挥官”,决定用户访问哪个路径时,该渲染哪个组件~

怎么给Vue2项目搭路由基础环境?

想配路由,第一步得把vue-router装上,打开终端,在项目根目录执行:

npm install vue-router@2.x  # Vue2要对应vue-router2版本,高版本适配Vue3

装完后,按以下步骤配置:

  1. 创建路由配置文件:在src下新建router.js(或router/index.js),用来写路由规则。
  2. 引入并注册VueRouter
    import Vue from 'vue'
    import VueRouter from 'vue-router'
    Vue.use(VueRouter)  // 全局注册插件,让所有组件能用到路由功能
  3. 定义路由规则:用routes数组存每个路径对应的组件,比如有Home.vueAbout.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
  1. 挂载到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,这里的12是用户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)。

配置步骤:

  1. 在父路由的routes里加children数组,存子路由规则。
  2. 父组件模板里得有<router-view>,给子组件留位置。

举个例子:Home.vue是父组件,下面有Recommend.vueHot.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而非pathpathparams一起用会被忽略)。

路由配置加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.idthis.$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:进入组件前触发(组件实例未创建,thisundefined,需通过next回调拿实例)。
  • beforeRouteUpdate:路由参数变化时触发(如动态路由/user/:idid变但组件复用)。
  • 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路由要放最后!

步骤:

  1. 新建NotFound.vue组件,写404提示。
  2. 路由配置里加:
    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前端网发表,如需转载,请注明页面地址。

发表评论:

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

热门