Uni-app + Vue3 頁面如何跳轉及傳參?
Vue 項目往往需要使用 vue-router 插件,剛開始入門 Uni-app + Vue3 項目的同學,會不會想著路由使用 vue-router V4 版本不就可以了嗎?
不怕大家笑話,我就是這樣想的,畢竟我是第一次使用 Uni-app ,由于孕期記性賊差,所以我決定寫成筆記,加深記憶。
uni-app 頁面路由為框架統一管理的,我們需要在 page.json 文件里配置每個頁面路由以及頁面樣式,有些類似小程序中的 app.json 文件,所以 uni-app 的路由用法和寫法與 vue-router 不同。
項目初始化完成,對應的 page.json 文件為:
{"pages": [ //pages數組中第一項表示應用啟動頁,參考:https://uniapp.dcloud.io/collocation/pages{"path": "pages/index/index","style": {"navigationBarTitleText": "uni-app"}}],"globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "uni-app","navigationBarBackgroundColor": "#F8F8F8","backgroundColor": "#F8F8F8"}}
pages 屬性
uni-app 通過 pages 節點配置應用都有哪些頁面,接收一個數組,每個元素都是一個對象,屬性有:
屬性 | 類型 | 默認值 | 描述 |
path | String | 配置頁面路徑 | |
style | Object | 配置面狀態欄、導航欄、標題、窗口背景色 |
- pages 節點的第一項為應用入口頁(即首頁)。
- 應用中新增/減少頁面,都需要對 pages 數組進行修改。
- 文件名不需要寫后綴,框架會自動尋找路徑下的頁面資源。
頁面跳轉
uni-app 頁面路由跳轉有兩種方式:使用 navigator 組件跳轉、調用API 跳轉。
1、navigator組件跳轉
類似于 a 標簽,但是只能跳轉到本地頁面,目標頁面必須在 page.json 中注冊。
<navigator url="/pages/animation-major/index" open-type="navigate"><el-button type="primary">查詢</el-button></navigator>
navigator 屬性有:
屬性名 | 類型 | 默認值 | 說明 | 平臺差異說明 |
url | String | 應用內的跳轉鏈接,值為相對路徑或絕對路徑,如:"../first/first","/pages/first/first",注意不能加 .vue 后綴 | ||
open-type | String | navigate | 跳轉方式 | |
delta | Number | 當 open-type 為 'navigateBack' 時有效,表示回退的層數 | ||
animation-type | String | pop-in/out | 當 open-type 為 navigate、navigateBack 時有效,窗口的顯示/關閉動畫效果,詳見:窗口動畫 | App |
animation-duration | Number | 300 | 當 open-type 為 navigate、navigateBack 時有效,窗口顯示/關閉動畫的持續時間。 | App |
hover-class | String | navigator-hover | 指定點擊時的樣式類,當hover-class="none"時,沒有點擊態效果 | |
hover-stop-propagation | Boolean | false | 指定是否阻止本節點的祖先節點出現點擊態 | 微信小程序 |
hover-start-time | Number | 50 | 按住后多久出現點擊態,單位毫秒 | |
hover-stay-time | Number | 600 | 手指松開后點擊態保留時間,單位毫秒 | |
target | String | self | 在哪個小程序目標上發生跳轉,默認當前小程序,值域self/miniProgram | 微信2.0.7+、百度2.5.2+、QQ |
open-type 有效值
值 | 說明 | 平臺差異說明 |
navigate | 對應 uni.navigateTo 的功能 | |
redirect | 對應 uni.redirectTo 的功能 | |
switchTab | 對應 uni.switchTab 的功能 | |
reLaunch | 對應 uni.reLaunch 的功能 | 字節跳動小程序與飛書小程序不支持 |
navigateBack | 對應 uni.navigateBack 的功能 | |
exit | 退出小程序,target="miniProgram"時生效 | 微信2.1.0+、百度2.5.2+、QQ1.4.7+ |
2、uni-app API 跳轉
uni.navigateTo({url: "/pages/animation-major/index",})
使用 API 頁面跳轉方式有:
- uni.navigateTo: 保留當前頁面,跳轉到應用內的某個頁面,使用 navigateBack 可以返回到上一頁。
- uni.navigateBack:關閉當前頁面,返回上一級或多級頁面。delta 屬性設置返回層級,大于頁面數時返回首頁。
- uni.redirectTo:關閉當前頁面,跳轉到應用內的某個頁面。
- uni.reLaunch:關閉應用內所有頁面,打開應用內某個頁面。
- uni.switchTab:跳轉到 tabBar 頁面,關閉其他非 tabBar 頁面。
- uni.preloaPage:預加載頁面,是一種性能優化技術,被預載的頁面,在打開時速度更快。
頁面棧
框架以棧的形式管理當前所有頁面, 當發生路由切換的時候,頁面棧的表現如下:
路由方式 | 頁面棧表現 | 觸發時機 |
初始化 | 新頁面入棧 | uni-app 打開的第一個頁面 |
打開新頁面 | 新頁面入棧 | 調用 API uni.navigateTo 、使用組件 <navigator open-type="navigate"/> |
頁面重定向 | 當前頁面出棧,新頁面入棧 | 調用 API uni.redirectTo 、使用組件 <navigator open-type="redirectTo"/> |
頁面返回 | 頁面不斷出棧,直到目標返回頁 | 調用 API uni.navigateBack 、使用組件 <navigator open-type="navigateBack"/> 、用戶按左上角返回按鈕、安卓用戶點擊物理back按鍵 |
Tab 切換 | 頁面全部出棧,只留下新的 Tab 頁面 | 調用 API uni.switchTab 、使用組件 <navigator open-type="switchTab"/> 、用戶切換 Tab |
重加載 | 頁面全部出棧,只留下新的頁面 | 調用 API uni.reLaunch 、使用組件 <navigator open-type="reLaunch"/> |
頁面傳參
方式1:onLoad 接收
// 跳轉uni.navigateTo({url: "/pages/sendManagement/index?id=123",})<script>import { onMounted } from 'vue';let parmes = null;export default {onLoad(options){parmes = options;},setup() {onMounted(() => {console.log('接受上個頁面傳的值',parmes)})}}</script>
方式2:setup語法糖接收
<script setup>import { onMounted, getCurrentInstance } from 'vue';onMounted(()=>{let options = getCurrentInstance()console.log("options--->",options.attrs);})</script>
onLoad 函數是監聽頁面加載,接收的參數是頁面傳遞的數據,是一個 object 類型。
看到這,相信很快就能上手 uni-app + vue3 項目路由嘍,也可以參考官網教程:
https://uniapp.dcloud.io/tutorial/page.html#%E8%B7%AF%E7%94%B1。