Vue3學習與實戰 · 配置使用vue-router路由
阿新 • • 發佈:2021-11-27
隨著Vue版本的升級,Vue 2.x
專案和Vue 3.x
專案在使用vue-router上有些區別,本文就簡單介紹下vue-router
在Vue3
中的配置和使用。
一、目錄結構
demo/ package.json vite.config.js index.html public/ src/ api/ assets/ common/ components/ store/ views/ home.vue list.vue router/ index.js App.vue main.js
二、版本依賴
vite
: ^2.0.0
vue
: ^3.2.8
vue-router
: ^4.0.1
三、配置路由
- 3-1.配置
src/router/index.js
路由檔案
// src/router/index.js import {createRouter, createWebHistory, createWebHashHistory} from 'vue-router' import { defineAsyncComponent } from 'vue' const router = createRouter({ // history: createWebHashHistory(), // hash 模式 history: createWebHistory(), // history 模式 routes: [ { path: '/', name: 'home', component: defineAsyncComponent(() => import(`../views/home.vue`)), meta: { title: '首頁', }, }, { path: '/list', name: 'list', component: defineAsyncComponent(() => import(`../views/list.vue`)), meta: { title: '列表頁', }, }, { path: '/*', redirect: '/', }, ] }) // 全域性路由守衛 router.beforeEach((to, from, next)=>{ // console.log(to, from) if (to.meta.title) { document.title = `${to.meta.title}`; } next() }) router.afterEach((to, from)=>{ // console.log(to, from) console.log('afterEach') }) export default router
說明:
-
路由模式:
history
模式對應createWebHistory()
方法hash
模式對應createWebHashHistory()
方法
-
路由懶載入:在
vite+Vue3
專案中使用import()
會有報錯,所以使用vue提供的一個方法defineAsyncComponent
,詳見另一篇:vue3 + vite實現非同步元件和路由懶載入 -
3-2.在
src/main.js
入口檔案中註冊使用路由
// src/main.js import { createApp } from 'vue' import router from './router' import store from './store' import App from './App.vue' // ... const app = createApp(App) app.use(router).use(store); app.mount('#app')
- 3-3.在
src/App.vue
檔案中使用<router-view/>
// src/App.vue
<template>
<router-view/>
</template>
四、使用路由
- 4-1.在
Option API
中使用和Vue 2.x
中使用沒有差別。如下:
<template>
<div></div>
</template>
<script>
export default {
data() {
return {}
},
mounted() {
// 路由跳轉 && 設定引數
this.$router.push({
path: '/list',
query: {
id: 123,
},
})
// 獲取引數
let { id } = this.$route.query
},
}
</script>
- 4-2.在
Composition API
中不能再直接訪問this.$router
或this.$route
,所以要使用useRouter
和useRoute
函式。
<template>
<div></div>
</template>
<script>
import { ref } from 'vue'
import { useRouter, useRoute, onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
import ajax from "./ajax";
export default {
setup () {
const router = useRouter()
const route = useRoute()
// 路由跳轉 && 設定引數
router.push({
path: '/list',
query: {
id: 123,
},
})
// 獲取引數
let { id } = route.query
// 區域性路由守衛
onBeforeRouteLeave((to, from) => {
const answer = window.confirm(
'是否要離開本頁面?'
)
// 取消導航並停留在同一頁面上
if (!answer) return false
})
const userData = ref()
onBeforeRouteUpdate(async (to, from) => {
//僅當 id 更改時才獲取使用者,例如僅 query 或 hash 值已更改
if (to.params.id !== from.params.id) {
userData.value = await ajax(to.params.id)
}
})
},
}
</script>
《Vue3學習與實戰》系列
歡迎訪問:天問部落格