Vue-router

273 阅读2分钟

router 路由

作用:路由做页面的跳转

路由允许我们通过不同的 URL 访问不同的内容。通过 Vue 可以实现多视图的单页Web应用

构建[前端项目]

npm init vue@latest
//或者
npm init vite@latest

使用Vue3 安装对应的router4版本

使用Vue2安装对应的router3版本

npm install vue-router@4

路由出口 路由匹配到的组件渲染在此 位置任意,根据您的排版来

**四种路由跳转方式 path name a(有缺陷,不用) **

声明式

第一种 Path

默认生成a标签 自定义组件 router-link 来创建链接。这使得 Vue Router 可以在不重新加载页面的情况下更改 URL,处理 URL 的生成以及编码

to属性 写你定义的path to="/"

第二种 通过name实现跳转

除了 path 之外,你还可以为任何路由提供 name。这有以下优点:

  • 没有硬编码的 URL
  • params 的自动编码/解码。
  • 防止你在 url 中出现打字错误。
  • 绕过路径排序(如显示一个)

用name 跳转方式也要改变 :to="{name:'login'}" 把它变成对象


第三种 编程式导航

<template>
    <div>
<h1>向画</h1>
<hr>
<div>
  <!-- path -->

  <!-- <router-link to="/">login</router-link>
  <router-link to="/reg" style="margin-left: 10px;">register</router-link> -->

  <!-- name -->
  <!-- <router-link :to="{name:'login'}">login</router-link>
  <router-link :to="{name:'register'}" style="margin-left: 10px;">register</router-link>
   -->
  <!-- 编程式导航 1.先用path演示-->
  <button @click="toPage('/')">login</button>
   <button @click="toPage('/reg')">register</button>
</div>
<router-view></router-view>
    </div>
</template>

<script lang="ts" setup>
// 需要引入router的hooks 
import {useRouter} from 'vue-router';
// 调一下,使用router做跳转
const router =useRouter();
const toPage=(url:String)=>{
  // 1.如果是使用path,用push 这是字符串跳转方式 因为传入的url是个字符串
  // router.push(url);
  // 2.也可以传对象,方便路由进行传参
  router.push({
    path:url,
  })
  
}

</script>

<template>
    <div>
<h1>向画</h1>
<hr>
<div>
  <!-- 编程式导航 2.name演示-->
  <button @click="toPage('login')">login</button>
   <button @click="toPage('register')">register</button>
</div>
<router-view></router-view>
    </div>
</template>

<script lang="ts" setup>
// 需要引入router的hooks 
import {useRouter} from 'vue-router';
// 调一下,使用router做跳转
const router =useRouter();
const toPage=(url:String)=>{
    name:url,
  })
}

历史记录 有时不想要点击nav左右箭头 不要历史记录

1 router-link方式 加个replace

<router-link replace to="/" >login</router-link>

2.编程式 把push改为replace

<template>
    <div>
<h1>向画</h1>
<hr>
<div>
  <router-link replace to="/"   >login</router-link>
  <router-link replace  to="/reg" style="margin-left: 10px;">register</router-link>

  <button @click="toPage('login')">login</button>
   <button @click="toPage('register')">register</button>
</div>
<router-view></router-view>
    </div>
</template>

<script lang="ts" setup>
// 需要引入router的hooks 
import {useRouter} from 'vue-router';
// 调一下,使用router做跳转
const router =useRouter();
const toPage=(url:String)=>{

  router.replace({
    name:url,
  })
}

针对历史记录处理的JS逻辑

<template>
    <div>
<h1>向画</h1>
<hr>
<div>
  <router-link  to="/"   >login</router-link>
  <router-link   to="/reg" style="margin-left: 10px;">register</router-link>

  <button @click="toPage('login')">login</button>
   <button @click="toPage('register')">register</button>

   <button @click="next">next</button>
   <button @click="prev">prev</button>
</div>
<router-view></router-view>
    </div>
</template>

