vue3路由的基本使用

安装路由依赖:

npm install vue-router(默认安装最新版本)

1、声明式路由

components目录下创建Home页:

<template>
  <div>
    <h1>Home页</h1>
  </div>
</template>

Add页:

<template>
  <div>
    <h1>Add页</h1>
  </div>
</template>

Update页:

<template>
  <div>
    <h1>Update页</h1>
  </div>
</template>

List页:

<template>
  <div>
    <h1>List页</h1>
  </div>
</template>

src目录下创建routers目录并创建router.js文件:

// 创建路由对象需要使用的函数
import {createRouter,createWebHashHistory} from 'vue-router'

import Home from "../components/Home.vue"
import List from "../components/List.vue"
import Add from "../components/Add.vue"
import Update from "../components/Update.vue"

// 创建路由对象
const router = createRouter({
    // 记录路由的历史
    history:createWebHashHistory(),
    // 定义组件和外部访问映射路径的关系
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/add',
            component:Add
        },
        {
            path:'/update',
            component:Update
        },
        {
            path:'/list',
            component:List
        },
        {
            path:'/',
            // 路由的重定向
            redirect:'/home'
        }
    ]
})

// 向外导出路由对象
export default router

main.js文件中导入并使用路由对象:

import { createApp } from 'vue'
import App from './App.vue'

// 导入路由对象
import router from "./routers/router.js"

const app = createApp(App)
// 使用路由对象
app.use(router)
app.mount('#app')

App.vue:

<template>
  <div>
    <h1>这是App页的头部</h1>
    <ul>
      <!--   该标签用于在使用路由的情况下访问指定路径   -->
      <li><router-link to="/home">home页</router-link></li>
      <li><router-link to="/add">add页</router-link></li>
      <li><router-link to="/list">list页</router-link></li>
      <li><router-link to="/update">update页</router-link></li>
    </ul>
    <!--  该标签将被替换成具体的.vue文件,用于展示路由跳转到的.vue文件  -->
    <router-view class="rv"></router-view>
    <h1>这是App页的尾部</h1>
  </div>

</template>

<style scoped>
.rv{
  border: 1px red solid;
  background: aquamarine;
}
</style>

2、编程式路由

App.vue:

<script setup>

  import {ref} from 'vue'
  import router from "./routers/router.js"

  let sendPath = ref("")

  function submit(){
    // 使用路由对象的push方法,通过该方法访问指定路径
    router.push(sendPath.value)
  }


</script>

<template>
  <div>
    <input type="text" v-model="sendPath">
    <button @click="submit()">跳转</button>
    <hr>
    <router-view class="rv"></router-view>
  </div>
</template>

<style scoped>
.rv{
  border: 1px solid red;
  background: beige;
}
</style>

3、路由传参

components目录下创建ShowDetail.vue:

<script setup>

  import {useRoute} from "vue-router"
  import {onUpdated, ref} from "vue"

  let userId = ref(0)
  let userName = ref("")

  // useRoute函数获取保存路径参数的对象

  let pathParamObj = useRoute()

  // pathParamObj.params接收路径参数,获取参数时,获取的参数名与接收时定义的参数名要一致
  userId.value = pathParamObj.params.userId
  userName.value = pathParamObj.params.userName

  // 当响应式数据改变时,执行更新操作
  onUpdated(()=>{
    userId.value = pathParamObj.params.userId
    userName.value = pathParamObj.params.userName
  })

</script>

<template>
  <h1>ShowDetail页</h1>
  <h3>id={{userId}},name={{userName}}</h3>
</template>

components目录下创建ShowDetail02.vue:

<script setup>

  import {useRoute} from "vue-router"
  import {onUpdated, ref} from "vue"

  let userId = ref(0)
  let userName = ref("")

  // useRoute函数获取保存路径参数的对象

  let pathParamObj = useRoute()

  // pathParamObj.query接收键值对参数,获取参数时,获取的参数名与接收时定义的参数名要一致
  userId.value = pathParamObj.query.userId
  userName.value = pathParamObj.query.userName

  // 当响应式数据改变时,执行更新操作
  onUpdated(()=>{
    userId.value = pathParamObj.query.userId
    userName.value = pathParamObj.query.userName
  })

