【VUE基礎】VUE3第七節—Vue Router路由基礎

Vue Router 是 Vue 官方的客戶端路由解決方案。

客戶端路由的作用是在單頁應用 (SPA) 中將瀏覽器的 URL 和用戶看到的內容綁定起來。當用戶在應用中瀏覽不同頁面時,URL 會隨之更新,但頁面不需要從服務器重新加載。

Vue Router 基于 Vue 的組件系統構建,你可以通過配置路由來告訴 Vue Router 為每個 URL 路徑顯示哪些組件。

訪問路徑 ======> 組件

安裝Vue Router

npm install vue-router
yarn add vue-router
pnpm add vue-router

在這里插入圖片描述
在package.json文件中顯示vue-router版本代表安裝成功
在這里插入圖片描述

Vue Router使用

路由配置文件如下:

//引入創建路由
import { createRouter, createWebHistory } from "vue-router";
//引入組件
import Home from "@/components/Home.vue";
import Poclist from "@/components/Poclist.vue";
import Portscan from "@/components/Portscan.vue";//創建路由
const router = createRouter({history: createWebHistory(),routes: [{path: "/home",component: Home,},{path:"/poclist",component:Poclist},{path:"/portscan",component:Portscan}]
});export default router

注冊路由器插件
一旦創建了我們的路由器實例,我們就需要將其注冊為插件,這一步驟可以通過調用 use() 來完成。

main.ts文件

import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'createApp(App).use(router).mount('#app')

或等價于:

import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'const app = createApp(App)app.use(router)
app.mount('#app')

和大多數的 Vue 插件一樣,use() 需要在 mount() 之前調用。

APP.vue

<template><div class="app"><h3 class="title">Vue路由測試</h3><!-- 導航區 --><div class="navigate"><RouterLink to="/home" active-class="active">首頁</RouterLink><RouterLink to="/portscan" active-class="active">端口掃描</RouterLink><RouterLink to="/poclist" active-class="active">POC列表</RouterLink></div><!-- 展示區 --><div class="main-content"><RouterView></RouterView></div></div>
</template><script lang="ts" setup name="APP">
</script>

效果如下:
在這里插入圖片描述

  1. 路由組件通常存放在pagesviews文件夾,一般組件通常存放在components文件夾。

  2. 通過點擊導航,視覺效果上“消失” 了的路由組件,默認是被卸載掉的,需要的時候再去掛載
    在這里插入圖片描述

不同的歷史模式

在創建路由器實例時,history 配置允許我們在不同的歷史模式中進行選擇。
共支持 HASH模式、Memory 模式、HTML5 模式

Hash 模式

hash 模式是用 createWebHashHistory() 創建的:

