动态路由

@Params
用来传递参数实现视图共享
将给定匹配模式的路由映射到同一个组件,如 /goods/1 和 /goods/2 这样的 URL 都会映射到同一个路由 /goods: 在同一个页面根据 id 显示不同的商品
动态属性绑定 to 时,只能使用命名路由 name,不可以使用普通路由 path - 因为匹配不到
Path "/xxx" was passed with params but they will be ignored. Use a named route alongside params instead.
先配置路由再使用
更多路由信息,请访问 RouteLocationNormalizedLoaded
配置路由参数
在 URL 后面采用 路径 的方式传递参数
使用通配符 : - wild card 定义对应当前路由的动态路由
可以定义一个或多个
? 表示该参数可选
如:根据 id 展示对应的内容
{
    path: '/details/:id',
    name: 'details',
    component: () => import('../components/DetailsView.vue'),
}
传递路由参数
推荐使用命名路由和模板字符串
方便起见,请直接在浏览器的地址栏输入不同的 id,调试动态路由的使用情况
//使用1:静态路由 - 传递的 id 为 100
<router-link to="/details/1">details - 1</router-link>

//使用2:动态路由 - 普通拼接,变量 id 为 2
<router-link :to="'/details/' + id">details - id/2</router-link>

//使用3:动态路由 - 模板字符串,变量 id 为 3
<router-link :to="`/details/${id}`">details - id/3</router-link>

//使用4:动态路由 - 使用 name,不能使用 path
<router-link :to="{ name: 'details', params: { id: 4 } }">details - id</router-link>
接收路由参数
使用 useRoute()params 接收
import { useRoute } from 'vue-router'
let route = useRoute()
console.log(route.params);
<div>{{ route.params.id }}</div>
仅仅 在结构中使用
<div>{{ $route.params.id }}</div>
使用可选链操作符 ?. 可以有效避免没有指定/传递路由参数引起的报警;如果 route.params 为 null 或 undefined,则不会报错,而是返回 undefined - 最佳体验
<div>{{ route.params?.id }}</div>
注意事项
异常处理

不确定的用户行为有可能导致路由参数为空或缺失,导致渲染失败

解决方案1:使用条件渲染判断路由参数是否存在

解决方案2:配置 404 路由

多个路由参数

尽量精准设计路由,避免使用

必要时,使用命名路由,简化路由操作

{
    path: '/home/:id/:title/:cont/:other?',
    name: "home",
    component: Home
}

不直观;可读性不好

<router-link to = "/home/10/leading/conteng">home</router-link>

使用命名路由

<router-link :to = "{
    name: 'home',
    params: {
        id: 10,
        title: 'leading',
        cont: 'content'
    }
}">home</router-link>
Summary & Homework
Summary
使用路径传递参数
使用路由的 params 接收参数
静态路由 - 可以使用普通路由 path 和命名路由 name 传递路由参数
动态路由 - 使用 : 定义;数据绑定时,只能使用命名路由
Homework
[] 动态路由应用
创建详情页动态路由 - 使用商品 id 作为路由参数,以便页面加载时显示不同的商品
创建详情页组件 DetailView.vue - 页面视图加载时,拉取 id 对应的商品
创建商品组件 ProductItem.vue - 单击添加到购物车,跳转到商品详情页
创建商品列表组件 Product.vue - 使用列表渲染 v-for 渲染若干商品组件