</script>

<template>
  <h1>ShowDetail页</h1>
  <h3>id={{userId}},name={{userName}}</h3>
</template>

router.js:

import {createRouter,createWebHashHistory} from 'vue-router'

// 导入对应.vue文件
import Add from "../components/Add.vue";
import Home from "../components/Home.vue";
import List from "../components/List.vue";
import Update from "../components/Update.vue";
import ShowDetail from "../components/ShowDetail.vue";
import ShowDetail02 from "../components/ShowDetail02.vue";

// 创建路由对象
const router = createRouter({
    history:createWebHashHistory(),
    routes:[
        {
            path:'/',
            component:Home
        },
        {
            path:'/home',
            component:Home
        },
        {
            path:'/add',
            component:Add
        },
        {
            path:'/list',
            component:List
        },
        {
            path:'/update',
            component:Update
        },
        {
            // 接收路径类型参数的端口
            path:'/showDetail/:userId/:userName',
            component:ShowDetail
        },
        {
            // 接收键值对类型参数的端口
            path:'/showDetail02',
            component:ShowDetail02
        }
    ]
})

// 向外导出路由对象
export default router

App.vue:

<script setup>

  // 获取路由对象
  import router from "./routers/router.js"

  function showDetail(userId,userName){
    router.push(`/showDetail/${userId}/${userName}`)
  }

  function showDetail02(userId,userName){
    router.push(`/showDetail02?userId=${userId}&userName=${userName}`)
  }


</script>

<template>
  <div>
    <router-link to="/showDetail/1001/jack">声明式路由路径传参</router-link>
    <hr>
    <router-link to="/showDetail02?userId=1003&userName=smith">声明式路由键值对传参</router-link>
    <hr>
    <button @click="showDetail(1002,'tom')">编程式路由路径传参</button>
    <hr>
    <button @click="showDetail02(1004,'milan')">编程式路由键值对传参</button>
    <hr>
    <router-view></router-view>
  </div>
</template>

4、路由守卫

  • 路由前置守卫(beforeEach):在路由切换前被调用
  • 路由后置守卫(afterEach):在路由切换后被调用

router.js:

import {createRouter,createWebHashHistory} from 'vue-router'

// 导入对应.vue文件
import Add from "../components/Add.vue";
import Home from "../components/Home.vue";
import List from "../components/List.vue";
import Update from "../components/Update.vue";

// 创建路由对象
const router = createRouter({
    history:createWebHashHistory(),
    routes:[
        {
            path:'/',
            component:Home
        },
        {
            path:'/home',
            component:Home
        },
        {
            path:'/add',
            component:Add
        },
        {
            path:'/list',
            component:List
        },
        {
            path:'/update',
            component:Update
        }
    ]
})

// 设置路由的前置守卫,当路由发生跳转前会执行beforeEach函数中的回调函数
router.beforeEach((destination,current,next)=>{
    // destination 标识跳转到的目的路由,current表示当前路由,next表示放行(只有执行了该方法,路由才能完成跳转)
    // next("路径") 该操作表示路由的重定向
    console.log("beforeEach执行了...")
    console.log("上一个位置=",current.path)
    console.log("当前位置=",destination.path)
    next()
})

// 设置路由的后置守卫,当路由发生跳转前会执行afterEach函数中的回调函数
router.afterEach((destination,current)=>{
    console.log("afterEach执行了...")
})

// 向外导出路由对象
export default router

App.vue:

<script setup>

</script>

<template>
  <div>
    <h1>这是App页的头部</h1>
    <ul>
      <!--   该标签用于在使用路由的情况下访问指定路径   -->
      <li><router-link to="/home">home页</router-link></li>
      <li><router-link to="/add">add页</router-link></li>
      <li><router-link to="/list">list页</router-link></li>
      <li><router-link to="/update">update页</router-link></li>
    </ul>
    <!--  该标签将被替换成具体的.vue文件,用于展示路由跳转到的.vue文件  -->
    <router-view class="rv"></router-view>
    <h1>这是App页的尾部</h1>
  </div>

</template>

<style scoped>
.rv{
  border: 1px red solid;
  background: aquamarine;
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值