Vue中的路由细节

概念:

关键点在于不刷新界面通过URL变化展示不同组件

实现方式:

Hash模式:URL 中带有 #(如 http://example.com/#/home),# 后的内容作为路由标识,不会发送到服务器

History模式:使用 HTML5 的 history API(pushState/replaceState),URL 无 #(如 http://example.com/home),但需要服务器配置支持

工作原理:

Hash 模式:监听 hashchange 事件,捕获 # 后内容的变化

History 模式:监听 popstate 事件(处理浏览器前进 / 后退),通过 history.pushState 手动修改 URL

核心:

维护一个路由规则表(路由到组件的映射),当 URL 变化时,查找匹配的规则,根据匹配结果,在页面的占位符(如 < router-view >)中渲染对应的组件

现在完成一个简单配置

注意区分routes和router

javascript 复制代码
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'

const routes = [
  {
    path: '/',        // 路径
    name: 'Home',     // 路由名称(可选)
    component: Home   // 对应组件
  },
  {
    path: '/about',
    name: 'About',
    component: About
  }
]

const router = createRouter({
  history: createWebHistory(), // History 模式
  // history: createWebHashHistory(), // Hash 模式
  routes//对应上面的routes
  })

export default router

配置完成以后进行路由的跳转

模板中使用声明式跳转

javascript 复制代码
<!-- 普通跳转 -->
<router-link to="/">首页</router-link>
<router-link :to="{ name: 'About' }">关于页</router-link>

<!-- 带参数 -->
<router-link :to="{ path: '/user', query: { id: 1 } }">用户页</router-link>

JS中使用编程式跳转

javascript 复制代码
import { useRouter } from 'vue-router'
const router = useRouter()

// 基本跳转
router.push('/about')
router.push({ name: 'About' })

// 带参数
router.push({ path: '/user', params: { id: 1 } }) // params 需配合 name 使用
router.push({ path: '/user', query: { id: 1 } })  // query 会显示在 URL 上

// 替换当前历史记录(无回退)
router.replace('/about')

如果我们想要实现局部不刷新的替换

比如说导航栏固定内容区变化

这就是嵌套路由(子路由)

javascript 复制代码
// 配置
{
  path: '/dashboard',
  component: Dashboard,
  children: [
    { path: 'profile', component: Profile }, // 子路径:/dashboard/profile
    { path: 'settings', component: Settings } // 子路径:/dashboard/settings
  ]
}

模板中需在父组件添加 < router-view > 作为子组件的占位符

当我们需要控制路由跳转权限时需要用到路由守卫

  • 全局守卫(影响所有路由):

    javascript 复制代码
    // 跳转前触发
    router.beforeEach((to, from, next) => {
      // to: 目标路由,from: 来源路由
      if (to.path === '/admin' && !isLogin) {
        next('/login') // 未登录则跳转到登录页
      } else {
        next() // 允许跳转
      }
    })
  • 组件内守卫(仅影响当前组件):

    javascript 复制代码
    export default {
      beforeRouteEnter(to, from, next) {
        // 进入组件前调用(此时组件实例未创建)
      },
      beforeRouteLeave(to, from, next) {
        // 离开组件时调用(可用于确认弹窗)
        if (confirm('确定离开吗?')) {
          next()
        }
      }
    }
6. 路由懒加载

优化首屏加载速度,按需加载组件:

javascript 复制代码
const routes = [
  {
    path: '/about',
    component: () => import('../views/About.vue') // 懒加载
  }
]

四、History 模式的服务器配置

History 模式下,直接刷新页面会向服务器请求该 URL,需服务器配置将所有请求转发到 index.html

  • Nginx 配置

    nginx 复制代码
    location / {
      try_files $uri $uri/ /index.html;
    }
  • Apache 配置
    .htaccess 中添加:

    apache 复制代码
    FallbackResource /index.html

前端路由 vs 后端路由

类型 工作原理 场景
前端路由 客户端通过 JS 匹配 URL 并渲染组件 单页应用(SPA)
后端路由 服务器根据 URL 返回对应的 HTML 页面 多页应用(MPA)
相关推荐
街尾杂货店&16 小时前
CSS - transition 过渡属性及使用方法(示例代码)
前端·css
CH_X_M17 小时前
为什么在AI对话中选择用sse而不是web socket?
前端
Mintopia17 小时前
🧠 量子计算对AIGC的潜在影响:Web技术的未来可能性
前端·javascript·aigc
街尾杂货店&17 小时前
css - word-spacing 属性(指定段字之间的间距大小)属性定义及使用说明
前端·css
忧郁的蛋~17 小时前
.NET异步编程中内存泄漏的终极解决方案
开发语言·前端·javascript·.net
水月wwww17 小时前
vue学习之组件与标签
前端·javascript·vue.js·学习·vue
合作小小程序员小小店17 小时前
web网页开发,在线%商城,电商,商品购买%系统demo,基于vscode,apache,html,css,jquery,php,mysql数据库
开发语言·前端·数据库·mysql·html·php·电商
顾安r17 小时前
11.8 脚本网页 塔防游戏
服务器·前端·javascript·游戏·html
草莓熊Lotso18 小时前
C++ 方向 Web 自动化测试实战:以博客系统为例,从用例到报告全流程解析
前端·网络·c++·人工智能·后端·python·功能测试
fruge18 小时前
Canvas/SVG 冷门用法:实现动态背景与简易数据可视化
前端·信息可视化