<script lang="ts" setup>
// 需要引入router的hooks 
import {useRouter} from 'vue-router';
// 调一下,使用router做跳转
const router =useRouter();
const toPage=(url:String)=>{
  // 1.如果是使用path,用push 这是字符串跳转方式 因为传入的url是个字符串
  // router.push(url);
  // 2.也可以传对象,方便路由进行传参
  router.push({
    name:url,
  })
}
const next=()=>{
router.go(1) 前进1页
}
const prev=()=>{
router.go(-1) 回退1页
}

**路由传参 **vue-router3

json插件

得到json数据 TS类型
插件名:json to ts 使用:选中文本 crtl+shift+alt+s

** # Query路由传参 只接受一个对象**

展示在URL上 http://127.0.0.1:5173/reg?name=小满price=500&id=1

表格页
<template>
    <div>列表页面</div>
    <table class="table" border="1" cellspacing="0">
        <thead>
            <tr>
                <th>品牌</th>
                <th>价格</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <!-- 循环展示内容 -->
            <tr :key="item.id" v-for="item in data">
                <td>{{item.name}}</td>
                <td>{{item.price}}</td>
                <td>
                    <button @click="toDetail(item)">详情</button>
                </td>
            </tr>
        </tbody>
    </table>
</template>

<script lang="ts" setup>
//解构引入
import {data} from './list.json';
import {useRouter} from 'vue-router';
const router=useRouter();
// interface   type 类似
type Item = {
  name: string;
  price: number;
  id: number;
}
const toDetail=(item:Item)=>{
    router.push({
        path:'/reg',
        query:item
    })
}
</script>

<style lang="css" scoped>
.table{
    width: 400px;
}
</style>
数据页
<template>
    <div>
  <h3> register 我是详情页面</h3>
    </div>
    <div>品牌:{{ route.query.name }}</div>
    <div>价格:{{ route.query.price }}</div>
    <div>ID:{{ route.query.id }}</div>
</template>

<script lang="ts" setup>
// 取值用useRoute   区分useRouter
//导入useRoute
import { useRoute } from 'vue-router';
const route=useRoute();
</script>

<style lang="css" scoped>

</style>

params 必须用name传参 对应routes的name

不会展示在URL上,它存在内存里面,一刷新,数据就会丢失,解决:动态路由参数

<template>
    <div>列表页面</div>
    <table class="table" border="1" cellspacing="0">
        <thead>
            <tr>
                <th>品牌</th>
                <th>价格</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <!-- 循环展示内容 -->
            <tr :key="item.id" v-for="item in data">
                <td>{{item.name}}</td>
                <td>{{item.price}}</td>
                <td>
                    <button @click="toDetail(item)">详情</button>
                </td>
            </tr>
        </tbody>
    </table>
</template>

<script lang="ts" setup>
//解构引入
import {data} from './list.json';
import {useRouter} from 'vue-router';
const router=useRouter();
// interface   type 类似
type Item = {
  name: string;
  price: number;
  id: number;
}
const toDetail=(item:Item)=>{
    router.push({
        path:'/reg',
        params:item
    })
}
</script>

<style lang="css" scoped>
.table{
    width: 400px;
}
</style>
<template>
  <div>
    <button @click="router.back()">返回</button>
    <h3>register 我是详情页面</h3>
  </div>

  <div>品牌:{{ route.params.name }}</div>
  <div>价格:{{ route.params.price }}</div>
  <div>ID:{{ route.params.id }}</div>
</template>

<script lang="ts" setup>
// 取值用useRoute  导入useRoute  区分useRouter
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
</script>

<style lang="css" scoped></style>

# 动态路由传参

很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,但用户 ID 不同。在 Vue Router 中,我们可以在路径中使用一个动态字段来实现,我们称之为 路径参数

路径参数 用冒号 : 表示。当一个路由被匹配时,它的 params 的值将在每个组件

path:"/reg/:id",

# 嵌套路由