import { createRouter, createWebHashHistory } from 'vue-router'const router = createRouter({history: createWebHashHistory(),routes: [//...],
})

它在內部傳遞的實際 URL 之前使用了一個哈希字符(#)。由于這部分 URL 從未被發送到服務器,所以它不需要在服務器層面上進行任何特殊處理。不過,它在 SEO 中確實有不好的影響。如果你擔心這個問題,可以使用 HTML5 模式。

例如:

http://127.0.0.1:4000/#/index

Memory 模式

Memory 模式不會假定自己處于瀏覽器環境,因此不會與 URL 交互也不會自動觸發初始導航。這使得它非常適合 Node 環境和 SSR。它是用 createMemoryHistory() 創建的,并且需要你在調用 app.use(router) 之后手動 push 到初始導航。

import { createRouter, createMemoryHistory } from 'vue-router'
const router = createRouter({history: createMemoryHistory(),routes: [//...],
})

雖然不推薦,你仍可以在瀏覽器應用程序中使用此模式,但請注意它不會有歷史記錄,這意味著你無法后退或前進。

HTML5 模式(推薦)

用 createWebHistory() 創建 HTML5 模式,推薦使用這個模式:

import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(),routes: [//...],
})

當使用這種歷史模式時,URL 會看起來很 “正常”,例如 https://example.com/user/id
不過,問題來了。由于我們的應用是一個單頁的客戶端應用,如果沒有適當的服務器配置,用戶在瀏覽器中直接訪問 https://example.com/user/id,就會得到一個 404 錯誤。這就尷尬了。

不用擔心: 要解決這個問題,你需要做的就是在你的服務器上添加一個簡單的回退路由。如果 URL 不匹配任何靜態資源,它應提供與你的應用程序中的 index.html 相同的頁面。
具體配置可以參考官網:

https://router.vuejs.org/zh/guide/essentials/history-mode.html
例如Nginx:

location / {try_files $uri $uri/ /index.html;
}

這有一個注意事項。你的服務器將不再報告 404 錯誤,因為現在所有未找到的路徑都會顯示你的 index.html 文件。為了解決這個問題,你應該在你的 Vue 應用程序中實現一個萬能的路由來顯示 404 頁面。

const router = createRouter({history: createWebHistory(),routes: [{ path: '/:pathMatch(.*)', component: NotFoundComponent }],
})

另外,如果你使用的是 Node.js 服務器,你可以通過在服務器端使用路由器來匹配傳入的 URL,如果沒有匹配到路由,則用 404 來響應,從而實現回退。

to的兩種寫法

<!-- 第一種:to的字符串寫法 -->
<router-link active-class="active" to="/home">主頁</router-link><!-- 第二種:to的對象寫法 -->
<router-link active-class="active" :to="{path:'/home'}">Home</router-link>

命名路由

當創建一個路由時,我們可以選擇給路由一個 name:
在這里插入圖片描述
然后我們可以使用 name 而不是 path 來傳遞 to 屬性給 :

<router-link :to="{ name: 'profile', params: { username: 'erina' } }">User profile
</router-link>

所有路由的命名都必須是唯一的。如果為多條路由添加相同的命名,路由器只會保留最后那一條。

嵌套路由

一些應用程序的 UI 由多層嵌套的組件組成。在這種情況下,URL 的片段通常對應于特定的嵌套組件結構,例如:

/user/johnny/profile                   /user/johnny/posts 
┌──────────────────┐                  ┌──────────────────┐
│ User             │                  │ User             │
│ ┌──────────────┐ │                  │ ┌──────────────┐ │
│ │ Profile      │ │  ●────────────?  │ │ Posts        │ │
│ │              │ │                  │ │              │ │
│ └──────────────┘ │                  │ └──────────────┘ │
└──────────────────┘                  └──────────────────┘

通過 Vue Router,你可以使用嵌套路由配置來表達這種關系。
在這里插入圖片描述

children 配置只是另一個路由數組,就像 routes 本身一樣,所以支持不斷地嵌套
當你訪問不存在的路由時,例如/pocinfo/111,會顯示空白。,因為沒有匹配到嵌套路由。也許你確實想在那里渲染一些東西。在這種情況下,你可以提供一個空的嵌套路徑:
在這里插入圖片描述
在這里插入圖片描述
嵌套路由也支持命名
可通過瀏覽器插件查看
在這里插入圖片描述

路由傳遞參數

query參數

傳遞參數

<!-- 跳轉并攜帶query參數(to的字符串寫法) -->
<router-link to="/news/detail?a=1&b=2&content=歡迎你">跳轉
</router-link><!-- 跳轉并攜帶query參數(to的對象寫法) -->
<RouterLink :to="{//name:'xiang', //用name也可以跳轉path:'/news/detail',query:{id:news.id,title:news.title,content:news.content}}"
>{{news.title}}
</RouterLink>

接收參數:

import {useRoute} from 'vue-router'
const route = useRoute()
// 打印query參數
console.log(route.query)

params參數

傳遞參數

<!-- 跳轉并攜帶params參數(to的字符串寫法) -->
<RouterLink :to="`/news/detail/001/新聞001/內容001`">{{news.title}}</RouterLink><!-- 跳轉并攜帶params參數(to的對象寫法) -->
<RouterLink :to="{name:'xiang', //用name跳轉params:{id:news.id,title:news.title,content:news.title}}"
>{{news.title}}
</RouterLink>

接收參數

import {useRoute} from 'vue-router'
const route = useRoute()
// 打印params參數
console.log(route.params)

備注1:傳遞params參數時,若使用to的對象寫法,必須使用name配置項,不能用path

備注2:傳遞params參數時,需要提前在規則中占位。

路由規則的props配置

布爾模式

當 props 設置為 true 時,route.params 將被設置為組件的 props。

const routes = [{name: "poclist",path: "/poclist",component: Poclist,children:[{name:"pocinfo",path:"pocinfo",component:Pocinfo,props:true}
]

Poclist.vue

 <RouterLink :to="{name: 'pocinfo',params:{id: pocs.id,title: pocs.title,content: pocs.content}}">{{ pocs.title }}</RouterLink>

Pocinfio.vue

<template><ul class="news-list"><li>編號:{{ id }}</li><li>標題:{{ title }}</li><li>內容:{{ content }}</li></ul>
</template><script setup lang='ts'>
// import { ref,reactive,toRefs} from 'vue'// import { RouterView,useRoute } from 'vue-router'defineProps(["id","title","content"])

在這里插入圖片描述

replace屬性

  1. 作用:控制路由跳轉時操作瀏覽器歷史記錄的模式。

  2. 瀏覽器的歷史記錄有兩種寫入方式:分別為pushreplace

    - ```push```是追加歷史記錄(默認值)。
    - `replace`是替換當前記錄。
    
  3. 開啟replace模式:

<RouterLink replace .......>News</RouterLink>

編程式導航

除了使用 創建 a 標簽來定義導航鏈接,我們還可以借助 router 的實例方法,通過編寫代碼來實現。

當你點擊 <router-link> 時,內部會調用這個方法,所以點擊 <router-link :to="..."> 相當于調用 router.push(...) :
該方法的參數可以是一個字符串路徑,或者一個描述地址的對象。例如:

// 字符串路徑
router.push('/users/eduardo')// 帶有路徑的對象
router.push({ path: '/users/eduardo' })// 命名的路由,并加上參數,讓路由建立 url
router.push({ name: 'user', params: { username: 'eduardo' } })// 帶查詢參數,結果是 /register?plan=private
router.push({ path: '/register', query: { plan: 'private' } })// 帶 hash,結果是 /about#team
router.push({ path: '/about', hash: '#team' })

注意:如果提供了 path,params 會被忽略,如需要使用params是,需要提供路由的name 或手寫完整的帶有參數的 path :

const username = 'eduardo'
// 我們可以手動建立 url,但我們必須自己處理編碼
router.push(`/user/${username}`) // -> /user/eduardo
// 同樣
router.push({ path: `/user/${username}` }) // -> /user/eduardo
// 如果可能的話,使用 `name` 和 `params` 從自動 URL 編碼中獲益
router.push({ name: 'user', params: { username } }) // -> /user/eduardo
// `params` 不能與 `path` 一起使用
router.push({ path: '/user', params: { username } }) // -> /user

替換當前位置

它的作用類似于 router.push,唯一不同的是,它在導航時不會向 history 添加新記錄,正如它的名字所暗示的那樣——它取代了當前的條目。
在這里插入圖片描述
也可以直接在傳遞給 router.push 的 to 參數中增加一個屬性 replace: true :

router.push({ path: '/home', replace: true })
// 相當于
router.replace({ path: '/home' })

重定向

重定向也是通過 routes 配置來完成,下面例子是從/ 重定向到 /home:

{path:'/',redirect:'/home'
}

在這里插入圖片描述

別名

重定向是指當用戶訪問 /home 時,URL 會被 / 替換,然后匹配成 /。那么什么是別名呢?

將 / 別名為 /home,意味著當用戶訪問 /home 時,URL 仍然是 /home,但會被匹配為用戶正在訪問 /。

上面對應的路由配置為:

const routes = [{ path: '/', component: Homepage, alias: '/home' }]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43260.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LabVIEW在半導體自動化測試中的應用

半導體制造的復雜性和精密度要求極高&#xff0c;每一個生產步驟都需要嚴格的控制和監測。自動化測試設備在半導體制造中起到了關鍵作用&#xff0c;通過精密測量和數據分析&#xff0c;確保產品質量和生產效率。本文介紹如何使用LabVIEW結合研華硬件&#xff0c;開發一個用于半…

C語言編程3:運算符,運算符的基本用法

C語言3&#x1f525;&#xff1a;運算符&#xff0c;運算符的基本用法 一、運算符&#x1f33f; &#x1f387;1.1 定義 運算符是指進行運算的動作&#xff0c;比如加法運算符"“&#xff0c;減法運算符”-" 算子是指參與運算的值&#xff0c;這個值可能是常數&a…

自動化測試高級控件交互方法:TouchAction、觸屏操作、點按,雙擊,滑動,手勢解鎖!

在自動化測試領域中&#xff0c;TouchAction 是一種非常強大的工具&#xff0c;它允許我們模擬用戶在設備屏幕上的各種觸摸事件。這種模擬不僅限于簡單的點擊操作&#xff0c;還包括滑動、長按、多點觸控等復雜的手勢。 點按與雙擊 點按和雙擊是觸屏設備上最基本的操作之一。…

使用 Qt 和 ECharts 進行數據可視化

文章目錄 示例圖表預覽折線圖散點圖柱狀圖使用 Qt 和 ECharts 進行數據可視化一、準備工作1. 安裝 Qt2. 準備 ECharts二、在 Qt 中使用 ECharts1. 創建 Qt 項目2. 配置項目文件3. 在 UI 中添加 WebEngineView4. 加載 ECharts三、創建折線圖、散點圖和柱狀圖1. 折線圖2. 散點圖3…

Jupyter Notebook的安裝教程

以下是一個詳細的 Jupyter Notebook 安裝教程&#xff0c;適用于大多數操作系統&#xff1a; Windows 系統 1. 安裝 Python 訪問 Python 官網&#xff0c;下載并安裝適合你系統的 Python 版本。在安裝過程中&#xff0c;確保勾選“Add Python 3.x to PATH”選項&#xff0c;…

sizeof跟strlen的用法及差異

sizeof是一個操作符&#xff0c;不是函數&#xff1b; 而strlen是一個庫函數&#xff1b; sizeof是計算所占內存空間的&#xff0c;不管你內容是什么&#xff0c;只要知道占多少內存&#xff0c; 而strlen是跟內容有關的&#xff0c;它是計算字符串長度的&#xff08;字符數…

java —— tomcat 部署項目

一、通過 war 包部署 1、將項目導出為 war 包&#xff1b; 2、將 war 包放置在 tomcat 目錄下的 webapps 文件夾下&#xff0c;該 war 包稍時便自動解析為項目文件夾&#xff1b; 3、啟動 tomcat 的 /bin 目錄下的 startup.bat 文件&#xff0c;此時即可從瀏覽器訪問項目首頁…

diff 算法原理及實現

Diff 算法是用于比較兩個虛擬 DOM 樹的差異&#xff0c;并以最小的操作代價將舊的 DOM 樹更新為新的 DOM 樹的一種算法。 Diff 算法的高效實現對于提高前端應用的性能和用戶體驗至關重要&#xff0c;尤其是在頻繁更新組件狀態導致 DOM 頻繁更新的情況下。 1. 原理 1.1 樹層級…

【Linux】文件內容查看命令——cat,tac,more,less,head,tail,od

如果我們要查看一個文件的內容時&#xff0c;該如何是好&#xff1f; 這里有相當多有趣的命令可以來分享一下&#xff1a;最常使用的顯示文件內容的命令可以說是cat與more及less了。 此外&#xff0c;如果我們要查看一個很大的文件&#xff08;好幾百MB時)&#xff0c;但是我們…

java中Comparator函數的用法實例?

在Java中&#xff0c;Comparator接口用于比較兩個對象的順序&#xff0c;常用于集合的排序。自Java 8開始&#xff0c;Comparator接口得到了增強&#xff0c;提供了許多默認方法&#xff0c;使得排序邏輯更加靈活和強大。下面將通過幾個實例來展示Comparator的用法。 示例1&am…

使用PyTorch設計卷積神經網絡(CNN)來處理遙感圖像Indian Pines數據集

目錄 使用PyTorch設計卷積神經網絡&#xff08;CNN&#xff09;來處理遙感圖像Indian Pines數據集&#xff0c;以下是設計和實現這些網絡的步驟&#xff1a; 1.數據準備&#xff1a; 1.1 首先&#xff0c;需要加載Indian Pines數據集。 1.2 將數據集轉換為PyTorch張量&#x…

LLM推理引擎怎么選?TensorRT vs vLLM vs LMDeploy vs MLC-LLM

LLM擅長文本生成應用程序&#xff0c;如聊天和代碼完成模型&#xff0c;能夠高度理解和流暢。但是它們的大尺寸也給推理帶來了挑戰。有很多個框架和包可以優化LLM推理和服務&#xff0c;所以在本文中我將整理一些常用的推理引擎并進行比較。 TensorRT-LLM TensorRT-LLM是NV發布…

imazing電腦怎么下載 imazing怎么下載軟件 使用iMazing下載和卸載Apple設備上的應用程序

iMazing官方版是一款管理蘋果設備的軟件&#xff0c;是一款幫助用戶管理 iOS手機的PC端應用程序&#xff0c;能力遠超 iTunes 提供的終極 iOS 設備管理器。在iMazing官方版上與蘋果設備連接后&#xff0c;可以輕松傳輸文件&#xff0c;瀏覽保存信息等&#xff0c;功能比iTunes更…

泛微開發修煉之旅--35關于基于頁面擴展和自定義按鈕實現與后端交互調用的方法

文章鏈接&#xff1a;35關于基于頁面擴展和自定義按鈕實現與后端交互調用的方法

vue3中使用 tilwindcss報錯 Unknown at rule @tailwindcss

解決方法&#xff1a; vscode中安裝插件 Tailwind CSS IntelliSense 在項目中的 .vscode中 settings.json添加 "files.associations": {"*.css": "tailwindcss"}

基于YOLOv9的腦腫瘤區域檢測

數據集 腦腫瘤區域檢測&#xff0c;我們直接采用kaggle公開數據集&#xff0c;Br35H 數據中已對醫學圖像中腦腫瘤位置進行標注 數據集我已經按照YOLO格式配置好&#xff0c;數據內容如下 數據集中共包含700張圖像&#xff0c;其中訓練集500張&#xff0c;驗證集200張 模型訓…

Perl語言入門到高級學習

Perl語言介紹 Perl,全稱為Practical Extraction and Report Language,即“實用報表提取語言”,是一種高級、通用、直譯式、動態的編程語言。Perl最初由Larry Wall設計,并于1987年12月18日首次發布。經過多年的不斷發展和更新,Perl已經成為一種功能豐富且應用廣泛的計算機程…

AI繪畫:藝術與科技的交融,創新浪潮與無限可能

在科技日新月異的當下&#xff0c;AI 繪畫作為人工智能領域的一顆璀璨新星&#xff0c;正以驚人的速度在國內嶄露頭角&#xff0c;引發了藝術與技術交融的全新變革。隨著人工智能技術的飛速發展&#xff0c;AI繪畫已成為藝術與科技交融的新寵。2024年&#xff0c;AI繪畫行業在國…

昇思MindSpore學習筆記2-03 LLM原理和實踐--基于MindSpore通過GPT實現情感分類

摘要&#xff1a; 昇思MindSpore AI框架中使用openai-gpt的方法、步驟。 沒調通&#xff0c;存疑。 一、環境配置 %%capture captured_output # 實驗環境已經預裝了mindspore2.2.14&#xff0c;如需更換mindspore版本&#xff0c;可更改下面mindspore的版本號 !pip uninsta…

Autogen智能體實戰-Autogen框架介紹

文章目錄 一&#xff0c;Autogen簡介二&#xff0c;Autogen原理1&#xff0c;Autogen原理圖解2&#xff0c;拆解Autogen是如何完成繪制特斯拉股票趨勢圖的 這篇文章介紹一個開源的Agent框架-微軟的Autogen。 一&#xff0c;Autogen簡介 官網:https://microsoft.github.io/aut…