页面路由

@Route
Install
推荐创建项目的时候指定使用路由,自动生成路由配置文件
也可以单独安装路由依赖;需要单独配置并引入,比较麻烦,不推荐
1. 安装路由 - 为项目添加安装依赖
npm i vue-router -S
2. 引入路由
在入口文件 main.js 中引入路由,作为中间件使用
//引入
import router from './router'

//使用 - 链式
app.use(router).mount('#app')
创建路由 createRouter()
根据配置的路由、路由模式等信息创建路由实例
更多信息,请访问 Vue Router RouteRecordNormalized
配置路由 routes
按照值对形式 name-value pair 配置路由,即把 URL 路径映射到组件;其中,路径 path 和组件 component 是必填项
所有的路由配置位于项目文件夹 src → router 中,通常是 index.js
1. 路径 path
/ 代表根路由
子路由的 path 可以省略父级路由,不用 /
404 路由:使用自定义的路径参数|正则表达式匹配其它任意路径;通常是最后一个路由配置项
2. 组件 component
每一个组件都是一个视图 view
每一个组件都是一个单文件组件 SFC
引入组件时,可以省略后缀名 .vue
路由组件应该集中、分类存放,如 pages 文件夹、views 文件夹等视图类文件夹;其它一般组件则存放于 components 文件夹
路由配置属性
属性 说明
path 路由;必填
component 对应路由的组件;必填
name 命名路由:通过名字来指定路由;不能重复;更直观、灵活,简化路由使用,如动态路由
redirect 重定向路由:让指定的路由重新定位到另外一个路由
children 嵌套路由、子路由;嵌套路由通常需要使用重定向
meta 路由元信息:用于路由组件的额外配置
props 是否启用路由参数;可以接收动态路由参数和查询路由参数
嵌套路由通常让父路由重定向到子路由;也可以在子路由中添加空路由实现,但是不建议
可以使用模块定义路由信息再引入,便于管理和复用,如用于导航菜单
创建路由实例 router
应指定路由工作模式 history 和配置的路由信息 routes
const router = createRouter({
    history: createWebHistory(),
    routes,
})
为了使用路由,还要引入相应的包;完整路由创建如下
// 引入路由包
import {createRouter, createWebHistory} from 'vue-router'

// 引入路由组件Home;其它组件可以按需导入
import Home from '@/pages/Home'

// 创建路由实例
const router = createRouter({
    // 路由模式:history、hash;默认是 history;建议使用 hash
    history: createWebHistory(import.meta.env.BASE_URL),
    // 配置路由
    routes : [
        {
            path: '/',
            name: 'home',
            component: Home
        },
        {
            path: '/home',
            redirect: '/'
        },
        {
            path: '/work',
            name: 'work',
            component: () => import('../components/sub_view/Work.vue'),
            redirect: '/work/html',  //使用完整路由
            children:[
                {
                    path: 'html',           //省略父级路由
                    name: "html",
                    component: () => import('../components/sub_view/Html.vue'),
                },
                {
                    path: 'css3',           //省略父级路由
                    name: "css3",
                    component: () => import('../components/sub_view/Css.vue'),
                },
                {
                    path: '/work/js',       //可以使用完整路由;建议所有子路由配置保持一致
                    name: "js",
                    component: () => import('../components/sub_view/Js.vue'),
                }
            ]
        },
        {
            path: '/team',
            name: 'team',
            component: () => import('../components/sub_view/Team.vue')
        },
        {
            path: '/about',
            name: 'about',
            component: () => import('../components/sub_view/About.vue')
        },
        {
            path: '/:pathMatch(.*)*',
            name: 'not-found',
            component: () => import('../views/NotFound.vue')
        }
    ]
})

//导出路由
export default router
404 路由也可以针对某个特定的路由
也可以使用内置函数生成 html,避免额外创建组件
如果针对根路由和特定路由的404处理都存在,特定路由应该在根路由之前,否则无法正常匹配
import {h} from 'vue'

//...

{
  path: '/goods:pathMatch(.*)*',
  name: 'goods-not-found',
  component: h('p', {style: 'color: red'}, 'goods 404 Not Found')
},
{
  path: '/:pathMatch(.*)*',
  name: 'not-found',
  component: () => import('../views/NotFound.vue')
}
使用路由 Usage
模板
1. <router-link>
借助自定义组件 <router-link> 来创建链接|路由;相当于 <a>;使用属性 to 代替了属性 href
默认是 push 模式,浏览器可以回退;使用 replace 属性可以防止浏览器回退
更多信息,请访问 RouterLinkProps
//<router-link> - 字符串方法
<router-link to = "/home" >home</router-link>
<router-link to = "/team" >team</router-link>
<router-link replace to = "/about" >about</router-link>

//访问嵌套路由 - 指定完整路由
<router-link to = "/work/html" >html</router-link>
<router-link to = "/work/css3" >css3</router-link>
<router-link to = "/work/js" >js</router-link>

//使用命名路由 - 向 router-link 组件的 to 属性传递一个对象:属性绑定
<router-link :to = "{name: 'home'}" >home</router-link>
<router-link replace :to = "{name: 'home'}" >home</router-link>
<router-link :replace = {{true}} :to = "{name: 'home'}" >home</router-link>
<router-link :to = "{name: 'home', replace: true}" >home</router-link>
2. <router-view>
路由目标占位符
借助系统组件 <router-view> 显示与 URL 对应的组件|路由出口
有 <router-link> 路由,则必须有 <router-view> 路由出口
还可以像缓存组件那样,缓存 <router-view>,见后例
单 <router-view> - 应用更为常见
多 <router-view> - 允许你在同一个页面同时展示多个组件,每个组件对应不同的视图区域,提高了单页应用的复用性和可维护性
路由配置由 component 该为 components
{
    path: '/',
    name: 'home',
    components: {
        default: () => import('../views/Home.vue'),
        aside: () => import('../components/Aside.vue'),
        header: () => import('../components/Header.vue'),
        main: () => import('../components/Main.vue'),
    }
}
多个 <router-view> 使用 name 属性区分,避免嵌套路由
<router-view name="aside"></router-view>
<router-view name="header"></router-view>
<router-view name="main"></router-view>
逻辑
使用组合式函数访问路由实例和当前路由
更多信息,请查看后续路由内容
import { useRoute, useRouter } from 'vue-router'
const router = useRouter()
const route = useRoute()
summary & homework
[] Route
创建以学号命名的项目
创建路由,包括首页 /、团队 /team、商品 /goods、关于 /about、联系我们 /contact 以及异常路由处理等
创建对应的组件 - 使用简单信息表示即可
调试并发布;将发布的 dist 目录打包压缩,以学号命名,提交到学习通
代码仓库* - 将项目推送到自己的代码仓库