Vue3?中路由Vue?Router?的使用實(shí)例詳解
前言:
在編寫vue里的SPA(Single Page Application單頁面應(yīng)用)時(shí),我們始終繞不開路由的使用,vue-router4.0版里有一些重要更新,在這里分享給大家。
一、什么是 Vue Router ?
vue-router是vue.js官方給出的路由解決方案,能夠輕松的管理SPA項(xiàng)目中組件的切換
Vue Router 是 Vue.js 的官方路由。它與 Vue.js 核心深度集成,讓用 Vue.js 構(gòu)建單頁應(yīng)用變得輕而易舉。功能包括:
- List item
- 嵌套路由映射
- 動(dòng)態(tài)路由選擇
- 模塊化、基于組件的路由配置
- 路由參數(shù)、查詢、通配符
- 展示由 Vue.js 的過渡系統(tǒng)提供的過渡效果
- 細(xì)致的導(dǎo)航控制
- 自動(dòng)激活 CSS 類的鏈接
- HTML5 history 模式或 hash 模式
- 可定制的滾動(dòng)行為
- URL 的正確編碼
二、路由的使用
1、路由的安裝
npm install vue-router@4
2、路由的模式
- createWebHashHistory():Hash模式
- 它在內(nèi)部傳遞的實(shí)際URL之前使用了一個(gè)哈希字符#,如 https://example.com/#/user/id
- 由于這部分 URL 從未被發(fā)送到服務(wù)器,所以它不需要在服務(wù)器層面上進(jìn)行任何特殊處理
- createWebHistory():history模式,推薦使用
- 當(dāng)使用這種歷史模式時(shí),URL會(huì)看起來很“正常”,如 https://example.com/user/id
- 由于我們的應(yīng)用是一個(gè)單頁的客戶端應(yīng)用,如果沒有適當(dāng)?shù)姆?wù)器配置,用戶在瀏覽器中直接訪問https://example.com/user/id,就會(huì)得到一個(gè)404錯(cuò)誤;要解決這個(gè)問題,你需要做的就是在你的服務(wù)器上添加一個(gè)簡(jiǎn)單的回退路由,如果URL不匹配任何靜態(tài)資源,它應(yīng)提供與你的應(yīng)用程序中的index.html相同的頁面
3、創(chuàng)建路由模塊
- 在項(xiàng)目中的src文件夾中創(chuàng)建一個(gè)router文件夾,在其中創(chuàng)建index.js模塊
- 采用createRouter()創(chuàng)建路由,并暴露出去
- 在main.js文件中初始化路由模塊app.use(router)
// router/index.js import { createRouter, createWebHistory } from "vue-router"; import HomeView from '@/views/HomeView.vue' // 創(chuàng)建路由規(guī)則 let routes = [ { path: '/', // URL 地址 name: 'home', // 名稱 component: HomeView // 渲染該組件 }, ] // 創(chuàng)建路由 const router = createRouter({ // 使用 history 模式 history: createWebHistory(), // 路由規(guī)則 routes }) // 將路由對(duì)象暴露出去 export default router // main.js import { createApp } from 'vue' import App from './App.vue' import router from './router' // 引入路由模塊 let app = createApp(App) app.use(router) // 初始化路由插件 app.mount('#app')
4、聲明路由鏈接和占位符
- < router-link>:路由鏈接,to屬性則為點(diǎn)擊此元素,需要切換的路由地址
- < router-view>:路由占位符,路由切換的視圖展示的位置
<template> <!-- 路由鏈接,點(diǎn)擊是路由地址會(huì)切換到屬性 to 的地方 --> <router-link to="/">首頁</router-link> | <router-link to="/blog">博客</router-link> <hr> <!-- 路由試圖,路由切換組件的地方 --> <router-view/> </template>
三、路由的重定向和別名
在路由規(guī)則中,可采用redirect來重定向另一個(gè)地址
// 路徑寫法 const routes = [{ path: '/home', redirect: '/' }] // 命名寫法 const routes = [{ path: '/home', redirect: { name: 'home' } }] ]
別名表示訪問url時(shí)自由命名,不受約束,router會(huì)自動(dòng)進(jìn)行別名匹配,就像我們?cè)O(shè)置/的別名為/home,相當(dāng)于訪問 /
// alias是別名的key const routes = [{ path: '/', component: HomeView, alias: '/home' }]
四、嵌套路由
如果在路由視圖中展示的組件中包含自己的路由占位符,則此處會(huì)用到嵌套路由
如圖所示:點(diǎn)擊關(guān)于鏈接,則會(huì)顯示About組件,在其組件中又包含了路由鏈接和路由占位符
嵌套路由規(guī)則
- 在某一個(gè)路由規(guī)則中采用children來聲明嵌套路由的規(guī)則
- 嵌套路由規(guī)則中的path不能以/開頭,訪問需使用/father/son的形式
// router/index.js { path: '/father', name: 'father', component: () => import('@/views/father.vue'), // 嵌套路由 children: [ { path: 'son', // path 前面不要加 / name: 'son', component: () => import('@/views/son.vue') }, ] } // father.vue 頁面 <template> <div class="school"> 我是 father 頁面: <router-link to="/father/son">子頁面</router-link> <hr> <!-- 該組件中自己的路由視圖 --> <router-view /> </div> </template>
五、聲明式和編程式導(dǎo)航
聲明式 | 編程式 | 描述 |
---|---|---|
< router-link :to=“…”> | router.push(…) | 會(huì)向history棧添加一個(gè)新的記錄,所以,當(dāng)用戶點(diǎn)擊瀏覽器后退按鈕時(shí),會(huì)回到之前的URL |
1、聲明式導(dǎo)航
很多時(shí)候,我們需要將給定匹配模式的路由映射到同一個(gè)組件,例如:想渲染不同博客的內(nèi)容,其>實(shí)只是渲染到同一個(gè)組件上,只是博客的編號(hào)不同而已在Vue Router中,可以在路徑中使用一個(gè)動(dòng)態(tài)字段來實(shí)現(xiàn),我們稱之為“路徑參數(shù)” ,語法如:path: ‘/url/:param’在展示的組件中訪問路徑參數(shù)
3.1. 在選項(xiàng)式 APIJS中采用this. r o u t e . p a r a m s 來訪問,試圖模板上采用 route.params來訪問,試圖模板上采用 route.params來訪問,試圖模板上采用route.params來訪問
3.2. 在組合式 API 中,需要import { useRoute } from ‘vue-router’,JS和視圖模板上通過useRoute().params來訪問
3.3. 還可以通過在路由規(guī)則上添加props: true,將路由參數(shù)傳遞給組件的props中
// router/index.js { path: '/father', name: 'father', component: () => import('@/views/father.vue'), // 嵌套路由 children: [ { path: 'son/:id', // path 前面不要加 / (路徑傳參) name: 'son', component: () => import('@/views/son.vue'), props: true // 將路徑參數(shù)傳遞到展示組件的 props 中 }, ] } // father.vue <template> <div class="school"> 我是 father 頁面: <router-link to="/father/son">子頁面</router-link> <hr> <!-- 該組件中自己的路由視圖 --> <router-view /> </div> </template> // son.vue 選項(xiàng)式 <script> export default { // 通過 props 來接收路徑參數(shù) props: { id: String }, methods: { showRouteParams() { // 通過 `this.$route.params` 獲取路徑參數(shù) console.log(this.$route.params) // 取出指定的路徑參數(shù) console.log(this.$route.params.id) // 輸出 props 中得到的路徑參數(shù) console.log("輸出 props 中得到的路徑參數(shù):" + this.id) } } } </script> <template> <div class="math"> 我是 BlogContent 頁面 <ul> <li>通過 `this.$route.params` 獲取路徑參數(shù) -- {{ $route.params }}</li> <li>取出指定的路徑參數(shù) -- {{ $route.params.id }}</li> <li>輸出 props 中得到的路徑參數(shù) id -- {{ id }}</li> </ul> <button @click="showRouteParams">在 JS 中訪問路徑參數(shù)</button> </div> </template> // son.vue 組合式 <script setup> import { useRoute } from 'vue-router' // 通過 props 來接收路徑參數(shù) let propsData = defineProps({ id: String }) // 獲取路由跳轉(zhuǎn)對(duì)象 let route = useRoute() function showRouteParams() { console.log(route.params) // 通過 `route` 獲取路徑參數(shù) console.log(route.params.id) // 取出指定的路徑參數(shù) console.log("輸出 props 中得到的路徑參數(shù):" + propsData.id) } </script> <template> <div class="math"> 我是 BlogContent 頁面 <ul> <li>通過 `route` 獲取路徑參數(shù) -- {{ route.params }}</li> <li>取出指定的路徑參數(shù):{{ route.params.id }}</li> <li>輸出 props 中得到的路徑參數(shù) id -- {{ id }}</li> </ul> <button @click="showRouteParams">在 JS 中訪問路徑參數(shù)</button> </div> </template>
2、編程式導(dǎo)航
提示:編程式的router.push(…)的語法
其的參數(shù)可以是一個(gè)字符串路徑,或者一個(gè)描述地址的對(duì)象如果參數(shù)是描述地址的對(duì)象的話,其對(duì)象中path和params不能同時(shí)使用
// 編程式導(dǎo)航 const username = 'eduardo' // 我們可以手動(dòng)建立 url,但我們必須自己處理編碼 router.push(`/user/${username}`) // -> /user/eduardo // 同樣 router.push({ path: `/user/${username}` }) // -> /user/eduardo // 如果可能的話,使用 `name` 和 `params` 從自動(dòng) URL 編碼中獲益(params名必須和 router規(guī)則中的名一致) router.push({ name: 'user', params: { username } }) // -> /user/eduardo // `params` 不能與 `path` 一起使用 router.push({ path: '/user', params: { username } }) // -> /user
3、替換當(dāng)前位置
聲明式 | 編程式 | 描述 |
---|---|---|
< router-link :to=“…” replace> | router.replace(…) | 它的作用類似于router.push(…),唯一不同的是,它在導(dǎo)航時(shí)不會(huì)向history添加新記錄,正如它的名字所暗示的那樣,它取代了當(dāng)前的條目 |
提示:也可以直接在傳遞給router.push的routeLocation中增加一個(gè)屬性replace: true
router.push({ path: '/home', replace: true }) // 相當(dāng)于 router.replace({ path: '/home' })
4、路由歷史
router.go(n) 該方法采用一個(gè)整數(shù)作為參數(shù),表示在歷史堆棧中前進(jìn)或后退多少步,類似于 window.history.go(n)
// 向前移動(dòng)一條記錄,與 router.forward() 相同 router.go(1) // 返回一條記錄,與 router.back() 相同 router.go(-1) // 前進(jìn) 3 條記錄 router.go(3) // 如果沒有那么多記錄,靜默失敗 router.go(-100) router.go(100)
總結(jié):
到此這篇關(guān)于Vue3 中路由Vue Router 的使用的文章就介紹到這了,更多相關(guān)Vue3 路由Vue Router使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Vue在封裝了Axios后手動(dòng)刷新頁面攔截器無效的問題
這篇文章主要介紹了解決VUE在封裝了Axios后手動(dòng)刷新頁面攔截器無效的問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11vue v-for循環(huán)重復(fù)數(shù)據(jù)無法添加問題解決方法【加track-by=''索引''】
這篇文章主要介紹了vue v-for循環(huán)重復(fù)數(shù)據(jù)無法添加問題解決方法,結(jié)合實(shí)例形式分析了vue.js通過在v-for循環(huán)中添加track-by='索引'解決重復(fù)數(shù)據(jù)無法添加問題相關(guān)操作技巧,需要的朋友可以參考下2019-03-03vue中promise的使用及異步請(qǐng)求數(shù)據(jù)的方法
這篇文章主要介紹了vue中promise的使用及異步請(qǐng)求數(shù)據(jù)的方法,文章給大家較詳細(xì)的介紹了遇到的問題及解決方法,需要的朋友可以參考下2018-11-11解決antd 表單設(shè)置默認(rèn)值initialValue后驗(yàn)證失效的問題
這篇文章主要介紹了解決antd 表單設(shè)置默認(rèn)值initialValue后驗(yàn)證失效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11通用vue組件化展示列表數(shù)據(jù)實(shí)例詳解
組件化開發(fā)能大幅提高應(yīng)用的開發(fā)效率、測(cè)試性、復(fù)用性等,下面這篇文章主要給大家介紹了關(guān)于通用vue組件化展示列表數(shù)據(jù)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06